Changeset b5e68c8 in mainline for uspace/lib/c/generic/async.c


Ignore:
Timestamp:
2011-05-12T16:49:44Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f36787d7
Parents:
e80329d6 (diff), 750636a (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

    re80329d6 rb5e68c8  
    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 <stdlib.h>
     105#include <malloc.h>
     106#include "private/async.h"
    107107
    108108atomic_t async_futex = FUTEX_INITIALIZER;
     
    120120        ipc_call_t *dataptr;
    121121       
    122         ipcarg_t retval;
     122        sysarg_t retval;
    123123} amsg_t;
    124124
    125125/**
    126  * Structures of this type are used to group information about a call and a
    127  * message queue link.
     126 * Structures of this type are used to group information about
     127 * a call and about a message queue link.
    128128 */
    129129typedef struct {
     
    134134
    135135typedef struct {
     136        sysarg_t in_task_hash;
     137        link_t link;
     138        int refcnt;
     139        void *data;
     140} client_t;
     141
     142typedef struct {
    136143        awaiter_t wdata;
    137144       
     
    139146        link_t link;
    140147       
     148        /** Incoming client task hash. */
     149        sysarg_t in_task_hash;
    141150        /** Incoming phone hash. */
    142         ipcarg_t in_phone_hash;
     151        sysarg_t in_phone_hash;
     152       
     153        /** Link to the client tracking structure. */
     154        client_t *client;
    143155       
    144156        /** Messages that should be delivered to this fibril. */
     
    158170
    159171/** Identifier of the incoming connection handled by the current fibril. */
    160 fibril_local connection_t *FIBRIL_connection;
    161 
    162 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call);
    163 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call);
     172static fibril_local connection_t *FIBRIL_connection;
     173
     174static void *default_client_data_constructor(void)
     175{
     176        return NULL;
     177}
     178
     179static void default_client_data_destructor(void *data)
     180{
     181}
     182
     183static async_client_data_ctor_t async_client_data_create =
     184    default_client_data_constructor;
     185static async_client_data_dtor_t async_client_data_destroy =
     186    default_client_data_destructor;
     187
     188void async_set_client_data_constructor(async_client_data_ctor_t ctor)
     189{
     190        async_client_data_create = ctor;
     191}
     192
     193void async_set_client_data_destructor(async_client_data_dtor_t dtor)
     194{
     195        async_client_data_destroy = dtor;
     196}
     197
     198void *async_client_data_get(void)
     199{
     200        assert(FIBRIL_connection);
     201        return FIBRIL_connection->client->data;
     202}
     203
     204/** Default fibril function that gets called to handle new connection.
     205 *
     206 * This function is defined as a weak symbol - to be redefined in user code.
     207 *
     208 * @param callid Hash of the incoming call.
     209 * @param call   Data of the incoming call.
     210 *
     211 */
     212static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)
     213{
     214        ipc_answer_0(callid, ENOENT);
     215}
    164216
    165217/**
     
    167219 */
    168220static async_client_conn_t client_connection = default_client_connection;
     221
     222/** Default fibril function that gets called to handle interrupt notifications.
     223 *
     224 * This function is defined as a weak symbol - to be redefined in user code.
     225 *
     226 * @param callid Hash of the incoming call.
     227 * @param call   Data of the incoming call.
     228 *
     229 */
     230static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
     231{
     232}
    169233
    170234/**
     
    174238static async_client_conn_t interrupt_received = default_interrupt_received;
    175239
     240static hash_table_t client_hash_table;
    176241static hash_table_t conn_hash_table;
    177242static LIST_INITIALIZE(timeout_list);
    178243
    179 #define CONN_HASH_TABLE_CHAINS  32
     244#define CLIENT_HASH_TABLE_BUCKETS  32
     245#define CONN_HASH_TABLE_BUCKETS    32
     246
     247static hash_index_t client_hash(unsigned long key[])
     248{
     249        assert(key);
     250        return (((key[0]) >> 4) % CLIENT_HASH_TABLE_BUCKETS);
     251}
     252
     253static int client_compare(unsigned long key[], hash_count_t keys, link_t *item)
     254{
     255        client_t *client = hash_table_get_instance(item, client_t, link);
     256        return (key[0] == client->in_task_hash);
     257}
     258
     259static void client_remove(link_t *item)
     260{
     261}
     262
     263/** Operations for the client hash table. */
     264static hash_table_operations_t client_hash_table_ops = {
     265        .hash = client_hash,
     266        .compare = client_compare,
     267        .remove_callback = client_remove
     268};
    180269
    181270/** Compute hash into the connection hash table based on the source phone hash.
     
    186275 *
    187276 */
    188 static hash_index_t conn_hash(unsigned long *key)
     277static hash_index_t conn_hash(unsigned long key[])
    189278{
    190279        assert(key);
    191         return (((*key) >> 4) % CONN_HASH_TABLE_CHAINS);
     280        return (((key[0]) >> 4) % CONN_HASH_TABLE_BUCKETS);
    192281}
    193282
     
    203292static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item)
    204293{
    205         connection_t *hs = hash_table_get_instance(item, connection_t, link);
    206         return (key[0] == hs->in_phone_hash);
    207 }
    208 
    209 /** Connection hash table removal callback function.
    210  *
    211  * This function is called whenever a connection is removed from the connection
    212  * hash table.
    213  *
    214  * @param item Connection hash table item being removed.
    215  *
    216  */
     294        connection_t *conn = hash_table_get_instance(item, connection_t, link);
     295        return (key[0] == conn->in_phone_hash);
     296}
     297
    217298static void conn_remove(link_t *item)
    218299{
    219         free(hash_table_get_instance(item, connection_t, link));
    220 }
    221 
     300}
    222301
    223302/** Operations for the connection hash table. */
     
    240319        link_t *tmp = timeout_list.next;
    241320        while (tmp != &timeout_list) {
    242                 awaiter_t *cur;
    243                
    244                 cur = list_get_instance(tmp, awaiter_t, to_event.link);
     321                awaiter_t *cur
     322                    = list_get_instance(tmp, awaiter_t, to_event.link);
     323               
    245324                if (tv_gteq(&cur->to_event.expires, &wd->to_event.expires))
    246325                        break;
     326               
    247327                tmp = tmp->next;
    248328        }
     
    261341 *
    262342 * @return False if the call doesn't match any connection.
    263  *         True if the call was passed to the respective connection fibril.
     343 * @return True if the call was passed to the respective connection fibril.
    264344 *
    265345 */
     
    288368        list_append(&msg->link, &conn->msg_queue);
    289369       
    290         if (IPC_GET_METHOD(*call) == IPC_M_PHONE_HUNGUP)
     370        if (IPC_GET_IMETHOD(*call) == IPC_M_PHONE_HUNGUP)
    291371                conn->close_callid = callid;
    292372       
     
    352432       
    353433        fid_t fid = fibril_create(notification_fibril, msg);
     434        if (fid == 0) {
     435                free(msg);
     436                futex_up(&async_futex);
     437                return false;
     438        }
     439       
    354440        fibril_add_ready(fid);
    355441       
     
    398484                         * the first IPC_M_PHONE_HUNGUP call and continues to
    399485                         * call async_get_call_timeout(). Repeat
    400                          * IPC_M_PHONE_HUNGUP until the caller notices. 
     486                         * IPC_M_PHONE_HUNGUP until the caller notices.
    401487                         */
    402488                        memset(call, 0, sizeof(ipc_call_t));
    403                         IPC_SET_METHOD(*call, IPC_M_PHONE_HUNGUP);
     489                        IPC_SET_IMETHOD(*call, IPC_M_PHONE_HUNGUP);
    404490                        futex_up(&async_futex);
    405491                        return conn->close_callid;
    406492                }
    407 
     493               
    408494                if (usecs)
    409495                        async_insert_timeout(&conn->wdata);
     
    443529}
    444530
    445 /** Default fibril function that gets called to handle new connection.
    446  *
    447  * This function is defined as a weak symbol - to be redefined in user code.
    448  *
    449  * @param callid Hash of the incoming call.
    450  * @param call   Data of the incoming call.
    451  *
    452  */
    453 static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)
    454 {
    455         ipc_answer_0(callid, ENOENT);
    456 }
    457 
    458 /** Default fibril function that gets called to handle interrupt notifications.
    459  *
    460  * This function is defined as a weak symbol - to be redefined in user code.
    461  *
    462  * @param callid Hash of the incoming call.
    463  * @param call   Data of the incoming call.
    464  *
    465  */
    466 static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
    467 {
    468 }
    469 
    470531/** Wrapper for client connection fibril.
    471532 *
     
    481542{
    482543        /*
    483          * Setup fibril-local connection pointer and call client_connection().
    484          *
     544         * Setup fibril-local connection pointer.
    485545         */
    486546        FIBRIL_connection = (connection_t *) arg;
     547       
     548        futex_down(&async_futex);
     549       
     550        /*
     551         * Add our reference for the current connection in the client task
     552         * tracking structure. If this is the first reference, create and
     553         * hash in a new tracking structure.
     554         */
     555       
     556        unsigned long key = FIBRIL_connection->in_task_hash;
     557        link_t *lnk = hash_table_find(&client_hash_table, &key);
     558       
     559        client_t *client;
     560       
     561        if (lnk) {
     562                client = hash_table_get_instance(lnk, client_t, link);
     563                client->refcnt++;
     564        } else {
     565                client = malloc(sizeof(client_t));
     566                if (!client) {
     567                        ipc_answer_0(FIBRIL_connection->callid, ENOMEM);
     568                        futex_up(&async_futex);
     569                        return 0;
     570                }
     571               
     572                client->in_task_hash = FIBRIL_connection->in_task_hash;
     573               
     574                async_serialize_start();
     575                client->data = async_client_data_create();
     576                async_serialize_end();
     577               
     578                client->refcnt = 1;
     579                hash_table_insert(&client_hash_table, &key, &client->link);
     580        }
     581       
     582        futex_up(&async_futex);
     583       
     584        FIBRIL_connection->client = client;
     585       
     586        /*
     587         * Call the connection handler function.
     588         */
    487589        FIBRIL_connection->cfibril(FIBRIL_connection->callid,
    488590            &FIBRIL_connection->call);
    489591       
    490         /* Remove myself from the connection hash table */
     592        /*
     593         * Remove the reference for this client task connection.
     594         */
     595        bool destroy;
     596       
    491597        futex_down(&async_futex);
    492         unsigned long key = FIBRIL_connection->in_phone_hash;
     598       
     599        if (--client->refcnt == 0) {
     600                hash_table_remove(&client_hash_table, &key, 1);
     601                destroy = true;
     602        } else
     603                destroy = false;
     604       
     605        futex_up(&async_futex);
     606       
     607        if (destroy) {
     608                if (client->data)
     609                        async_client_data_destroy(client->data);
     610               
     611                free(client);
     612        }
     613       
     614        /*
     615         * Remove myself from the connection hash table.
     616         */
     617        futex_down(&async_futex);
     618        key = FIBRIL_connection->in_phone_hash;
    493619        hash_table_remove(&conn_hash_table, &key, 1);
    494620        futex_up(&async_futex);
    495621       
    496         /* Answer all remaining messages with EHANGUP */
     622        /*
     623         * Answer all remaining messages with EHANGUP.
     624         */
    497625        while (!list_empty(&FIBRIL_connection->msg_queue)) {
    498                 msg_t *msg;
    499                
    500                 msg = list_get_instance(FIBRIL_connection->msg_queue.next,
    501                     msg_t, link);
     626                msg_t *msg =
     627                    list_get_instance(FIBRIL_connection->msg_queue.next, msg_t,
     628                    link);
     629               
    502630                list_remove(&msg->link);
    503631                ipc_answer_0(msg->callid, EHANGUP);
     
    505633        }
    506634       
     635        /*
     636         * If the connection was hung-up, answer the last call,
     637         * i.e. IPC_M_PHONE_HUNGUP.
     638         */
    507639        if (FIBRIL_connection->close_callid)
    508640                ipc_answer_0(FIBRIL_connection->close_callid, EOK);
    509641       
     642        free(FIBRIL_connection);
    510643        return 0;
    511644}
     
    517650 * particular fibrils.
    518651 *
     652 * @param in_task_hash  Identification of the incoming connection.
    519653 * @param in_phone_hash Identification of the incoming connection.
    520654 * @param callid        Hash of the opening IPC_M_CONNECT_ME_TO call.
     
    529663 *
    530664 */
    531 fid_t async_new_connection(ipcarg_t in_phone_hash, ipc_callid_t callid,
    532     ipc_call_t *call, void (*cfibril)(ipc_callid_t, ipc_call_t *))
     665fid_t async_new_connection(sysarg_t in_task_hash, sysarg_t in_phone_hash,
     666    ipc_callid_t callid, ipc_call_t *call,
     667    void (*cfibril)(ipc_callid_t, ipc_call_t *))
    533668{
    534669        connection_t *conn = malloc(sizeof(*conn));
     
    536671                if (callid)
    537672                        ipc_answer_0(callid, ENOMEM);
    538                 return NULL;
    539         }
    540        
     673               
     674                return (uintptr_t) NULL;
     675        }
     676       
     677        conn->in_task_hash = in_task_hash;
    541678        conn->in_phone_hash = in_phone_hash;
    542679        list_initialize(&conn->msg_queue);
     
    552689        conn->wdata.fid = fibril_create(connection_fibril, conn);
    553690       
    554         if (!conn->wdata.fid) {
     691        if (conn->wdata.fid == 0) {
    555692                free(conn);
     693               
    556694                if (callid)
    557695                        ipc_answer_0(callid, ENOMEM);
    558                 return NULL;
     696               
     697                return (uintptr_t) NULL;
    559698        }
    560699       
     
    582721static void handle_call(ipc_callid_t callid, ipc_call_t *call)
    583722{
    584         /* Unrouted call - do some default behaviour */
     723        /* Unrouted call - take some default action */
    585724        if ((callid & IPC_CALLID_NOTIFICATION)) {
    586725                process_notification(callid, call);
    587                 goto out;
    588         }
    589        
    590         switch (IPC_GET_METHOD(*call)) {
     726                return;
     727        }
     728       
     729        switch (IPC_GET_IMETHOD(*call)) {
    591730        case IPC_M_CONNECT_ME:
    592731        case IPC_M_CONNECT_ME_TO:
    593                 /* Open new connection with fibril etc. */
    594                 async_new_connection(IPC_GET_ARG5(*call), callid, call,
    595                     client_connection);
    596                 goto out;
     732                /* Open new connection with fibril, etc. */
     733                async_new_connection(call->in_task_hash, IPC_GET_ARG5(*call),
     734                    callid, call, client_connection);
     735                return;
    597736        }
    598737       
    599738        /* Try to route the call through the connection hash table */
    600739        if (route_call(callid, call))
    601                 goto out;
     740                return;
    602741       
    603742        /* Unknown call from unknown phone - hang it up */
    604743        ipc_answer_0(callid, EHANGUP);
    605         return;
    606        
    607 out:
    608         ;
    609744}
    610745
     
    619754        link_t *cur = timeout_list.next;
    620755        while (cur != &timeout_list) {
    621                 awaiter_t *waiter;
    622                
    623                 waiter = list_get_instance(cur, awaiter_t, to_event.link);
     756                awaiter_t *waiter =
     757                    list_get_instance(cur, awaiter_t, to_event.link);
     758               
    624759                if (tv_gt(&waiter->to_event.expires, &tv))
    625760                        break;
    626 
     761               
    627762                cur = cur->next;
    628 
     763               
    629764                list_remove(&waiter->to_event.link);
    630765                waiter->to_event.inlist = false;
     
    653788        while (true) {
    654789                if (fibril_switch(FIBRIL_FROM_MANAGER)) {
    655                         futex_up(&async_futex); 
     790                        futex_up(&async_futex);
    656791                        /*
    657792                         * async_futex is always held when entering a manager
     
    676811                                continue;
    677812                        } else
    678                                 timeout = tv_sub(&waiter->to_event.expires,
    679                                     &tv);
     813                                timeout = tv_sub(&waiter->to_event.expires, &tv);
    680814                } else
    681815                        timeout = SYNCH_NO_TIMEOUT;
    682816               
    683817                futex_up(&async_futex);
    684 
     818               
    685819                atomic_inc(&threads_in_ipc_wait);
    686820               
     
    690824               
    691825                atomic_dec(&threads_in_ipc_wait);
    692 
     826               
    693827                if (!callid) {
    694828                        handle_expired_timeouts();
     
    729863{
    730864        fid_t fid = fibril_create(async_manager_fibril, NULL);
    731         fibril_add_manager(fid);
     865        if (fid != 0)
     866                fibril_add_manager(fid);
    732867}
    733868
     
    740875/** Initialize the async framework.
    741876 *
    742  * @return Zero on success or an error code.
    743  */
    744 int __async_init(void)
    745 {
    746         if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1,
    747             &conn_hash_table_ops)) {
    748                 printf("%s: Cannot create async hash table\n", "libc");
    749                 return ENOMEM;
    750         }
    751        
    752         return 0;
     877 */
     878void __async_init(void)
     879{
     880        if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS, 1,
     881            &client_hash_table_ops))
     882                abort();
     883       
     884        if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_BUCKETS, 1,
     885            &conn_hash_table_ops))
     886                abort();
    753887}
    754888
     
    763897 * @param retval Value returned in the answer.
    764898 * @param data   Call data of the answer.
     899 *
    765900 */
    766901static void reply_received(void *arg, int retval, ipc_call_t *data)
     
    807942 *
    808943 */
    809 aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
    810     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr)
    811 {
    812         amsg_t *msg = malloc(sizeof(*msg));
     944aid_t async_send_fast(int phoneid, sysarg_t method, sysarg_t arg1,
     945    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr)
     946{
     947        amsg_t *msg = malloc(sizeof(amsg_t));
    813948       
    814949        if (!msg)
     
    819954       
    820955        msg->wdata.to_event.inlist = false;
    821         /* We may sleep in the next method, but it will use its own mechanism */
     956       
     957        /*
     958         * We may sleep in the next method,
     959         * but it will use its own means
     960         */
    822961        msg->wdata.active = true;
    823962       
     
    846985 *
    847986 */
    848 aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
    849     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5,
     987aid_t async_send_slow(int phoneid, sysarg_t method, sysarg_t arg1,
     988    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5,
    850989    ipc_call_t *dataptr)
    851990{
    852         amsg_t *msg = malloc(sizeof(*msg));
     991        amsg_t *msg = malloc(sizeof(amsg_t));
    853992       
    854993        if (!msg)
     
    859998       
    860999        msg->wdata.to_event.inlist = false;
    861         /* We may sleep in next method, but it will use its own mechanism */
     1000       
     1001        /*
     1002         * We may sleep in the next method,
     1003         * but it will use its own means
     1004         */
    8621005        msg->wdata.active = true;
    8631006       
     
    8751018 *
    8761019 */
    877 void async_wait_for(aid_t amsgid, ipcarg_t *retval)
     1020void async_wait_for(aid_t amsgid, sysarg_t *retval)
    8781021{
    8791022        amsg_t *msg = (amsg_t *) amsgid;
     
    9111054 *
    9121055 */
    913 int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, suseconds_t timeout)
     1056int async_wait_timeout(aid_t amsgid, sysarg_t *retval, suseconds_t timeout)
    9141057{
    9151058        amsg_t *msg = (amsg_t *) amsgid;
     
    9581101void async_usleep(suseconds_t timeout)
    9591102{
    960         amsg_t *msg = malloc(sizeof(*msg));
     1103        amsg_t *msg = malloc(sizeof(amsg_t));
    9611104       
    9621105        if (!msg)
     
    10231166 *
    10241167 */
    1025 ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
    1026     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2,
    1027     ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5)
     1168sysarg_t async_req_fast(int phoneid, sysarg_t method, sysarg_t arg1,
     1169    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t *r1, sysarg_t *r2,
     1170    sysarg_t *r3, sysarg_t *r4, sysarg_t *r5)
    10281171{
    10291172        ipc_call_t result;
     
    10311174            &result);
    10321175       
    1033         ipcarg_t rc;
     1176        sysarg_t rc;
    10341177        async_wait_for(eid, &rc);
    10351178       
     
    10721215 *
    10731216 */
    1074 ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
    1075     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1,
    1076     ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5)
     1217sysarg_t async_req_slow(int phoneid, sysarg_t method, sysarg_t arg1,
     1218    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5, sysarg_t *r1,
     1219    sysarg_t *r2, sysarg_t *r3, sysarg_t *r4, sysarg_t *r5)
    10771220{
    10781221        ipc_call_t result;
     
    10801223            &result);
    10811224       
    1082         ipcarg_t rc;
     1225        sysarg_t rc;
    10831226        async_wait_for(eid, &rc);
    10841227       
     
    11011244}
    11021245
     1246void async_msg_0(int phone, sysarg_t imethod)
     1247{
     1248        ipc_call_async_0(phone, imethod, NULL, NULL, true);
     1249}
     1250
     1251void async_msg_1(int phone, sysarg_t imethod, sysarg_t arg1)
     1252{
     1253        ipc_call_async_1(phone, imethod, arg1, NULL, NULL, true);
     1254}
     1255
     1256void async_msg_2(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2)
     1257{
     1258        ipc_call_async_2(phone, imethod, arg1, arg2, NULL, NULL, true);
     1259}
     1260
     1261void async_msg_3(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2,
     1262    sysarg_t arg3)
     1263{
     1264        ipc_call_async_3(phone, imethod, arg1, arg2, arg3, NULL, NULL, true);
     1265}
     1266
     1267void async_msg_4(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2,
     1268    sysarg_t arg3, sysarg_t arg4)
     1269{
     1270        ipc_call_async_4(phone, imethod, arg1, arg2, arg3, arg4, NULL, NULL,
     1271            true);
     1272}
     1273
     1274void async_msg_5(int phone, sysarg_t imethod, sysarg_t arg1, sysarg_t arg2,
     1275    sysarg_t arg3, sysarg_t arg4, sysarg_t arg5)
     1276{
     1277        ipc_call_async_5(phone, imethod, arg1, arg2, arg3, arg4, arg5, NULL,
     1278            NULL, true);
     1279}
     1280
     1281sysarg_t async_answer_0(ipc_callid_t callid, sysarg_t retval)
     1282{
     1283        return ipc_answer_0(callid, retval);
     1284}
     1285
     1286sysarg_t async_answer_1(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1)
     1287{
     1288        return ipc_answer_1(callid, retval, arg1);
     1289}
     1290
     1291sysarg_t async_answer_2(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1292    sysarg_t arg2)
     1293{
     1294        return ipc_answer_2(callid, retval, arg1, arg2);
     1295}
     1296
     1297sysarg_t async_answer_3(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1298    sysarg_t arg2, sysarg_t arg3)
     1299{
     1300        return ipc_answer_3(callid, retval, arg1, arg2, arg3);
     1301}
     1302
     1303sysarg_t async_answer_4(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1304    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4)
     1305{
     1306        return ipc_answer_4(callid, retval, arg1, arg2, arg3, arg4);
     1307}
     1308
     1309sysarg_t async_answer_5(ipc_callid_t callid, sysarg_t retval, sysarg_t arg1,
     1310    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5)
     1311{
     1312        return ipc_answer_5(callid, retval, arg1, arg2, arg3, arg4, arg5);
     1313}
     1314
     1315int async_forward_fast(ipc_callid_t callid, int phoneid, sysarg_t imethod,
     1316    sysarg_t arg1, sysarg_t arg2, unsigned int mode)
     1317{
     1318        return ipc_forward_fast(callid, phoneid, imethod, arg1, arg2, mode);
     1319}
     1320
     1321int async_forward_slow(ipc_callid_t callid, int phoneid, sysarg_t imethod,
     1322    sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5,
     1323    unsigned int mode)
     1324{
     1325        return ipc_forward_slow(callid, phoneid, imethod, arg1, arg2, arg3, arg4,
     1326            arg5, mode);
     1327}
     1328
     1329/** Wrapper for making IPC_M_CONNECT_TO_ME calls using the async framework.
     1330 *
     1331 * Ask through phone for a new connection to some service.
     1332 *
     1333 * @param phone           Phone handle used for contacting the other side.
     1334 * @param arg1            User defined argument.
     1335 * @param arg2            User defined argument.
     1336 * @param arg3            User defined argument.
     1337 * @param client_receiver Connection handing routine.
     1338 *
     1339 * @return New phone handle on success or a negative error code.
     1340 *
     1341 */
     1342int async_connect_to_me(int phone, sysarg_t arg1, sysarg_t arg2,
     1343    sysarg_t arg3, async_client_conn_t client_receiver)
     1344{
     1345        sysarg_t task_hash;
     1346        sysarg_t phone_hash;
     1347        int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3,
     1348            NULL, NULL, NULL, &task_hash, &phone_hash);
     1349        if (rc != EOK)
     1350                return rc;
     1351       
     1352        if (client_receiver != NULL)
     1353                async_new_connection(task_hash, phone_hash, 0, NULL,
     1354                    client_receiver);
     1355       
     1356        return EOK;
     1357}
     1358
    11031359/** Wrapper for making IPC_M_CONNECT_ME_TO calls using the async framework.
    1104  * 
     1360 *
    11051361 * Ask through phone for a new connection to some service.
    11061362 *
    1107  * @param phoneid       Phone handle used for contacting the other side.
    1108  * @param arg1          User defined argument.
    1109  * @param arg2          User defined argument.
    1110  * @param arg3          User defined argument.
    1111  *
    1112  * @return              New phone handle on success or a negative error code.
    1113  */
    1114 int
    1115 async_connect_me_to(int phoneid, ipcarg_t arg1, ipcarg_t arg2, ipcarg_t arg3)
    1116 {
    1117         int rc;
    1118         ipcarg_t newphid;
    1119 
    1120         rc = async_req_3_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3, NULL,
    1121             NULL, NULL, NULL, &newphid);
    1122        
    1123         if (rc != EOK) 
     1363 * @param phone Phone handle used for contacting the other side.
     1364 * @param arg1  User defined argument.
     1365 * @param arg2  User defined argument.
     1366 * @param arg3  User defined argument.
     1367 *
     1368 * @return New phone handle on success or a negative error code.
     1369 *
     1370 */
     1371int async_connect_me_to(int phone, sysarg_t arg1, sysarg_t arg2,
     1372    sysarg_t arg3)
     1373{
     1374        sysarg_t newphid;
     1375        int rc = async_req_3_5(phone, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
     1376            NULL, NULL, NULL, NULL, &newphid);
     1377       
     1378        if (rc != EOK)
    11241379                return rc;
    1125 
     1380       
    11261381        return newphid;
    11271382}
    11281383
    11291384/** Wrapper for making IPC_M_CONNECT_ME_TO calls using the async framework.
    1130  * 
     1385 *
    11311386 * Ask through phone for a new connection to some service and block until
    11321387 * success.
    11331388 *
    1134  * @param phoneid       Phone handle used for contacting the other side.
    1135  * @param arg1          User defined argument.
    1136  * @param arg2          User defined argument.
    1137  * @param arg3          User defined argument.
    1138  *
    1139  * @return              New phone handle on success or a negative error code.
    1140  */
    1141 int
    1142 async_connect_me_to_blocking(int phoneid, ipcarg_t arg1, ipcarg_t arg2,
    1143     ipcarg_t arg3)
    1144 {
    1145         int rc;
    1146         ipcarg_t newphid;
    1147 
    1148         rc = async_req_4_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
     1389 * @param phoneid Phone handle used for contacting the other side.
     1390 * @param arg1    User defined argument.
     1391 * @param arg2    User defined argument.
     1392 * @param arg3    User defined argument.
     1393 *
     1394 * @return New phone handle on success or a negative error code.
     1395 *
     1396 */
     1397int async_connect_me_to_blocking(int phoneid, sysarg_t arg1, sysarg_t arg2,
     1398    sysarg_t arg3)
     1399{
     1400        sysarg_t newphid;
     1401        int rc = async_req_4_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3,
    11491402            IPC_FLAG_BLOCKING, NULL, NULL, NULL, NULL, &newphid);
    11501403       
    1151         if (rc != EOK) 
     1404        if (rc != EOK)
    11521405                return rc;
    1153 
     1406       
    11541407        return newphid;
    11551408}
    11561409
    1157 /** Wrapper for making IPC_M_SHARE_IN calls using the async framework.
    1158  *
    1159  * @param phoneid       Phone that will be used to contact the receiving side.
    1160  * @param dst           Destination address space area base.
    1161  * @param size          Size of the destination address space area.
    1162  * @param arg           User defined argument.
    1163  * @param flags         Storage where the received flags will be stored. Can be
    1164  *                      NULL.
    1165  *
    1166  * @return              Zero on success or a negative error code from errno.h.
    1167  */
    1168 int async_share_in_start(int phoneid, void *dst, size_t size, ipcarg_t arg,
    1169     int *flags)
    1170 {
    1171         int res;
     1410/** Connect to a task specified by id.
     1411 *
     1412 */
     1413int async_connect_kbox(task_id_t id)
     1414{
     1415        return ipc_connect_kbox(id);
     1416}
     1417
     1418/** Wrapper for ipc_hangup.
     1419 *
     1420 * @param phone Phone handle to hung up.
     1421 *
     1422 * @return Zero on success or a negative error code.
     1423 *
     1424 */
     1425int async_hangup(int phone)
     1426{
     1427        return ipc_hangup(phone);
     1428}
     1429
     1430/** Interrupt one thread of this task from waiting for IPC. */
     1431void async_poke(void)
     1432{
     1433        ipc_poke();
     1434}
     1435
     1436/** Wrapper for IPC_M_SHARE_IN calls using the async framework.
     1437 *
     1438 * @param phoneid Phone that will be used to contact the receiving side.
     1439 * @param dst     Destination address space area base.
     1440 * @param size    Size of the destination address space area.
     1441 * @param arg     User defined argument.
     1442 * @param flags   Storage for the received flags. Can be NULL.
     1443 *
     1444 * @return Zero on success or a negative error code from errno.h.
     1445 *
     1446 */
     1447int async_share_in_start(int phoneid, void *dst, size_t size, sysarg_t arg,
     1448    unsigned int *flags)
     1449{
    11721450        sysarg_t tmp_flags;
    1173         res = async_req_3_2(phoneid, IPC_M_SHARE_IN, (ipcarg_t) dst,
    1174             (ipcarg_t) size, arg, NULL, &tmp_flags);
     1451        int res = async_req_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst,
     1452            (sysarg_t) size, arg, NULL, &tmp_flags);
     1453       
    11751454        if (flags)
    1176                 *flags = tmp_flags;
     1455                *flags = (unsigned int) tmp_flags;
     1456       
    11771457        return res;
    11781458}
     
    11801460/** Wrapper for receiving the IPC_M_SHARE_IN calls using the async framework.
    11811461 *
    1182  * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN calls
    1183  * so that the user doesn't have to remember the meaning of each IPC argument.
     1462 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN
     1463 * calls so that the user doesn't have to remember the meaning of each IPC
     1464 * argument.
    11841465 *
    11851466 * So far, this wrapper is to be used from within a connection fibril.
    11861467 *
    1187  * @param callid        Storage where the hash of the IPC_M_SHARE_IN call will
    1188  *                      be stored.
    1189  * @param size          Destination address space area size.   
    1190  *
    1191  * @return              Non-zero on success, zero on failure.
    1192  */
    1193 int async_share_in_receive(ipc_callid_t *callid, size_t *size)
    1194 {
    1195         ipc_call_t data;
    1196        
     1468 * @param callid Storage for the hash of the IPC_M_SHARE_IN call.
     1469 * @param size   Destination address space area size.
     1470 *
     1471 * @return True on success, false on failure.
     1472 *
     1473 */
     1474bool async_share_in_receive(ipc_callid_t *callid, size_t *size)
     1475{
    11971476        assert(callid);
    11981477        assert(size);
    1199 
     1478       
     1479        ipc_call_t data;
    12001480        *callid = async_get_call(&data);
    1201         if (IPC_GET_METHOD(data) != IPC_M_SHARE_IN)
    1202                 return 0;
     1481       
     1482        if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_IN)
     1483                return false;
     1484       
    12031485        *size = (size_t) IPC_GET_ARG2(data);
    1204         return 1;
     1486        return true;
    12051487}
    12061488
    12071489/** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework.
    12081490 *
    1209  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls
    1210  * so that the user doesn't have to remember the meaning of each IPC argument.
    1211  *
    1212  * @param callid        Hash of the IPC_M_DATA_READ call to answer.
    1213  * @param src           Source address space base.
    1214  * @param flags         Flags to be used for sharing. Bits can be only cleared.
    1215  *
    1216  * @return              Zero on success or a value from @ref errno.h on failure.
    1217  */
    1218 int async_share_in_finalize(ipc_callid_t callid, void *src, int flags)
     1491 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ
     1492 * calls so that the user doesn't have to remember the meaning of each IPC
     1493 * argument.
     1494 *
     1495 * @param callid Hash of the IPC_M_DATA_READ call to answer.
     1496 * @param src    Source address space base.
     1497 * @param flags  Flags to be used for sharing. Bits can be only cleared.
     1498 *
     1499 * @return Zero on success or a value from @ref errno.h on failure.
     1500 *
     1501 */
     1502int async_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags)
    12191503{
    12201504        return ipc_share_in_finalize(callid, src, flags);
    12211505}
    12221506
    1223 /** Wrapper for making IPC_M_SHARE_OUT calls using the async framework.
    1224  *
    1225  * @param phoneid       Phone that will be used to contact the receiving side.
    1226  * @param src           Source address space area base address.
    1227  * @param flags         Flags to be used for sharing. Bits can be only cleared.
    1228  *
    1229  * @return              Zero on success or a negative error code from errno.h.
    1230  */
    1231 int async_share_out_start(int phoneid, void *src, int flags)
    1232 {
    1233         return async_req_3_0(phoneid, IPC_M_SHARE_OUT, (ipcarg_t) src, 0,
    1234             (ipcarg_t) flags);
     1507/** Wrapper for IPC_M_SHARE_OUT calls using the async framework.
     1508 *
     1509 * @param phoneid Phone that will be used to contact the receiving side.
     1510 * @param src     Source address space area base address.
     1511 * @param flags   Flags to be used for sharing. Bits can be only cleared.
     1512 *
     1513 * @return Zero on success or a negative error code from errno.h.
     1514 *
     1515 */
     1516int async_share_out_start(int phoneid, void *src, unsigned int flags)
     1517{
     1518        return async_req_3_0(phoneid, IPC_M_SHARE_OUT, (sysarg_t) src, 0,
     1519            (sysarg_t) flags);
    12351520}
    12361521
    12371522/** Wrapper for receiving the IPC_M_SHARE_OUT calls using the async framework.
    12381523 *
    1239  * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT calls
    1240  * so that the user doesn't have to remember the meaning of each IPC argument.
     1524 * This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT
     1525 * calls so that the user doesn't have to remember the meaning of each IPC
     1526 * argument.
    12411527 *
    12421528 * So far, this wrapper is to be used from within a connection fibril.
    12431529 *
    1244  * @param callid        Storage where the hash of the IPC_M_SHARE_OUT call will
    1245  *                      be stored.
    1246  * @param size          Storage where the source address space area size will be
    1247  *                      stored.
    1248  * @param flags         Storage where the sharing flags will be stored.
    1249  *
    1250  * @return              Non-zero on success, zero on failure.
    1251  */
    1252 int async_share_out_receive(ipc_callid_t *callid, size_t *size, int *flags)
    1253 {
    1254         ipc_call_t data;
    1255        
     1530 * @param callid Storage for the hash of the IPC_M_SHARE_OUT call.
     1531 * @param size   Storage for the source address space area size.
     1532 * @param flags  Storage for the sharing flags.
     1533 *
     1534 * @return True on success, false on failure.
     1535 *
     1536 */
     1537bool async_share_out_receive(ipc_callid_t *callid, size_t *size, unsigned int *flags)
     1538{
    12561539        assert(callid);
    12571540        assert(size);
    12581541        assert(flags);
    1259 
     1542       
     1543        ipc_call_t data;
    12601544        *callid = async_get_call(&data);
    1261         if (IPC_GET_METHOD(data) != IPC_M_SHARE_OUT)
    1262                 return 0;
     1545       
     1546        if (IPC_GET_IMETHOD(data) != IPC_M_SHARE_OUT)
     1547                return false;
     1548       
    12631549        *size = (size_t) IPC_GET_ARG2(data);
    1264         *flags = (int) IPC_GET_ARG3(data);
    1265         return 1;
     1550        *flags = (unsigned int) IPC_GET_ARG3(data);
     1551        return true;
    12661552}
    12671553
    12681554/** Wrapper for answering the IPC_M_SHARE_OUT calls using the async framework.
    12691555 *
    1270  * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT calls
    1271  * so that the user doesn't have to remember the meaning of each IPC argument.
    1272  *
    1273  * @param callid        Hash of the IPC_M_DATA_WRITE call to answer.
    1274  * @param dst           Destination address space area base address.   
    1275  *
    1276  * @return              Zero on success or a value from @ref errno.h on failure.
     1556 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT
     1557 * calls so that the user doesn't have to remember the meaning of each IPC
     1558 * argument.
     1559 *
     1560 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.
     1561 * @param dst    Destination address space area base address.
     1562 *
     1563 * @return Zero on success or a value from @ref errno.h on failure.
     1564 *
    12771565 */
    12781566int async_share_out_finalize(ipc_callid_t callid, void *dst)
     
    12811569}
    12821570
    1283 
    1284 /** Wrapper for making IPC_M_DATA_READ calls using the async framework.
    1285  *
    1286  * @param phoneid       Phone that will be used to contact the receiving side.
    1287  * @param dst           Address of the beginning of the destination buffer.
    1288  * @param size          Size of the destination buffer.
    1289  *
    1290  * @return              Zero on success or a negative error code from errno.h.
    1291  */
    1292 int async_data_read_start(int phoneid, void *dst, size_t size)
    1293 {
    1294         return async_req_2_0(phoneid, IPC_M_DATA_READ, (ipcarg_t) dst,
    1295             (ipcarg_t) size);
     1571/** Wrapper for IPC_M_DATA_READ calls using the async framework.
     1572 *
     1573 * @param phoneid Phone that will be used to contact the receiving side.
     1574 * @param dst     Address of the beginning of the destination buffer.
     1575 * @param size    Size of the destination buffer.
     1576 * @param flags   Flags to control the data transfer.
     1577 *
     1578 * @return Zero on success or a negative error code from errno.h.
     1579 *
     1580 */
     1581int
     1582async_data_read_start_generic(int phoneid, void *dst, size_t size, int flags)
     1583{
     1584        return async_req_3_0(phoneid, IPC_M_DATA_READ, (sysarg_t) dst,
     1585            (sysarg_t) size, (sysarg_t) flags);
    12961586}
    12971587
    12981588/** Wrapper for receiving the IPC_M_DATA_READ calls using the async framework.
    12991589 *
    1300  * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ calls
    1301  * so that the user doesn't have to remember the meaning of each IPC argument.
     1590 * This wrapper only makes it more comfortable to receive IPC_M_DATA_READ
     1591 * calls so that the user doesn't have to remember the meaning of each IPC
     1592 * argument.
    13021593 *
    13031594 * So far, this wrapper is to be used from within a connection fibril.
    13041595 *
    1305  * @param callid        Storage where the hash of the IPC_M_DATA_READ call will
    1306  *                      be stored.
    1307  * @param size          Storage where the maximum size will be stored. Can be
    1308  *                      NULL.
    1309  *
    1310  * @return              Non-zero on success, zero on failure.
    1311  */
    1312 int async_data_read_receive(ipc_callid_t *callid, size_t *size)
    1313 {
     1596 * @param callid Storage for the hash of the IPC_M_DATA_READ.
     1597 * @param size   Storage for the maximum size. Can be NULL.
     1598 *
     1599 * @return True on success, false on failure.
     1600 *
     1601 */
     1602bool async_data_read_receive(ipc_callid_t *callid, size_t *size)
     1603{
     1604        assert(callid);
     1605       
    13141606        ipc_call_t data;
    1315        
    1316         assert(callid);
    1317 
    13181607        *callid = async_get_call(&data);
    1319         if (IPC_GET_METHOD(data) != IPC_M_DATA_READ)
    1320                 return 0;
     1608       
     1609        if (IPC_GET_IMETHOD(data) != IPC_M_DATA_READ)
     1610                return false;
     1611       
    13211612        if (size)
    13221613                *size = (size_t) IPC_GET_ARG2(data);
    1323         return 1;
     1614       
     1615        return true;
    13241616}
    13251617
    13261618/** Wrapper for answering the IPC_M_DATA_READ calls using the async framework.
    13271619 *
    1328  * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls
    1329  * so that the user doesn't have to remember the meaning of each IPC argument.
    1330  *
    1331  * @param callid        Hash of the IPC_M_DATA_READ call to answer.
    1332  * @param src           Source address for the IPC_M_DATA_READ call.
    1333  * @param size          Size for the IPC_M_DATA_READ call. Can be smaller than
    1334  *                      the maximum size announced by the sender.
    1335  *
    1336  * @return              Zero on success or a value from @ref errno.h on failure.
     1620 * This wrapper only makes it more comfortable to answer IPC_M_DATA_READ
     1621 * calls so that the user doesn't have to remember the meaning of each IPC
     1622 * argument.
     1623 *
     1624 * @param callid Hash of the IPC_M_DATA_READ call to answer.
     1625 * @param src    Source address for the IPC_M_DATA_READ call.
     1626 * @param size   Size for the IPC_M_DATA_READ call. Can be smaller than
     1627 *               the maximum size announced by the sender.
     1628 *
     1629 * @return Zero on success or a value from @ref errno.h on failure.
     1630 *
    13371631 */
    13381632int async_data_read_finalize(ipc_callid_t callid, const void *src, size_t size)
     
    13431637/** Wrapper for forwarding any read request
    13441638 *
    1345  *
    1346  */
    1347 int async_data_read_forward_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
    1348     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr)
     1639 */
     1640int async_data_read_forward_fast(int phoneid, sysarg_t method, sysarg_t arg1,
     1641    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr)
    13491642{
    13501643        ipc_callid_t callid;
     
    13691662        }
    13701663       
    1371         ipcarg_t rc;
     1664        sysarg_t rc;
    13721665        async_wait_for(msg, &rc);
    13731666       
     
    13751668}
    13761669
    1377 /** Wrapper for making IPC_M_DATA_WRITE calls using the async framework.
     1670/** Wrapper for IPC_M_DATA_WRITE calls using the async framework.
    13781671 *
    13791672 * @param phoneid Phone that will be used to contact the receiving side.
    13801673 * @param src     Address of the beginning of the source buffer.
    13811674 * @param size    Size of the source buffer.
     1675 * @param flags   Flags to control the data transfer.
    13821676 *
    13831677 * @return Zero on success or a negative error code from errno.h.
    13841678 *
    13851679 */
    1386 int async_data_write_start(int phoneid, const void *src, size_t size)
    1387 {
    1388         return async_req_2_0(phoneid, IPC_M_DATA_WRITE, (ipcarg_t) src,
    1389             (ipcarg_t) size);
     1680int
     1681async_data_write_start_generic(int phoneid, const void *src, size_t size,
     1682    int flags)
     1683{
     1684        return async_req_3_0(phoneid, IPC_M_DATA_WRITE, (sysarg_t) src,
     1685            (sysarg_t) size, (sysarg_t) flags);
    13901686}
    13911687
    13921688/** Wrapper for receiving the IPC_M_DATA_WRITE calls using the async framework.
    13931689 *
    1394  * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE calls
    1395  * so that the user doesn't have to remember the meaning of each IPC argument.
     1690 * This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE
     1691 * calls so that the user doesn't have to remember the meaning of each IPC
     1692 * argument.
    13961693 *
    13971694 * So far, this wrapper is to be used from within a connection fibril.
    13981695 *
    1399  * @param callid Storage where the hash of the IPC_M_DATA_WRITE call will
    1400  *               be stored.
    1401  * @param size   Storage where the suggested size will be stored. May be
    1402  *               NULL
    1403  *
    1404  * @return Non-zero on success, zero on failure.
    1405  *
    1406  */
    1407 int async_data_write_receive(ipc_callid_t *callid, size_t *size)
    1408 {
     1696 * @param callid Storage for the hash of the IPC_M_DATA_WRITE.
     1697 * @param size   Storage for the suggested size. May be NULL.
     1698 *
     1699 * @return True on success, false on failure.
     1700 *
     1701 */
     1702bool async_data_write_receive(ipc_callid_t *callid, size_t *size)
     1703{
     1704        assert(callid);
     1705       
    14091706        ipc_call_t data;
    1410        
    1411         assert(callid);
    1412        
    14131707        *callid = async_get_call(&data);
    1414         if (IPC_GET_METHOD(data) != IPC_M_DATA_WRITE)
    1415                 return 0;
     1708       
     1709        if (IPC_GET_IMETHOD(data) != IPC_M_DATA_WRITE)
     1710                return false;
    14161711       
    14171712        if (size)
    14181713                *size = (size_t) IPC_GET_ARG2(data);
    14191714       
    1420         return 1;
     1715        return true;
    14211716}
    14221717
    14231718/** Wrapper for answering the IPC_M_DATA_WRITE calls using the async framework.
    14241719 *
    1425  * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE calls
    1426  * so that the user doesn't have to remember the meaning of each IPC argument.
     1720 * This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE
     1721 * calls so that the user doesn't have to remember the meaning of each IPC
     1722 * argument.
    14271723 *
    14281724 * @param callid Hash of the IPC_M_DATA_WRITE call to answer.
     
    15201816 *
    15211817 */
    1522 void async_data_write_void(const int retval)
     1818void async_data_write_void(sysarg_t retval)
    15231819{
    15241820        ipc_callid_t callid;
     
    15291825/** Wrapper for forwarding any data that is about to be received
    15301826 *
    1531  *
    1532  */
    1533 int async_data_write_forward_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
    1534     ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr)
     1827 */
     1828int async_data_write_forward_fast(int phoneid, sysarg_t method, sysarg_t arg1,
     1829    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, ipc_call_t *dataptr)
    15351830{
    15361831        ipc_callid_t callid;
     
    15551850        }
    15561851       
    1557         ipcarg_t rc;
     1852        sysarg_t rc;
    15581853        async_wait_for(msg, &rc);
    15591854       
Note: See TracChangeset for help on using the changeset viewer.