Changeset 0cc4313 in mainline for uspace/lib/libc/generic/async.c


Ignore:
Timestamp:
2007-11-22T15:50:24Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d40a8ff
Parents:
8498915
Message:

Modify the async framework to make use of all six syscall arguments.
Supply user-friendly macros as in previous cases.

File:
1 edited

Legend:

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

    r8498915 r0cc4313  
    102102#include <sys/time.h>
    103103#include <arch/barrier.h>
     104#include <bool.h>
    104105
    105106atomic_t async_futex = FUTEX_INITIALIZER;
     
    176177 * disabled.
    177178 */
    178 __thread int in_interrupt_handler;
     179__thread int _in_interrupt_handler;
    179180
    180181static void default_client_connection(ipc_callid_t callid, ipc_call_t *call);
     
    190191 */
    191192static async_client_conn_t interrupt_received = default_interrupt_received;
     193
     194/*
     195 * Getter for _in_interrupt_handler. We need to export the value of this thread
     196 * local variable to other modules, but the binutils 2.18 linkers die on an
     197 * attempt to export this symbol in the header file. For now, consider this as a
     198 * workaround.
     199 */
     200bool in_interrupt_handler(void)
     201{
     202        return _in_interrupt_handler;
     203}
    192204
    193205#define CONN_HASH_TABLE_CHAINS  32
     
    518530        /* Unrouted call - do some default behaviour */
    519531        if ((callid & IPC_CALLID_NOTIFICATION)) {
    520                 in_interrupt_handler = 1;
     532                _in_interrupt_handler = 1;
    521533                (*interrupt_received)(callid, call);
    522                 in_interrupt_handler = 0;
     534                _in_interrupt_handler = 0;
    523535                return;
    524536        }               
     
    717729 * @param arg1          Service-defined payload argument.
    718730 * @param arg2          Service-defined payload argument.
     731 * @param arg3          Service-defined payload argument.
     732 * @param arg4          Service-defined payload argument.
    719733 * @param dataptr       If non-NULL, storage where the reply data will be
    720734 *                      stored.
     
    722736 * @return              Hash of the sent message.
    723737 */
    724 aid_t async_send_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
    725     ipc_call_t *dataptr)
     738aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
     739    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr)
    726740{
    727741        amsg_t *msg;
    728742
    729         if (in_interrupt_handler) {
     743        if (_in_interrupt_handler) {
    730744                printf("Cannot send asynchronous request in interrupt "
    731745                    "handler.\n");
     
    740754        msg->wdata.active = 1;
    741755                               
    742         ipc_call_async_2(phoneid, method, arg1, arg2, msg, reply_received, 1);
     756        ipc_call_async_4(phoneid, method, arg1, arg2, arg3, arg4, msg,
     757            reply_received, 1);
    743758
    744759        return (aid_t) msg;
     
    755770 * @param arg2          Service-defined payload argument.
    756771 * @param arg3          Service-defined payload argument.
     772 * @param arg4          Service-defined payload argument.
     773 * @param arg5          Service-defined payload argument.
    757774 * @param dataptr       If non-NULL, storage where the reply data will be
    758775 *                      stored.
     
    760777 * @return              Hash of the sent message.
    761778 */
    762 aid_t async_send_3(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2,
    763     ipcarg_t arg3, ipc_call_t *dataptr)
     779aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
     780    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5,
     781    ipc_call_t *dataptr)
    764782{
    765783        amsg_t *msg;
    766784
    767         if (in_interrupt_handler) {
     785        if (_in_interrupt_handler) {
    768786                printf("Cannot send asynchronous request in interrupt "
    769787                    "handler.\n");
     
    777795        /* We may sleep in next method, but it will use its own mechanism */
    778796        msg->wdata.active = 1;
    779                                
    780         ipc_call_async_3(phoneid, method, arg1, arg2, arg3, msg, reply_received,
    781             1);
     797
     798        ipc_call_async_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, msg,
     799            reply_received, 1);
    782800
    783801        return (aid_t) msg;
     
    867885        amsg_t *msg;
    868886       
    869         if (in_interrupt_handler) {
     887        if (_in_interrupt_handler) {
    870888                printf("Cannot call async_usleep in interrupt handler.\n");
    871889                _exit(1);
     
    909927}
    910928
    911 /* Primitive functions for simple communication */
    912 void async_msg_3(int phoneid, ipcarg_t method, ipcarg_t arg1,
    913                  ipcarg_t arg2, ipcarg_t arg3)
    914 {
    915         ipc_call_async_3(phoneid, method, arg1, arg2, arg3, NULL, NULL,
    916             !in_interrupt_handler);
    917 }
    918 
    919 void async_msg_2(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2)
    920 {
    921         ipc_call_async_2(phoneid, method, arg1, arg2, NULL, NULL,
    922             !in_interrupt_handler);
     929/** Pseudo-synchronous message sending - fast version.
     930 *
     931 * Send message asynchronously and return only after the reply arrives.
     932 *
     933 * This function can only transfer 4 register payload arguments. For
     934 * transferring more arguments, see the slower async_req_slow().
     935 *
     936 * @param phoneid       Hash of the phone through which to make the call.
     937 * @param method        Method of the call.
     938 * @param arg1          Service-defined payload argument.
     939 * @param arg2          Service-defined payload argument.
     940 * @param arg3          Service-defined payload argument.
     941 * @param arg4          Service-defined payload argument.
     942 * @param r1            If non-NULL, storage for the 1st reply argument.
     943 * @param r2            If non-NULL, storage for the 2nd reply argument.
     944 * @param r3            If non-NULL, storage for the 3rd reply argument.
     945 * @param r4            If non-NULL, storage for the 4th reply argument.
     946 * @param r5            If non-NULL, storage for the 5th reply argument.
     947 * @return              Return code of the reply or a negative error code.
     948 */
     949ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
     950    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2,
     951    ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5)
     952{
     953        ipc_call_t result;
     954        ipcarg_t rc;
     955
     956        aid_t eid = async_send_4(phoneid, method, arg1, arg2, arg3, arg4,
     957            &result);
     958        async_wait_for(eid, &rc);
     959        if (r1)
     960                *r1 = IPC_GET_ARG1(result);
     961        if (r2)
     962                *r2 = IPC_GET_ARG2(result);
     963        if (r3)
     964                *r3 = IPC_GET_ARG3(result);
     965        if (r4)
     966                *r4 = IPC_GET_ARG4(result);
     967        if (r5)
     968                *r5 = IPC_GET_ARG5(result);
     969        return rc;
     970}
     971
     972/** Pseudo-synchronous message sending - slow version.
     973 *
     974 * Send message asynchronously and return only after the reply arrives.
     975 *
     976 * @param phoneid       Hash of the phone through which to make the call.
     977 * @param method        Method of the call.
     978 * @param arg1          Service-defined payload argument.
     979 * @param arg2          Service-defined payload argument.
     980 * @param arg3          Service-defined payload argument.
     981 * @param arg4          Service-defined payload argument.
     982 * @param arg5          Service-defined payload argument.
     983 * @param r1            If non-NULL, storage for the 1st reply argument.
     984 * @param r2            If non-NULL, storage for the 2nd reply argument.
     985 * @param r3            If non-NULL, storage for the 3rd reply argument.
     986 * @param r4            If non-NULL, storage for the 4th reply argument.
     987 * @param r5            If non-NULL, storage for the 5th reply argument.
     988 * @return              Return code of the reply or a negative error code.
     989 */
     990ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
     991    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1,
     992    ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5)
     993{
     994        ipc_call_t result;
     995        ipcarg_t rc;
     996
     997        aid_t eid = async_send_5(phoneid, method, arg1, arg2, arg3, arg4, arg5,
     998            &result);
     999        async_wait_for(eid, &rc);
     1000        if (r1)
     1001                *r1 = IPC_GET_ARG1(result);
     1002        if (r2)
     1003                *r2 = IPC_GET_ARG2(result);
     1004        if (r3)
     1005                *r3 = IPC_GET_ARG3(result);
     1006        if (r4)
     1007                *r4 = IPC_GET_ARG4(result);
     1008        if (r5)
     1009                *r5 = IPC_GET_ARG5(result);
     1010        return rc;
    9231011}
    9241012
Note: See TracChangeset for help on using the changeset viewer.