Ignore:
File:
1 edited

Legend:

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

    rd7978525 rc170438  
    8181LIST_INITIALIZE(queued_calls);
    8282
    83 static atomic_t ipc_futex = FUTEX_INITIALIZER;
     83static futex_t ipc_futex = FUTEX_INITIALIZER;
    8484
    8585/** Send asynchronous message via syscall.
     
    9696}
    9797
    98 /** Prolog for ipc_call_async_*() functions.
     98/** Prologue for ipc_call_async_*() functions.
    9999 *
    100100 * @param private  Argument for the answer/error callback.
     
    122122}
    123123
    124 /** Epilog for ipc_call_async_*() functions.
     124/** Epilogue for ipc_call_async_*() functions.
    125125 *
    126126 * @param callid      Value returned by the SYS_IPC_CALL_ASYNC_* syscall.
    127127 * @param phoneid     Phone handle through which the call was made.
    128128 * @param call        Structure returned by ipc_prepare_async().
    129  * @param can_preempt If true, the current fibril can be preempted
    130  *                    in this call.
    131  *
    132129 */
    133130static inline void ipc_finish_async(ipc_callid_t callid, int phoneid,
    134     async_call_t *call, bool can_preempt)
     131    async_call_t *call)
    135132{
    136133        if (!call) {
    137134                /* Nothing to do regardless if failed or not */
    138                 futex_up(&ipc_futex);
     135                futex_unlock(&ipc_futex);
    139136                return;
    140137        }
    141138       
    142139        if (callid == (ipc_callid_t) IPC_CALLRET_FATAL) {
    143                 futex_up(&ipc_futex);
     140                futex_unlock(&ipc_futex);
    144141               
    145142                /* Call asynchronous handler with error code */
     
    152149       
    153150        if (callid == (ipc_callid_t) IPC_CALLRET_TEMPORARY) {
    154                 futex_up(&ipc_futex);
     151                futex_unlock(&ipc_futex);
    155152               
    156153                call->u.msg.phoneid = phoneid;
     
    159156                list_append(&call->list, &queued_calls);
    160157               
    161                 if (can_preempt) {
    162                         call->fid = fibril_get_id();
    163                         fibril_switch(FIBRIL_TO_MANAGER);
    164                         /* Async futex unlocked by previous call */
    165                 } else {
    166                         call->fid = 0;
    167                         futex_up(&async_futex);
    168                 }
     158                call->fid = fibril_get_id();
     159                fibril_switch(FIBRIL_TO_MANAGER);
     160                /* Async futex unlocked by previous call */
    169161               
    170162                return;
     
    175167        /* Add call to the list of dispatched calls */
    176168        list_append(&call->list, &dispatched_calls);
    177         futex_up(&ipc_futex);
     169        futex_unlock(&ipc_futex);
    178170}
    179171
     
    197189 * @param private     Argument to be passed to the answer/error callback.
    198190 * @param callback    Answer or error callback.
    199  * @param can_preempt If true, the current fibril will be preempted in
    200  *                    case the kernel temporarily refuses to accept more
    201  *                    asynchronous calls.
    202  *
    203191 */
    204192void ipc_call_async_fast(int phoneid, sysarg_t imethod, sysarg_t arg1,
    205193    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, void *private,
    206     ipc_async_callback_t callback, bool can_preempt)
     194    ipc_async_callback_t callback)
    207195{
    208196        async_call_t *call = NULL;
     
    219207         */
    220208       
    221         futex_down(&ipc_futex);
     209        futex_lock(&ipc_futex);
    222210        ipc_callid_t callid = __SYSCALL6(SYS_IPC_CALL_ASYNC_FAST, phoneid,
    223211            imethod, arg1, arg2, arg3, arg4);
     
    226214                if (!call) {
    227215                        call = ipc_prepare_async(private, callback);
    228                         if (!call)
     216                        if (!call) {
     217                                futex_unlock(&ipc_futex);
    229218                                return;
     219                        }
    230220                }
    231221               
     
    244234        }
    245235       
    246         ipc_finish_async(callid, phoneid, call, can_preempt);
     236        ipc_finish_async(callid, phoneid, call);
    247237}
    248238
     
    264254 * @param private     Argument to be passed to the answer/error callback.
    265255 * @param callback    Answer or error callback.
    266  * @param can_preempt If true, the current fibril will be preempted in
    267  *                    case the kernel temporarily refuses to accept more
    268  *                    asynchronous calls.
    269  *
    270256 */
    271257void ipc_call_async_slow(int phoneid, sysarg_t imethod, sysarg_t arg1,
    272258    sysarg_t arg2, sysarg_t arg3, sysarg_t arg4, sysarg_t arg5, void *private,
    273     ipc_async_callback_t callback, bool can_preempt)
     259    ipc_async_callback_t callback)
    274260{
    275261        async_call_t *call = ipc_prepare_async(private, callback);
     
    289275         */
    290276       
    291         futex_down(&ipc_futex);
     277        futex_lock(&ipc_futex);
    292278        ipc_callid_t callid =
    293279            ipc_call_async_internal(phoneid, &call->u.msg.data);
    294280       
    295         ipc_finish_async(callid, phoneid, call, can_preempt);
     281        ipc_finish_async(callid, phoneid, call);
    296282}
    297283
     
    373359                futex_up(&async_futex);
    374360               
    375                 if (call->fid)
    376                         fibril_add_ready(call->fid);
     361                assert(call->fid);
     362                fibril_add_ready(call->fid);
    377363               
    378364                if (callid == (ipc_callid_t) IPC_CALLRET_FATAL) {
     
    384370                        call->u.callid = callid;
    385371                       
    386                         futex_down(&ipc_futex);
     372                        futex_lock(&ipc_futex);
    387373                        list_append(&call->list, &dispatched_calls);
    388                         futex_up(&ipc_futex);
     374                        futex_unlock(&ipc_futex);
    389375                }
    390376               
     
    412398        callid &= ~IPC_CALLID_ANSWERED;
    413399       
    414         futex_down(&ipc_futex);
     400        futex_lock(&ipc_futex);
    415401       
    416402        link_t *item;
     
    423409                        list_remove(&call->list);
    424410                       
    425                         futex_up(&ipc_futex);
     411                        futex_unlock(&ipc_futex);
    426412                       
    427413                        if (call->callback)
     
    434420        }
    435421       
    436         futex_up(&ipc_futex);
     422        futex_unlock(&ipc_futex);
    437423}
    438424
Note: See TracChangeset for help on using the changeset viewer.