Changeset 12573db in mainline for uspace/lib/c/generic/async.c


Ignore:
Timestamp:
2011-01-31T20:32:33Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
37cf3792
Parents:
4fe94c66 (diff), 197ef43 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    r4fe94c66 r12573db  
    4343 * framework will automatically take care of most synchronization problems.
    4444 *
    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 ]
    49  *
    5045 * Example of use (pseudo C):
    5146 *
     
    5853 *   int fibril1(void *arg)
    5954 *   {
    60  *     conn = ipc_connect_me_to();
     55 *     conn = async_connect_me_to();
    6156 *     c1 = async_send(conn);
    6257 *     c2 = async_send(conn);
     
    7772 *   {
    7873 *     if (want_refuse) {
    79  *       ipc_answer_0(icallid, ELIMIT);
     74 *       async_answer_0(icallid, ELIMIT);
    8075 *       return;
    8176 *     }
    82  *     ipc_answer_0(icallid, EOK);
     77 *     async_answer_0(icallid, EOK);
    8378 *
    8479 *     callid = async_get_call(&call);
    8580 *     somehow_handle_the_call(callid, call);
    86  *     ipc_answer_2(callid, 1, 2, 3);
     81 *     async_answer_2(callid, 1, 2, 3);
    8782 *
    8883 *     callid = async_get_call(&call);
     
    9287 */
    9388
     89#define LIBC_ASYNC_C_
     90#include <ipc/ipc.h>
     91#include <async.h>
     92#undef LIBC_ASYNC_C_
     93
    9494#include <futex.h>
    95 #include <async.h>
    96 #include <async_priv.h>
    9795#include <fibril.h>
    9896#include <stdio.h>
    9997#include <adt/hash_table.h>
    10098#include <adt/list.h>
    101 #include <ipc/ipc.h>
    10299#include <assert.h>
    103100#include <errno.h>
     
    105102#include <arch/barrier.h>
    106103#include <bool.h>
     104#include "private/async.h"
    107105
    108106atomic_t async_futex = FUTEX_INITIALIZER;
     
    124122
    125123/**
    126  * Structures of this type are used to group information about a call and a
    127  * message queue link.
     124 * Structures of this type are used to group information about
     125 * a call and about a message queue link.
    128126 */
    129127typedef struct {
     
    153151        /** Link to the client tracking structure. */
    154152        client_t *client;
    155 
     153       
    156154        /** Messages that should be delivered to this fibril. */
    157155        link_t msg_queue;
     
    170168
    171169/** Identifier of the incoming connection handled by the current fibril. */
    172 fibril_local connection_t *FIBRIL_connection;
     170static fibril_local connection_t *FIBRIL_connection;
    173171
    174172static void *default_client_data_constructor(void)
     
    199197{
    200198        assert(FIBRIL_connection);
    201 
    202199        return FIBRIL_connection->client->data;
    203200}
    204201
    205 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call);
    206 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}
    207214
    208215/**
     
    210217 */
    211218static 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}
    212231
    213232/**
     
    221240static LIST_INITIALIZE(timeout_list);
    222241
    223 #define CLIENT_HASH_TABLE_BUCKETS       32
    224 #define CONN_HASH_TABLE_BUCKETS         32
    225 
    226 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[])
    227246{
    228247        assert(key);
    229         return (((*key) >> 4) % CLIENT_HASH_TABLE_BUCKETS);
     248        return (((key[0]) >> 4) % CLIENT_HASH_TABLE_BUCKETS);
    230249}
    231250
    232251static int client_compare(unsigned long key[], hash_count_t keys, link_t *item)
    233252{
    234         client_t *cl = hash_table_get_instance(item, client_t, link);
    235         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);
    236255}
    237256
     
    254273 *
    255274 */
    256 static hash_index_t conn_hash(unsigned long *key)
     275static hash_index_t conn_hash(unsigned long key[])
    257276{
    258277        assert(key);
    259         return (((*key) >> 4) % CONN_HASH_TABLE_BUCKETS);
     278        return (((key[0]) >> 4) % CONN_HASH_TABLE_BUCKETS);
    260279}
    261280
     
    271290static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item)
    272291{
    273         connection_t *hs = hash_table_get_instance(item, connection_t, link);
    274         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);
    275294}
    276295
     
    287306        free(hash_table_get_instance(item, connection_t, link));
    288307}
    289 
    290308
    291309/** Operations for the connection hash table. */
     
    308326        link_t *tmp = timeout_list.next;
    309327        while (tmp != &timeout_list) {
    310                 awaiter_t *cur;
    311                
    312                 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               
    313331                if (tv_gteq(&cur->to_event.expires, &wd->to_event.expires))
    314332                        break;
     333               
    315334                tmp = tmp->next;
    316335        }
     
    329348 *
    330349 * @return False if the call doesn't match any connection.
    331  *         True if the call was passed to the respective connection fibril.
     350 * @return True if the call was passed to the respective connection fibril.
    332351 *
    333352 */
     
    466485                         * the first IPC_M_PHONE_HUNGUP call and continues to
    467486                         * call async_get_call_timeout(). Repeat
    468                          * IPC_M_PHONE_HUNGUP until the caller notices. 
     487                         * IPC_M_PHONE_HUNGUP until the caller notices.
    469488                         */
    470489                        memset(call, 0, sizeof(ipc_call_t));
     
    473492                        return conn->close_callid;
    474493                }
    475 
     494               
    476495                if (usecs)
    477496                        async_insert_timeout(&conn->wdata);
     
    511530}
    512531
    513 /** Default fibril function that gets called to handle new connection.
    514  *
    515  * This function is defined as a weak symbol - to be redefined in user code.
    516  *
    517  * @param callid Hash of the incoming call.
    518  * @param call   Data of the incoming call.
    519  *
    520  */
    521 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)
    522 {
    523         ipc_answer_0(callid, ENOENT);
    524 }
    525 
    526 /** Default fibril function that gets called to handle interrupt notifications.
    527  *
    528  * This function is defined as a weak symbol - to be redefined in user code.
    529  *
    530  * @param callid Hash of the incoming call.
    531  * @param call   Data of the incoming call.
    532  *
    533  */
    534 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
    535 {
    536 }
    537 
    538532/** Wrapper for client connection fibril.
    539533 *
     
    548542static int connection_fibril(void *arg)
    549543{
    550         unsigned long key;
    551         client_t *cl;
    552         link_t *lnk;
    553         bool destroy = false;
    554 
    555544        /*
    556545         * Setup fibril-local connection pointer.
    557546         */
    558547        FIBRIL_connection = (connection_t *) arg;
    559 
     548       
     549        futex_down(&async_futex);
     550       
    560551        /*
    561552         * Add our reference for the current connection in the client task
     
    563554         * hash in a new tracking structure.
    564555         */
    565         futex_down(&async_futex);
    566         key = FIBRIL_connection->in_task_hash;
    567         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       
    568562        if (lnk) {
    569                 cl = hash_table_get_instance(lnk, client_t, link);
    570                 cl->refcnt++;
     563                client = hash_table_get_instance(lnk, client_t, link);
     564                client->refcnt++;
    571565        } else {
    572                 cl = malloc(sizeof(client_t));
    573                 if (!cl) {
     566                client = malloc(sizeof(client_t));
     567                if (!client) {
    574568                        ipc_answer_0(FIBRIL_connection->callid, ENOMEM);
    575569                        futex_up(&async_futex);
    576570                        return 0;
    577571                }
    578                 cl->in_task_hash = FIBRIL_connection->in_task_hash;
     572               
     573                client->in_task_hash = FIBRIL_connection->in_task_hash;
     574               
    579575                async_serialize_start();
    580                 cl->data = async_client_data_create();
     576                client->data = async_client_data_create();
    581577                async_serialize_end();
    582                 cl->refcnt = 1;
    583                 hash_table_insert(&client_hash_table, &key, &cl->link);
    584         }
     578               
     579                client->refcnt = 1;
     580                hash_table_insert(&client_hash_table, &key, &client->link);
     581        }
     582       
    585583        futex_up(&async_futex);
    586 
    587         FIBRIL_connection->client = cl;
    588 
     584       
     585        FIBRIL_connection->client = client;
     586       
    589587        /*
    590588         * Call the connection handler function.
     
    596594         * Remove the reference for this client task connection.
    597595         */
     596        bool destroy;
     597       
    598598        futex_down(&async_futex);
    599         if (--cl->refcnt == 0) {
     599       
     600        if (--client->refcnt == 0) {
    600601                hash_table_remove(&client_hash_table, &key, 1);
    601602                destroy = true;
    602         }
     603        } else
     604                destroy = false;
     605       
    603606        futex_up(&async_futex);
    604 
     607       
    605608        if (destroy) {
    606                 if (cl->data)
    607                         async_client_data_destroy(cl->data);
    608                 free(cl);
    609         }
    610 
     609                if (client->data)
     610                        async_client_data_destroy(client->data);
     611               
     612                free(client);
     613        }
     614       
    611615        /*
    612616         * Remove myself from the connection hash table.
     
    621625         */
    622626        while (!list_empty(&FIBRIL_connection->msg_queue)) {
    623                 msg_t *msg;
    624                
    625                 msg = list_get_instance(FIBRIL_connection->msg_queue.next,
    626                     msg_t, link);
     627                msg_t *msg =
     628                    list_get_instance(FIBRIL_connection->msg_queue.next, msg_t,
     629                    link);
     630               
    627631                list_remove(&msg->link);
    628632                ipc_answer_0(msg->callid, EHANGUP);
     
    667671                if (callid)
    668672                        ipc_answer_0(callid, ENOMEM);
     673               
    669674                return (uintptr_t) NULL;
    670675        }
     
    714719static void handle_call(ipc_callid_t callid, ipc_call_t *call)
    715720{
    716         /* Unrouted call - do some default behaviour */
     721        /* Unrouted call - take some default action */
    717722        if ((callid & IPC_CALLID_NOTIFICATION)) {
    718723                process_notification(callid, call);
    719                 goto out;
     724                return;
    720725        }
    721726       
     
    723728        case IPC_M_CONNECT_ME:
    724729        case IPC_M_CONNECT_ME_TO:
    725                 /* Open new connection with fibril etc. */
     730                /* Open new connection with fibril, etc. */
    726731                async_new_connection(call->in_task_hash, IPC_GET_ARG5(*call),
    727732                    callid, call, client_connection);
    728                 goto out;
     733                return;
    729734        }
    730735       
    731736        /* Try to route the call through the connection hash table */
    732737        if (route_call(callid, call))
    733                 goto out;
     738                return;
    734739       
    735740        /* Unknown call from unknown phone - hang it up */
    736741        ipc_answer_0(callid, EHANGUP);
    737         return;
    738        
    739 out:
    740         ;
    741742}
    742743
     
    751752        link_t *cur = timeout_list.next;
    752753        while (cur != &timeout_list) {
    753                 awaiter_t *waiter;
    754                
    755                 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               
    756757                if (tv_gt(&waiter->to_event.expires, &tv))
    757758                        break;
    758 
     759               
    759760                cur = cur->next;
    760 
     761               
    761762                list_remove(&waiter->to_event.link);
    762763                waiter->to_event.inlist = false;
     
    785786        while (true) {
    786787                if (fibril_switch(FIBRIL_FROM_MANAGER)) {
    787                         futex_up(&async_futex); 
     788                        futex_up(&async_futex);
    788789                        /*
    789790                         * async_futex is always held when entering a manager
     
    808809                                continue;
    809810                        } else
    810                                 timeout = tv_sub(&waiter->to_event.expires,
    811                                     &tv);
     811                                timeout = tv_sub(&waiter->to_event.expires, &tv);
    812812                } else
    813813                        timeout = SYNCH_NO_TIMEOUT;
    814814               
    815815                futex_up(&async_futex);
    816 
     816               
    817817                atomic_inc(&threads_in_ipc_wait);
    818818               
     
    822822               
    823823                atomic_dec(&threads_in_ipc_wait);
    824 
     824               
    825825                if (!callid) {
    826826                        handle_expired_timeouts();
     
    872872/** Initialize the async framework.
    873873 *
    874  * @return Zero on success or an error code.
    875  */
    876 int __async_init(void)
     874 */
     875void __async_init(void)
    877876{
    878877        if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1,
    879             &client_hash_table_ops) || !hash_table_create(&conn_hash_table,
    880             CONN_HASH_TABLE_BUCKETS, 1, &conn_hash_table_ops)) {
    881                 return ENOMEM;
    882         }
    883 
    884         _async_sess_init();
    885        
    886         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();
    887884}
    888885
     
    897894 * @param retval Value returned in the answer.
    898895 * @param data   Call data of the answer.
     896 *
    899897 */
    900898static void reply_received(void *arg, int retval, ipc_call_t *data)
     
    944942    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr)
    945943{
    946         amsg_t *msg = malloc(sizeof(*msg));
     944        amsg_t *msg = malloc(sizeof(amsg_t));
    947945       
    948946        if (!msg)
     
    953951       
    954952        msg->wdata.to_event.inlist = false;
    955         /* 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         */
    956958        msg->wdata.active = true;
    957959       
     
    984986    ipc_call_t *dataptr)
    985987{
    986         amsg_t *msg = malloc(sizeof(*msg));
     988        amsg_t *msg = malloc(sizeof(amsg_t));
    987989       
    988990        if (!msg)
     
    993995       
    994996        msg->wdata.to_event.inlist = false;
    995         /* 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         */
    9961002        msg->wdata.active = true;
    9971003       
     
    10921098void async_usleep(suseconds_t timeout)
    10931099{
    1094         amsg_t *msg = malloc(sizeof(*msg));
     1100        amsg_t *msg = malloc(sizeof(amsg_t));
    10951101       
    10961102        if (!msg)
     
    12351241}
    12361242
     1243void async_msg_0(int phone, sysarg_t imethod)
     1244{
     1245        ipc_call_async_0(phone, imethod, NULL, NULL, true);
     1246}
     1247
     1248void async_msg_1(int phone, sysarg_t imethod, sysarg_t arg1)
     1249{
     1250        ipc_call_async_1(phone, imethod, arg1, NULL, NULL, true);
     1251}
     1252
     1253void async_msg_2(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2)
     1254{
     1255        ipc_call_async_2(phone, imethod, arg1, arg2, NULL, NULL, true);
     1256}
     1257
     1258void async_msg_3(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2,
     1259    sysarg_t arg3)
     1260{
     1261        ipc_call_async_3(phone, imethod, arg1, arg2, arg3, NULL, NULL, true);
     1262}
     1263
     1264void async_msg_4(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2,
     1265    sysarg_t arg3, sysarg_t arg4)
     1266{
     1267        ipc_call_async_4(phone, imethod, arg1, arg2, arg3, arg4, NULL, NULL,
     1268            true);
     1269}
     1270
     1271void async_msg_5(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2,
     1272    sysarg_t arg3, sysarg_t arg4, sysarg_t arg5)
     1273{
     1274        ipc_call_async_5(phone, imethod, arg1, arg2, arg3, arg4, arg5, NULL,
     1275            NULL, true);
     1276}
     1277
     1278sysarg_t async_answer_0(ipc_callid_t callid, sysarg_t retval)
     1279{
     1280        return ipc_answer_0(callid, retval);
     1281}
     1282
     1283sysarg_t async_answer_1(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1)
     1284{
     1285        return ipc_answer_1(callid, retval, arg1);
     1286}
     1287
     1288sysarg_t async_answer_2(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1289    sysarg_t arg2)
     1290{
     1291        return ipc_answer_2(callid, retval, arg1, arg2);
     1292}
     1293
     1294sysarg_t async_answer_3(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1295    sysarg_t arg2, sysarg_t arg3)
     1296{
     1297        return ipc_answer_3(callid, retval, arg1, arg2, arg3);
     1298}
     1299
     1300sysarg_t async_answer_4(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1301    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4)
     1302{
     1303        return ipc_answer_4(callid, retval, arg1, arg2, arg3, arg4);
     1304}
     1305
     1306sysarg_t async_answer_5(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1307    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5)
     1308{
     1309        return ipc_answer_5(callid, retval, arg1, arg2, arg3, arg4, arg5);
     1310}
     1311
     1312int async_forward_fast(ipc_callid_t callid, int phoneid, sysarg_t imethod,
     1313    sysarg_t arg1, sysarg_t arg2, unsigned int mode)
     1314{
     1315        return ipc_forward_fast(callid, phoneid, imethod, arg1, arg2, mode);
     1316}
     1317
     1318int async_forward_slow(ipc_callid_t callid, int phoneid, sysarg_t imethod,
     1319    sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5,
     1320    unsigned int mode)
     1321{
     1322        return ipc_forward_slow(callid, phoneid, imethod, arg1, arg2, arg3, arg4,
     1323            arg5, mode);
     1324}
     1325
     1326/** Wrapper for making IPC_M_CONNECT_TO_ME calls using the async framework.
     1327 *
     1328 * Ask through phone for a new connection to some service.
     1329 *
     1330 * @param phone           Phone handle used for contacting the other side.
     1331 * @param arg1            User defined argument.
     1332 * @param arg2            User defined argument.
     1333 * @param arg3            User defined argument.
     1334 * @param client_receiver Connection handing routine.
     1335 *
     1336 * @return New phone handle on success or a negative error code.
     1337 *
     1338 */
     1339int async_connect_to_me(int phone, sysarg_t arg1, sysarg_t arg2,
     1340    sysarg_t arg3, async_client_conn_t client_receiver)
     1341{
     1342        sysarg_t task_hash;
     1343        sysarg_t phone_hash;
     1344        int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3,
     1345            NULL, NULL, NULL, &task_hash, &phone_hash);
     1346        if (rc != EOK)
     1347                return rc;
     1348       
     1349        if (client_receiver != NULL)
     1350                async_new_connection(task_hash, phone_hash, 0, NULL,
     1351                    client_receiver);
     1352       
     1353        return EOK;
     1354}
     1355
    12371356/** Wrapper for making IPC_M_CONNECT_ME_TO calls using the async framework.
    1238  * 
     1357 *
    12391358 * Ask through phone for a new connection to some service.
    12401359 *
    1241  * @param phoneid       Phone handle used for contacting the other side.
    1242  * @param arg1          User defined argument.
    1243  * @param arg2          User defined argument.
    1244  * @param arg3          User defined argument.
    1245  *
    1246  * @return              New phone handle on success or a negative error code.
    1247  */
    1248 int
    1249 async_connect_me_to(int phoneid, sysarg_t arg1, sysarg_t arg2, sysarg_t arg3)
    1250 {
    1251         int rc;
     1360 * @param phone Phone handle used for contacting the other side.
     1361 * @param arg1  User defined argument.
     1362 * @param arg2  User defined argument.
     1363 * @param arg3  User defined argument.
     1364 *
     1365 * @return New phone handle on success or a negative error code.
     1366 *
     1367 */
     1368int async_connect_me_to(int phone, sysarg_t arg1, sysarg_t arg2,
     1369    sysarg_t arg3)
     1370{
    12521371        sysarg_t newphid;
    1253 
    1254         rc = async_req_3_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3, NULL,
    1255             NULL, NULL, NULL, &newphid);
    1256        
    1257         if (rc != EOK) 
     1372        int rc = async_req_3_5(phone, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
     1373            NULL, NULL, NULL, NULL, &newphid);
     1374       
     1375        if (rc != EOK)
    12581376                return rc;
    1259 
     1377       
    12601378        return newphid;
    12611379}
    12621380
    12631381/** Wrapper for making IPC_M_CONNECT_ME_TO calls using the async framework.
    1264  * 
     1382 *
    12651383 * Ask through phone for a new connection to some service and block until
    12661384 * success.
    12671385 *
    1268  * @param phoneid       Phone handle used for contacting the other side.
    1269  * @param arg1          User defined argument.
    1270  * @param arg2          User defined argument.
    1271  * @param arg3          User defined argument.
    1272  *
    1273  * @return              New phone handle on success or a negative error code.
    1274  */
    1275 int
    1276 async_connect_me_to_blocking(int phoneid, sysarg_t arg1, sysarg_t arg2,
     1386 * @param phoneid Phone handle used for contacting the other side.
     1387 * @param arg1    User defined argument.
     1388 * @param arg2    User defined argument.
     1389 * @param arg3    User defined argument.
     1390 *
     1391 * @return New phone handle on success or a negative error code.
     1392 *
     1393 */
     1394int async_connect_me_to_blocking(int phoneid, sysarg_t arg1, sysarg_t arg2,
    12771395    sysarg_t arg3)
    12781396{
    1279         int rc;
    12801397        sysarg_t newphid;
    1281 
    1282         rc = async_req_4_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
     1398        int rc = async_req_4_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
    12831399            IPC_FLAG_BLOCKING, NULL, NULL, NULL, NULL, &newphid);
    12841400       
    1285         if (rc != EOK) 
     1401        if (rc != EOK)
    12861402                return rc;
    1287 
     1403       
    12881404        return newphid;
    12891405}
    12901406
    1291 /** Wrapper for making IPC_M_SHARE_IN calls using the async framework.
    1292  *
    1293  * @param phoneid       Phone that will be used to contact the receiving side.
    1294  * @param dst           Destination address space area base.
    1295  * @param size          Size of the destination address space area.
    1296  * @param arg           User defined argument.
    1297  * @param flags         Storage where the received flags will be stored. Can be
    1298  *                      NULL.
    1299  *
    1300  * @return              Zero on success or a negative error code from errno.h.
     1407/** Connect to a task specified by id.
     1408 *
     1409 */
     1410int async_connect_kbox(task_id_t id)
     1411{
     1412        return ipc_connect_kbox(id);
     1413}
     1414
     1415/** Wrapper for ipc_hangup.
     1416 *
     1417 * @param phone Phone handle to hung up.
     1418 *
     1419 * @return Zero on success or a negative error code.
     1420 *
     1421 */
     1422int async_hangup(int phone)
     1423{
     1424        return ipc_hangup(phone);
     1425}
     1426
     1427/** Interrupt one thread of this task from waiting for IPC. */
     1428void async_poke(void)
     1429{
     1430        ipc_poke();
     1431}
     1432
     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 *
    13011443 */
    13021444int async_share_in_start(int phoneid, void *dst, size_t size, sysarg_t arg,
    1303     int *flags)
    1304 {
    1305         int res;
     1445    unsigned int *flags)
     1446{
    13061447        sysarg_t tmp_flags;
    1307         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,
    13081449            (sysarg_t) size, arg, NULL, &tmp_flags);
     1450       
    13091451        if (flags)
    1310                 *flags = tmp_flags;
     1452                *flags = (unsigned int) tmp_flags;
     1453       
    13111454        return res;
    13121455}
     
    13141457/** Wrapper for receiving the IPC_M_SHARE_IN calls using the async framework.
    13151458 *
    1316  * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN calls
    1317  * 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.
    13181462 *
    13191463 * So far, this wrapper is to be used from within a connection fibril.
    13201464 *
    1321  * @param callid        Storage where the hash of the IPC_M_SHARE_IN call will
    1322  *                      be stored.
    1323  * @param size          Destination address space area size.   
    1324  *
    1325  * @return              Non-zero on success, zero on failure.
    1326  */
    1327 int async_share_in_receive(ipc_callid_t *callid, size_t *size)
    1328 {
    1329         ipc_call_t data;
    1330        
     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{
    13311473        assert(callid);
    13321474        assert(size);
    1333 
     1475       
     1476        ipc_call_t data;
    13341477        *callid = async_get_call(&data);
     1478       
    13351479        if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_IN)
    1336                 return 0;
     1480                return false;
     1481       
    13371482        *size = (size_t) IPC_GET_ARG2(data);
    1338         return 1;
     1483        return true;
    13391484}
    13401485
    13411486/** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework.
    13421487 *
    1343  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls
    1344  * so that the user doesn't have to remember the meaning of each IPC argument.
    1345  *
    1346  * @param callid        Hash of the IPC_M_DATA_READ call to answer.
    1347  * @param src           Source address space base.
    1348  * @param flags         Flags to be used for sharing. Bits can be only cleared.
    1349  *
    1350  * @return              Zero on success or a value from @ref errno.h on failure.
    1351  */
    1352 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)
    13531500{
    13541501        return ipc_share_in_finalize(callid, src, flags);
    13551502}
    13561503
    1357 /** Wrapper for making IPC_M_SHARE_OUT calls using the async framework.
    1358  *
    1359  * @param phoneid       Phone that will be used to contact the receiving side.
    1360  * @param src           Source address space area base address.
    1361  * @param flags         Flags to be used for sharing. Bits can be only cleared.
    1362  *
    1363  * @return              Zero on success or a negative error code from errno.h.
    1364  */
    1365 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)
    13661514{
    13671515        return async_req_3_0(phoneid, IPC_M_SHARE_OUT, (sysarg_t) src, 0,
     
    13711519/** Wrapper for receiving the IPC_M_SHARE_OUT calls using the async framework.
    13721520 *
    1373  * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT calls
    1374  * 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.
    13751524 *
    13761525 * So far, this wrapper is to be used from within a connection fibril.
    13771526 *
    1378  * @param callid        Storage where the hash of the IPC_M_SHARE_OUT call will
    1379  *                      be stored.
    1380  * @param size          Storage where the source address space area size will be
    1381  *                      stored.
    1382  * @param flags         Storage where the sharing flags will be stored.
    1383  *
    1384  * @return              Non-zero on success, zero on failure.
    1385  */
    1386 int async_share_out_receive(ipc_callid_t *callid, size_t *size, int *flags)
    1387 {
    1388         ipc_call_t data;
    1389        
     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{
    13901536        assert(callid);
    13911537        assert(size);
    13921538        assert(flags);
    1393 
     1539       
     1540        ipc_call_t data;
    13941541        *callid = async_get_call(&data);
     1542       
    13951543        if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_OUT)
    1396                 return 0;
     1544                return false;
     1545       
    13971546        *size = (size_t) IPC_GET_ARG2(data);
    1398         *flags = (int) IPC_GET_ARG3(data);
    1399         return 1;
     1547        *flags = (unsigned int) IPC_GET_ARG3(data);
     1548        return true;
    14001549}
    14011550
    14021551/** Wrapper for answering the IPC_M_SHARE_OUT calls using the async framework.
    14031552 *
    1404  * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT calls
    1405  * so that the user doesn't have to remember the meaning of each IPC argument.
    1406  *
    1407  * @param callid        Hash of the IPC_M_DATA_WRITE call to answer.
    1408  * @param dst           Destination address space area base address.   
    1409  *
    1410  * @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 *
    14111562 */
    14121563int async_share_out_finalize(ipc_callid_t callid, void *dst)
     
    14151566}
    14161567
    1417 
    1418 /** Wrapper for making IPC_M_DATA_READ calls using the async framework.
    1419  *
    1420  * @param phoneid       Phone that will be used to contact the receiving side.
    1421  * @param dst           Address of the beginning of the destination buffer.
    1422  * @param size          Size of the destination buffer.
    1423  *
    1424  * @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 *
    14251576 */
    14261577int async_data_read_start(int phoneid, void *dst, size_t size)
     
    14321583/** Wrapper for receiving the IPC_M_DATA_READ calls using the async framework.
    14331584 *
    1434  * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ calls
    1435  * 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.
    14361588 *
    14371589 * So far, this wrapper is to be used from within a connection fibril.
    14381590 *
    1439  * @param callid        Storage where the hash of the IPC_M_DATA_READ call will
    1440  *                      be stored.
    1441  * @param size          Storage where the maximum size will be stored. Can be
    1442  *                      NULL.
    1443  *
    1444  * @return              Non-zero on success, zero on failure.
    1445  */
    1446 int async_data_read_receive(ipc_callid_t *callid, size_t *size)
    1447 {
     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       
    14481601        ipc_call_t data;
    1449        
    1450         assert(callid);
    1451 
    14521602        *callid = async_get_call(&data);
     1603       
    14531604        if (IPC_GET_IMETHOD(data) != IPC_M_DATA_READ)
    1454                 return 0;
     1605                return false;
     1606       
    14551607        if (size)
    14561608                *size = (size_t) IPC_GET_ARG2(data);
    1457         return 1;
     1609       
     1610        return true;
    14581611}
    14591612
    14601613/** Wrapper for answering the IPC_M_DATA_READ calls using the async framework.
    14611614 *
    1462  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls
    1463  * so that the user doesn't have to remember the meaning of each IPC argument.
    1464  *
    1465  * @param callid        Hash of the IPC_M_DATA_READ call to answer.
    1466  * @param src           Source address for the IPC_M_DATA_READ call.
    1467  * @param size          Size for the IPC_M_DATA_READ call. Can be smaller than
    1468  *                      the maximum size announced by the sender.
    1469  *
    1470  * @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 *
    14711626 */
    14721627int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size)
     
    14761631
    14771632/** Wrapper for forwarding any read request
    1478  *
    14791633 *
    14801634 */
     
    15091663}
    15101664
    1511 /** Wrapper for making IPC_M_DATA_WRITE calls using the async framework.
     1665/** Wrapper for IPC_M_DATA_WRITE calls using the async framework.
    15121666 *
    15131667 * @param phoneid Phone that will be used to contact the receiving side.
     
    15261680/** Wrapper for receiving the IPC_M_DATA_WRITE calls using the async framework.
    15271681 *
    1528  * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE calls
    1529  * 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.
    15301685 *
    15311686 * So far, this wrapper is to be used from within a connection fibril.
    15321687 *
    1533  * @param callid Storage where the hash of the IPC_M_DATA_WRITE call will
    1534  *               be stored.
    1535  * @param size   Storage where the suggested size will be stored. May be
    1536  *               NULL
    1537  *
    1538  * @return Non-zero on success, zero on failure.
    1539  *
    1540  */
    1541 int async_data_write_receive(ipc_callid_t *callid, size_t *size)
    1542 {
     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       
    15431698        ipc_call_t data;
    1544        
    1545         assert(callid);
    1546        
    15471699        *callid = async_get_call(&data);
     1700       
    15481701        if (IPC_GET_IMETHOD(data) != IPC_M_DATA_WRITE)
    1549                 return 0;
     1702                return false;
    15501703       
    15511704        if (size)
    15521705                *size = (size_t) IPC_GET_ARG2(data);
    15531706       
    1554         return 1;
     1707        return true;
    15551708}
    15561709
    15571710/** Wrapper for answering the IPC_M_DATA_WRITE calls using the async framework.
    15581711 *
    1559  * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE calls
    1560  * 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.
    15611715 *
    15621716 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.
     
    16541808 *
    16551809 */
    1656 void async_data_write_void(const int retval)
     1810void async_data_write_void(sysarg_t retval)
    16571811{
    16581812        ipc_callid_t callid;
     
    16621816
    16631817/** Wrapper for forwarding any data that is about to be received
    1664  *
    16651818 *
    16661819 */
Note: See TracChangeset for help on using the changeset viewer.