Changeset 47b7006 in mainline for uspace/lib/c/generic/async.c


Ignore:
Timestamp:
2011-01-29T23:02:39Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
197ef43
Parents:
fd483ce
Message:

improve run-time termination

  • get rid of exit()
  • get rid of _exit(), use the common exit()
  • get rid of core(), use the common abort()
  • make main() more fail-safe (call abort() on unhealthy conditions), call async_sess_init() explicitly
  • add several libc-private headers for cleaner environment
  • use SYS_TASK_EXIT in exit() and abort()
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/async.c

    rfd483ce r47b7006  
    4242 * You should be able to write very simple multithreaded programs, the async
    4343 * framework will automatically take care of most synchronization problems.
    44  *
    45  * Default semantics:
    46  * - async_send_*(): Send asynchronously. If the kernel refuses to send
    47  *                   more messages, [ try to get responses from kernel, if
    48  *                   nothing found, might try synchronous ]
    4944 *
    5045 * Example of use (pseudo C):
     
    127122
    128123/**
    129  * Structures of this type are used to group information about a call and a
    130  * message queue link.
     124 * Structures of this type are used to group information about
     125 * a call and about a message queue link.
    131126 */
    132127typedef struct {
     
    156151        /** Link to the client tracking structure. */
    157152        client_t *client;
    158 
     153       
    159154        /** Messages that should be delivered to this fibril. */
    160155        link_t msg_queue;
     
    173168
    174169/** Identifier of the incoming connection handled by the current fibril. */
    175 fibril_local connection_t *FIBRIL_connection;
     170static fibril_local connection_t *FIBRIL_connection;
    176171
    177172static void *default_client_data_constructor(void)
     
    202197{
    203198        assert(FIBRIL_connection);
    204 
    205199        return FIBRIL_connection->client->data;
    206200}
    207201
    208 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call);
    209 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call);
     202/** Default fibril function that gets called to handle new connection.
     203 *
     204 * This function is defined as a weak symbol - to be redefined in user code.
     205 *
     206 * @param callid Hash of the incoming call.
     207 * @param call   Data of the incoming call.
     208 *
     209 */
     210static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)
     211{
     212        ipc_answer_0(callid, ENOENT);
     213}
    210214
    211215/**
     
    213217 */
    214218static async_client_conn_t client_connection = default_client_connection;
     219
     220/** Default fibril function that gets called to handle interrupt notifications.
     221 *
     222 * This function is defined as a weak symbol - to be redefined in user code.
     223 *
     224 * @param callid Hash of the incoming call.
     225 * @param call   Data of the incoming call.
     226 *
     227 */
     228static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
     229{
     230}
    215231
    216232/**
     
    224240static LIST_INITIALIZE(timeout_list);
    225241
    226 #define CLIENT_HASH_TABLE_BUCKETS       32
    227 #define CONN_HASH_TABLE_BUCKETS         32
    228 
    229 static hash_index_t client_hash(unsigned long *key)
     242#define CLIENT_HASH_TABLE_BUCKETS  32
     243#define CONN_HASH_TABLE_BUCKETS    32
     244
     245static hash_index_t client_hash(unsigned long key[])
    230246{
    231247        assert(key);
    232         return (((*key) >> 4) % CLIENT_HASH_TABLE_BUCKETS);
     248        return (((key[0]) >> 4) % CLIENT_HASH_TABLE_BUCKETS);
    233249}
    234250
    235251static int client_compare(unsigned long key[], hash_count_t keys, link_t *item)
    236252{
    237         client_t *cl = hash_table_get_instance(item, client_t, link);
    238         return (key[0] == cl->in_task_hash);
     253        client_t *client = hash_table_get_instance(item, client_t, link);
     254        return (key[0] == client->in_task_hash);
    239255}
    240256
     
    257273 *
    258274 */
    259 static hash_index_t conn_hash(unsigned long *key)
     275static hash_index_t conn_hash(unsigned long key[])
    260276{
    261277        assert(key);
    262         return (((*key) >> 4) % CONN_HASH_TABLE_BUCKETS);
     278        return (((key[0]) >> 4) % CONN_HASH_TABLE_BUCKETS);
    263279}
    264280
     
    274290static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item)
    275291{
    276         connection_t *hs = hash_table_get_instance(item, connection_t, link);
    277         return (key[0] == hs->in_phone_hash);
     292        connection_t *conn = hash_table_get_instance(item, connection_t, link);
     293        return (key[0] == conn->in_phone_hash);
    278294}
    279295
     
    290306        free(hash_table_get_instance(item, connection_t, link));
    291307}
    292 
    293308
    294309/** Operations for the connection hash table. */
     
    311326        link_t *tmp = timeout_list.next;
    312327        while (tmp != &timeout_list) {
    313                 awaiter_t *cur;
    314                
    315                 cur = list_get_instance(tmp, awaiter_t, to_event.link);
     328                awaiter_t *cur
     329                    = list_get_instance(tmp, awaiter_t, to_event.link);
     330               
    316331                if (tv_gteq(&cur->to_event.expires, &wd->to_event.expires))
    317332                        break;
     333               
    318334                tmp = tmp->next;
    319335        }
     
    332348 *
    333349 * @return False if the call doesn't match any connection.
    334  *         True if the call was passed to the respective connection fibril.
     350 * @return True if the call was passed to the respective connection fibril.
    335351 *
    336352 */
     
    469485                         * the first IPC_M_PHONE_HUNGUP call and continues to
    470486                         * call async_get_call_timeout(). Repeat
    471                          * IPC_M_PHONE_HUNGUP until the caller notices. 
     487                         * IPC_M_PHONE_HUNGUP until the caller notices.
    472488                         */
    473489                        memset(call, 0, sizeof(ipc_call_t));
     
    476492                        return conn->close_callid;
    477493                }
    478 
     494               
    479495                if (usecs)
    480496                        async_insert_timeout(&conn->wdata);
     
    514530}
    515531
    516 /** Default fibril function that gets called to handle new connection.
    517  *
    518  * This function is defined as a weak symbol - to be redefined in user code.
    519  *
    520  * @param callid Hash of the incoming call.
    521  * @param call   Data of the incoming call.
    522  *
    523  */
    524 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)
    525 {
    526         ipc_answer_0(callid, ENOENT);
    527 }
    528 
    529 /** Default fibril function that gets called to handle interrupt notifications.
    530  *
    531  * This function is defined as a weak symbol - to be redefined in user code.
    532  *
    533  * @param callid Hash of the incoming call.
    534  * @param call   Data of the incoming call.
    535  *
    536  */
    537 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
    538 {
    539 }
    540 
    541532/** Wrapper for client connection fibril.
    542533 *
     
    551542static int connection_fibril(void *arg)
    552543{
    553         unsigned long key;
    554         client_t *cl;
    555         link_t *lnk;
    556         bool destroy = false;
    557 
    558544        /*
    559545         * Setup fibril-local connection pointer.
    560546         */
    561547        FIBRIL_connection = (connection_t *) arg;
    562 
     548       
     549        futex_down(&async_futex);
     550       
    563551        /*
    564552         * Add our reference for the current connection in the client task
     
    566554         * hash in a new tracking structure.
    567555         */
    568         futex_down(&async_futex);
    569         key = FIBRIL_connection->in_task_hash;
    570         lnk = hash_table_find(&client_hash_table, &key);
     556       
     557        unsigned long key = FIBRIL_connection->in_task_hash;
     558        link_t *lnk = hash_table_find(&client_hash_table, &key);
     559       
     560        client_t *client;
     561       
    571562        if (lnk) {
    572                 cl = hash_table_get_instance(lnk, client_t, link);
    573                 cl->refcnt++;
     563                client = hash_table_get_instance(lnk, client_t, link);
     564                client->refcnt++;
    574565        } else {
    575                 cl = malloc(sizeof(client_t));
    576                 if (!cl) {
     566                client = malloc(sizeof(client_t));
     567                if (!client) {
    577568                        ipc_answer_0(FIBRIL_connection->callid, ENOMEM);
    578569                        futex_up(&async_futex);
    579570                        return 0;
    580571                }
    581                 cl->in_task_hash = FIBRIL_connection->in_task_hash;
     572               
     573                client->in_task_hash = FIBRIL_connection->in_task_hash;
     574               
    582575                async_serialize_start();
    583                 cl->data = async_client_data_create();
     576                client->data = async_client_data_create();
    584577                async_serialize_end();
    585                 cl->refcnt = 1;
    586                 hash_table_insert(&client_hash_table, &key, &cl->link);
    587         }
     578               
     579                client->refcnt = 1;
     580                hash_table_insert(&client_hash_table, &key, &client->link);
     581        }
     582       
    588583        futex_up(&async_futex);
    589 
    590         FIBRIL_connection->client = cl;
    591 
     584       
     585        FIBRIL_connection->client = client;
     586       
    592587        /*
    593588         * Call the connection handler function.
     
    599594         * Remove the reference for this client task connection.
    600595         */
     596        bool destroy;
     597       
    601598        futex_down(&async_futex);
    602         if (--cl->refcnt == 0) {
     599       
     600        if (--client->refcnt == 0) {
    603601                hash_table_remove(&client_hash_table, &key, 1);
    604602                destroy = true;
    605         }
     603        } else
     604                destroy = false;
     605       
    606606        futex_up(&async_futex);
    607 
     607       
    608608        if (destroy) {
    609                 if (cl->data)
    610                         async_client_data_destroy(cl->data);
    611                 free(cl);
    612         }
    613 
     609                if (client->data)
     610                        async_client_data_destroy(client->data);
     611               
     612                free(client);
     613        }
     614       
    614615        /*
    615616         * Remove myself from the connection hash table.
     
    624625         */
    625626        while (!list_empty(&FIBRIL_connection->msg_queue)) {
    626                 msg_t *msg;
    627                
    628                 msg = list_get_instance(FIBRIL_connection->msg_queue.next,
    629                     msg_t, link);
     627                msg_t *msg =
     628                    list_get_instance(FIBRIL_connection->msg_queue.next, msg_t,
     629                    link);
     630               
    630631                list_remove(&msg->link);
    631632                ipc_answer_0(msg->callid, EHANGUP);
     
    670671                if (callid)
    671672                        ipc_answer_0(callid, ENOMEM);
     673               
    672674                return (uintptr_t) NULL;
    673675        }
     
    717719static void handle_call(ipc_callid_t callid, ipc_call_t *call)
    718720{
    719         /* Unrouted call - do some default behaviour */
     721        /* Unrouted call - take some default action */
    720722        if ((callid & IPC_CALLID_NOTIFICATION)) {
    721723                process_notification(callid, call);
    722                 goto out;
     724                return;
    723725        }
    724726       
     
    726728        case IPC_M_CONNECT_ME:
    727729        case IPC_M_CONNECT_ME_TO:
    728                 /* Open new connection with fibril etc. */
     730                /* Open new connection with fibril, etc. */
    729731                async_new_connection(call->in_task_hash, IPC_GET_ARG5(*call),
    730732                    callid, call, client_connection);
    731                 goto out;
     733                return;
    732734        }
    733735       
    734736        /* Try to route the call through the connection hash table */
    735737        if (route_call(callid, call))
    736                 goto out;
     738                return;
    737739       
    738740        /* Unknown call from unknown phone - hang it up */
    739741        ipc_answer_0(callid, EHANGUP);
    740         return;
    741        
    742 out:
    743         ;
    744742}
    745743
     
    754752        link_t *cur = timeout_list.next;
    755753        while (cur != &timeout_list) {
    756                 awaiter_t *waiter;
    757                
    758                 waiter = list_get_instance(cur, awaiter_t, to_event.link);
     754                awaiter_t *waiter =
     755                    list_get_instance(cur, awaiter_t, to_event.link);
     756               
    759757                if (tv_gt(&waiter->to_event.expires, &tv))
    760758                        break;
    761 
     759               
    762760                cur = cur->next;
    763 
     761               
    764762                list_remove(&waiter->to_event.link);
    765763                waiter->to_event.inlist = false;
     
    788786        while (true) {
    789787                if (fibril_switch(FIBRIL_FROM_MANAGER)) {
    790                         futex_up(&async_futex); 
     788                        futex_up(&async_futex);
    791789                        /*
    792790                         * async_futex is always held when entering a manager
     
    811809                                continue;
    812810                        } else
    813                                 timeout = tv_sub(&waiter->to_event.expires,
    814                                     &tv);
     811                                timeout = tv_sub(&waiter->to_event.expires, &tv);
    815812                } else
    816813                        timeout = SYNCH_NO_TIMEOUT;
    817814               
    818815                futex_up(&async_futex);
    819 
     816               
    820817                atomic_inc(&threads_in_ipc_wait);
    821818               
     
    825822               
    826823                atomic_dec(&threads_in_ipc_wait);
    827 
     824               
    828825                if (!callid) {
    829826                        handle_expired_timeouts();
     
    875872/** Initialize the async framework.
    876873 *
    877  * @return Zero on success or an error code.
    878  */
    879 int __async_init(void)
     874 */
     875void __async_init(void)
    880876{
    881877        if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1,
    882             &client_hash_table_ops) || !hash_table_create(&conn_hash_table,
    883             CONN_HASH_TABLE_BUCKETS, 1, &conn_hash_table_ops)) {
    884                 return ENOMEM;
    885         }
    886 
    887         _async_sess_init();
    888        
    889         return 0;
     878            &client_hash_table_ops))
     879                abort();
     880       
     881        if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_BUCKETS, 1,
     882            &conn_hash_table_ops))
     883                abort();
    890884}
    891885
     
    900894 * @param retval Value returned in the answer.
    901895 * @param data   Call data of the answer.
     896 *
    902897 */
    903898static void reply_received(void *arg, int retval, ipc_call_t *data)
     
    947942    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr)
    948943{
    949         amsg_t *msg = malloc(sizeof(*msg));
     944        amsg_t *msg = malloc(sizeof(amsg_t));
    950945       
    951946        if (!msg)
     
    956951       
    957952        msg->wdata.to_event.inlist = false;
    958         /* We may sleep in the next method, but it will use its own mechanism */
     953       
     954        /*
     955         * We may sleep in the next method,
     956         * but it will use its own means
     957         */
    959958        msg->wdata.active = true;
    960959       
     
    987986    ipc_call_t *dataptr)
    988987{
    989         amsg_t *msg = malloc(sizeof(*msg));
     988        amsg_t *msg = malloc(sizeof(amsg_t));
    990989       
    991990        if (!msg)
     
    996995       
    997996        msg->wdata.to_event.inlist = false;
    998         /* We may sleep in next method, but it will use its own mechanism */
     997       
     998        /*
     999         * We may sleep in the next method,
     1000         * but it will use its own means
     1001         */
    9991002        msg->wdata.active = true;
    10001003       
     
    10951098void async_usleep(suseconds_t timeout)
    10961099{
    1097         amsg_t *msg = malloc(sizeof(*msg));
     1100        amsg_t *msg = malloc(sizeof(amsg_t));
    10981101       
    10991102        if (!msg)
     
    13071310}
    13081311
    1309 int async_forward_fast(ipc_callid_t callid, int phoneid, int imethod,
    1310     sysarg_t arg1, sysarg_t arg2, int mode)
     1312int async_forward_fast(ipc_callid_t callid, int phoneid, sysarg_t imethod,
     1313    sysarg_t arg1, sysarg_t arg2, unsigned int mode)
    13111314{
    13121315        return ipc_forward_fast(callid, phoneid, imethod, arg1, arg2, mode);
    13131316}
    13141317
    1315 int async_forward_slow(ipc_callid_t callid, int phoneid, int imethod,
     1318int async_forward_slow(ipc_callid_t callid, int phoneid, sysarg_t imethod,
    13161319    sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5,
    1317     int mode)
     1320    unsigned int mode)
    13181321{
    13191322        return ipc_forward_slow(callid, phoneid, imethod, arg1, arg2, arg3, arg4,
     
    14281431}
    14291432
    1430 /** Wrapper for making IPC_M_SHARE_IN calls using the async framework.
    1431  *
    1432  * @param phoneid       Phone that will be used to contact the receiving side.
    1433  * @param dst           Destination address space area base.
    1434  * @param size          Size of the destination address space area.
    1435  * @param arg           User defined argument.
    1436  * @param flags         Storage where the received flags will be stored. Can be
    1437  *                      NULL.
    1438  *
    1439  * @return              Zero on success or a negative error code from errno.h.
     1433/** Wrapper for IPC_M_SHARE_IN calls using the async framework.
     1434 *
     1435 * @param phoneid Phone that will be used to contact the receiving side.
     1436 * @param dst     Destination address space area base.
     1437 * @param size    Size of the destination address space area.
     1438 * @param arg     User defined argument.
     1439 * @param flags   Storage for the received flags. Can be NULL.
     1440 *
     1441 * @return Zero on success or a negative error code from errno.h.
     1442 *
    14401443 */
    14411444int async_share_in_start(int phoneid, void *dst, size_t size, sysarg_t arg,
    1442     int *flags)
    1443 {
    1444         int res;
     1445    unsigned int *flags)
     1446{
    14451447        sysarg_t tmp_flags;
    1446         res = async_req_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst,
     1448        int res = async_req_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst,
    14471449            (sysarg_t) size, arg, NULL, &tmp_flags);
     1450       
    14481451        if (flags)
    1449                 *flags = tmp_flags;
     1452                *flags = (unsigned int) tmp_flags;
     1453       
    14501454        return res;
    14511455}
     
    14531457/** Wrapper for receiving the IPC_M_SHARE_IN calls using the async framework.
    14541458 *
    1455  * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN calls
    1456  * so that the user doesn't have to remember the meaning of each IPC argument.
     1459 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN
     1460 * calls so that the user doesn't have to remember the meaning of each IPC
     1461 * argument.
    14571462 *
    14581463 * So far, this wrapper is to be used from within a connection fibril.
    14591464 *
    1460  * @param callid        Storage where the hash of the IPC_M_SHARE_IN call will
    1461  *                      be stored.
    1462  * @param size          Destination address space area size.   
    1463  *
    1464  * @return              Non-zero on success, zero on failure.
    1465  */
    1466 int async_share_in_receive(ipc_callid_t *callid, size_t *size)
    1467 {
    1468         ipc_call_t data;
    1469        
     1465 * @param callid Storage for the hash of the IPC_M_SHARE_IN call.
     1466 * @param size   Destination address space area size.
     1467 *
     1468 * @return True on success, false on failure.
     1469 *
     1470 */
     1471bool async_share_in_receive(ipc_callid_t *callid, size_t *size)
     1472{
    14701473        assert(callid);
    14711474        assert(size);
    1472 
     1475       
     1476        ipc_call_t data;
    14731477        *callid = async_get_call(&data);
     1478       
    14741479        if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_IN)
    1475                 return 0;
     1480                return false;
     1481       
    14761482        *size = (size_t) IPC_GET_ARG2(data);
    1477         return 1;
     1483        return true;
    14781484}
    14791485
    14801486/** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework.
    14811487 *
    1482  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls
    1483  * so that the user doesn't have to remember the meaning of each IPC argument.
    1484  *
    1485  * @param callid        Hash of the IPC_M_DATA_READ call to answer.
    1486  * @param src           Source address space base.
    1487  * @param flags         Flags to be used for sharing. Bits can be only cleared.
    1488  *
    1489  * @return              Zero on success or a value from @ref errno.h on failure.
    1490  */
    1491 int async_share_in_finalize(ipc_callid_t callid, void *src, int flags)
     1488 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ
     1489 * calls so that the user doesn't have to remember the meaning of each IPC
     1490 * argument.
     1491 *
     1492 * @param callid Hash of the IPC_M_DATA_READ call to answer.
     1493 * @param src    Source address space base.
     1494 * @param flags  Flags to be used for sharing. Bits can be only cleared.
     1495 *
     1496 * @return Zero on success or a value from @ref errno.h on failure.
     1497 *
     1498 */
     1499int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags)
    14921500{
    14931501        return ipc_share_in_finalize(callid, src, flags);
    14941502}
    14951503
    1496 /** Wrapper for making IPC_M_SHARE_OUT calls using the async framework.
    1497  *
    1498  * @param phoneid       Phone that will be used to contact the receiving side.
    1499  * @param src           Source address space area base address.
    1500  * @param flags         Flags to be used for sharing. Bits can be only cleared.
    1501  *
    1502  * @return              Zero on success or a negative error code from errno.h.
    1503  */
    1504 int async_share_out_start(int phoneid, void *src, int flags)
     1504/** Wrapper for IPC_M_SHARE_OUT calls using the async framework.
     1505 *
     1506 * @param phoneid Phone that will be used to contact the receiving side.
     1507 * @param src     Source address space area base address.
     1508 * @param flags   Flags to be used for sharing. Bits can be only cleared.
     1509 *
     1510 * @return Zero on success or a negative error code from errno.h.
     1511 *
     1512 */
     1513int async_share_out_start(int phoneid, void *src, unsigned int flags)
    15051514{
    15061515        return async_req_3_0(phoneid, IPC_M_SHARE_OUT, (sysarg_t) src, 0,
     
    15101519/** Wrapper for receiving the IPC_M_SHARE_OUT calls using the async framework.
    15111520 *
    1512  * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT calls
    1513  * so that the user doesn't have to remember the meaning of each IPC argument.
     1521 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT
     1522 * calls so that the user doesn't have to remember the meaning of each IPC
     1523 * argument.
    15141524 *
    15151525 * So far, this wrapper is to be used from within a connection fibril.
    15161526 *
    1517  * @param callid        Storage where the hash of the IPC_M_SHARE_OUT call will
    1518  *                      be stored.
    1519  * @param size          Storage where the source address space area size will be
    1520  *                      stored.
    1521  * @param flags         Storage where the sharing flags will be stored.
    1522  *
    1523  * @return              Non-zero on success, zero on failure.
    1524  */
    1525 int async_share_out_receive(ipc_callid_t *callid, size_t *size, int *flags)
    1526 {
    1527         ipc_call_t data;
    1528        
     1527 * @param callid Storage for the hash of the IPC_M_SHARE_OUT call.
     1528 * @param size   Storage for the source address space area size.
     1529 * @param flags  Storage for the sharing flags.
     1530 *
     1531 * @return True on success, false on failure.
     1532 *
     1533 */
     1534bool async_share_out_receive(ipc_callid_t *callid, size_t *size, unsigned int *flags)
     1535{
    15291536        assert(callid);
    15301537        assert(size);
    15311538        assert(flags);
    1532 
     1539       
     1540        ipc_call_t data;
    15331541        *callid = async_get_call(&data);
     1542       
    15341543        if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_OUT)
    1535                 return 0;
     1544                return false;
     1545       
    15361546        *size = (size_t) IPC_GET_ARG2(data);
    1537         *flags = (int) IPC_GET_ARG3(data);
    1538         return 1;
     1547        *flags = (unsigned int) IPC_GET_ARG3(data);
     1548        return true;
    15391549}
    15401550
    15411551/** Wrapper for answering the IPC_M_SHARE_OUT calls using the async framework.
    15421552 *
    1543  * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT calls
    1544  * so that the user doesn't have to remember the meaning of each IPC argument.
    1545  *
    1546  * @param callid        Hash of the IPC_M_DATA_WRITE call to answer.
    1547  * @param dst           Destination address space area base address.   
    1548  *
    1549  * @return              Zero on success or a value from @ref errno.h on failure.
     1553 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT
     1554 * calls so that the user doesn't have to remember the meaning of each IPC
     1555 * argument.
     1556 *
     1557 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.
     1558 * @param dst    Destination address space area base address.
     1559 *
     1560 * @return Zero on success or a value from @ref errno.h on failure.
     1561 *
    15501562 */
    15511563int async_share_out_finalize(ipc_callid_t callid, void *dst)
     
    15541566}
    15551567
    1556 
    1557 /** Wrapper for making IPC_M_DATA_READ calls using the async framework.
    1558  *
    1559  * @param phoneid       Phone that will be used to contact the receiving side.
    1560  * @param dst           Address of the beginning of the destination buffer.
    1561  * @param size          Size of the destination buffer.
    1562  *
    1563  * @return              Zero on success or a negative error code from errno.h.
     1568/** Wrapper for IPC_M_DATA_READ calls using the async framework.
     1569 *
     1570 * @param phoneid Phone that will be used to contact the receiving side.
     1571 * @param dst     Address of the beginning of the destination buffer.
     1572 * @param size    Size of the destination buffer.
     1573 *
     1574 * @return Zero on success or a negative error code from errno.h.
     1575 *
    15641576 */
    15651577int async_data_read_start(int phoneid, void *dst, size_t size)
     
    15711583/** Wrapper for receiving the IPC_M_DATA_READ calls using the async framework.
    15721584 *
    1573  * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ calls
    1574  * so that the user doesn't have to remember the meaning of each IPC argument.
     1585 * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ
     1586 * calls so that the user doesn't have to remember the meaning of each IPC
     1587 * argument.
    15751588 *
    15761589 * So far, this wrapper is to be used from within a connection fibril.
    15771590 *
    1578  * @param callid        Storage where the hash of the IPC_M_DATA_READ call will
    1579  *                      be stored.
    1580  * @param size          Storage where the maximum size will be stored. Can be
    1581  *                      NULL.
    1582  *
    1583  * @return              Non-zero on success, zero on failure.
    1584  */
    1585 int async_data_read_receive(ipc_callid_t *callid, size_t *size)
    1586 {
     1591 * @param callid Storage for the hash of the IPC_M_DATA_READ.
     1592 * @param size   Storage for the maximum size. Can be NULL.
     1593 *
     1594 * @return True on success, false on failure.
     1595 *
     1596 */
     1597bool async_data_read_receive(ipc_callid_t *callid, size_t *size)
     1598{
     1599        assert(callid);
     1600       
    15871601        ipc_call_t data;
    1588        
    1589         assert(callid);
    1590 
    15911602        *callid = async_get_call(&data);
     1603       
    15921604        if (IPC_GET_IMETHOD(data) != IPC_M_DATA_READ)
    1593                 return 0;
     1605                return false;
     1606       
    15941607        if (size)
    15951608                *size = (size_t) IPC_GET_ARG2(data);
    1596         return 1;
     1609       
     1610        return true;
    15971611}
    15981612
    15991613/** Wrapper for answering the IPC_M_DATA_READ calls using the async framework.
    16001614 *
    1601  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls
    1602  * so that the user doesn't have to remember the meaning of each IPC argument.
    1603  *
    1604  * @param callid        Hash of the IPC_M_DATA_READ call to answer.
    1605  * @param src           Source address for the IPC_M_DATA_READ call.
    1606  * @param size          Size for the IPC_M_DATA_READ call. Can be smaller than
    1607  *                      the maximum size announced by the sender.
    1608  *
    1609  * @return              Zero on success or a value from @ref errno.h on failure.
     1615 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ
     1616 * calls so that the user doesn't have to remember the meaning of each IPC
     1617 * argument.
     1618 *
     1619 * @param callid Hash of the IPC_M_DATA_READ call to answer.
     1620 * @param src    Source address for the IPC_M_DATA_READ call.
     1621 * @param size   Size for the IPC_M_DATA_READ call. Can be smaller than
     1622 *               the maximum size announced by the sender.
     1623 *
     1624 * @return Zero on success or a value from @ref errno.h on failure.
     1625 *
    16101626 */
    16111627int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size)
     
    16471663}
    16481664
    1649 /** Wrapper for making IPC_M_DATA_WRITE calls using the async framework.
     1665/** Wrapper for IPC_M_DATA_WRITE calls using the async framework.
    16501666 *
    16511667 * @param phoneid Phone that will be used to contact the receiving side.
     
    16641680/** Wrapper for receiving the IPC_M_DATA_WRITE calls using the async framework.
    16651681 *
    1666  * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE calls
    1667  * so that the user doesn't have to remember the meaning of each IPC argument.
     1682 * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE
     1683 * calls so that the user doesn't have to remember the meaning of each IPC
     1684 * argument.
    16681685 *
    16691686 * So far, this wrapper is to be used from within a connection fibril.
    16701687 *
    1671  * @param callid Storage where the hash of the IPC_M_DATA_WRITE call will
    1672  *               be stored.
    1673  * @param size   Storage where the suggested size will be stored. May be
    1674  *               NULL
    1675  *
    1676  * @return Non-zero on success, zero on failure.
    1677  *
    1678  */
    1679 int async_data_write_receive(ipc_callid_t *callid, size_t *size)
    1680 {
     1688 * @param callid Storage for the hash of the IPC_M_DATA_WRITE.
     1689 * @param size   Storage for the suggested size. May be NULL.
     1690 *
     1691 * @return True on success, false on failure.
     1692 *
     1693 */
     1694bool async_data_write_receive(ipc_callid_t *callid, size_t *size)
     1695{
     1696        assert(callid);
     1697       
    16811698        ipc_call_t data;
    1682        
    1683         assert(callid);
    1684        
    16851699        *callid = async_get_call(&data);
     1700       
    16861701        if (IPC_GET_IMETHOD(data) != IPC_M_DATA_WRITE)
    1687                 return 0;
     1702                return false;
    16881703       
    16891704        if (size)
    16901705                *size = (size_t) IPC_GET_ARG2(data);
    16911706       
    1692         return 1;
     1707        return true;
    16931708}
    16941709
    16951710/** Wrapper for answering the IPC_M_DATA_WRITE calls using the async framework.
    16961711 *
    1697  * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE calls
    1698  * so that the user doesn't have to remember the meaning of each IPC argument.
     1712 * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE
     1713 * calls so that the user doesn't have to remember the meaning of each IPC
     1714 * argument.
    16991715 *
    17001716 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.
     
    17921808 *
    17931809 */
    1794 void async_data_write_void(const int retval)
     1810void async_data_write_void(sysarg_t retval)
    17951811{
    17961812        ipc_callid_t callid;
Note: See TracChangeset for help on using the changeset viewer.