Changeset 6deb2cd in mainline


Ignore:
Timestamp:
2017-12-08T21:17:27Z (6 years ago)
Author:
Jiří Zárevúcky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9233e9d
Parents:
125c09c
git-author:
Jiří Zárevúcky <zarevucky.jiri@…> (2017-12-07 16:46:52)
git-committer:
Jiří Zárevúcky <zarevucky.jiri@…> (2017-12-08 21:17:27)
Message:

Return capability handle in SYS_IPC_WAIT via call data structure, separately from error codes.

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/ipc/ipc.h

    r125c09c r6deb2cd  
    110110        /** User-defined label */
    111111        sysarg_t label;
     112        /** Capability handle */
     113        cap_handle_t cap_handle;
    112114} ipc_data_t;
    113115
  • kernel/generic/src/ipc/sysipc.c

    r125c09c r6deb2cd  
    744744 *                 for explanation.
    745745 *
    746  * @return Capability handle of the received request.
    747  * @return CAP_NIL for answers, notifications and when there is no call.
    748746 * @return Negative error code on error.
    749747 */
     
    767765
    768766        if (!call) {
    769                 STRUCT_TO_USPACE(calldata, &(ipc_data_t){});
    770                 return CAP_NIL;
     767                ipc_data_t data = {0};
     768                data.cap_handle = CAP_NIL;
     769                STRUCT_TO_USPACE(calldata, &data);
     770                return EOK;
    771771        }
    772772       
     
    776776               
    777777                call->data.flags = IPC_CALL_NOTIF;
     778                call->data.cap_handle = CAP_NIL;
    778779
    779780                STRUCT_TO_USPACE(calldata, &call->data);
    780781                kobject_put(call->kobject);
    781782               
    782                 return CAP_NIL;
     783                return EOK;
    783784        }
    784785       
     
    792793
    793794                call->data.flags = IPC_CALL_ANSWERED;
     795                call->data.cap_handle = CAP_NIL;
    794796               
    795797                STRUCT_TO_USPACE(calldata, &call->data);
    796798                kobject_put(call->kobject);
    797799               
    798                 return CAP_NIL;
     800                return EOK;
    799801        }
    800802       
     
    809811        }
    810812       
     813        call->data.cap_handle = handle;
     814
    811815        /*
    812816         * Include phone hash of the caller in the request, copy the whole
     
    819823        kobject_add_ref(call->kobject);
    820824        cap_publish(TASK, handle, call->kobject);
    821         return handle;
     825        return EOK;
    822826
    823827error:
  • uspace/lib/c/generic/async.c

    r125c09c r6deb2cd  
    14831483               
    14841484                ipc_call_t call;
    1485                 cap_handle_t chandle = ipc_wait_cycle(&call, timeout, flags);
     1485                int rc = ipc_wait_cycle(&call, timeout, flags);
    14861486               
    14871487                atomic_dec(&threads_in_ipc_wait);
    14881488               
    1489                 assert(chandle >= 0);
    1490 
    1491                 if (chandle == CAP_NIL) {
     1489                assert(rc == EOK);
     1490
     1491                if (call.cap_handle == CAP_NIL) {
    14921492                        if (call.flags == 0) {
    14931493                                /* This neither a notification nor an answer. */
     
    15001500                        continue;
    15011501
    1502                 handle_call(chandle, &call);
     1502                handle_call(call.cap_handle, &call);
    15031503        }
    15041504
  • uspace/lib/c/generic/ipc.c

    r125c09c r6deb2cd  
    254254 * @param usec   Timeout in microseconds
    255255 * @param flags  Flags passed to SYS_IPC_WAIT (blocking, nonblocking).
    256  *
    257  * @return  Call handle.
    258  * @return  Negative error code.
    259  */
    260 cap_handle_t ipc_wait_cycle(ipc_call_t *call, sysarg_t usec, unsigned int flags)
    261 {
    262         cap_handle_t chandle =
    263             __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, usec, flags);
     256 * @param[out] out_handle  Call handle.
     257 *
     258 * @return  Error code.
     259 */
     260int ipc_wait_cycle(ipc_call_t *call, sysarg_t usec, unsigned int flags)
     261{
     262        int rc = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, usec, flags);
    264263       
    265264        /* Handle received answers */
    266         if ((chandle == CAP_NIL) && (call->flags & IPC_CALL_ANSWERED))
     265        if ((rc == EOK) && (call->cap_handle == CAP_NIL) &&
     266            (call->flags & IPC_CALL_ANSWERED)) {
    267267                handle_answer(call);
    268        
    269         return chandle;
     268        }
     269       
     270        return rc;
    270271}
    271272
     
    285286 * @param usec  Timeout in microseconds
    286287 *
    287  * @return  Call handle.
    288  * @return  Negative error code.
    289  *
    290  */
    291 cap_handle_t ipc_wait_for_call_timeout(ipc_call_t *call, sysarg_t usec)
    292 {
    293         cap_handle_t chandle;
     288 * @return  Error code.
     289 *
     290 */
     291int ipc_wait_for_call_timeout(ipc_call_t *call, sysarg_t usec)
     292{
     293        int rc;
    294294       
    295295        do {
    296                 chandle = ipc_wait_cycle(call, usec, SYNCH_FLAGS_NONE);
    297         } while ((chandle == CAP_NIL) && (call->flags & IPC_CALL_ANSWERED));
    298        
    299         return chandle;
     296                rc = ipc_wait_cycle(call, usec, SYNCH_FLAGS_NONE);
     297        } while ((rc == EOK) && (call->cap_handle == CAP_NIL) && (call->flags & IPC_CALL_ANSWERED));
     298       
     299        return rc;
    300300}
    301301
     
    306306 * @param call  Incoming call storage.
    307307 *
    308  * @return  Call handle.
    309  * @return  Negative error code.
    310  *
    311  */
    312 cap_handle_t ipc_trywait_for_call(ipc_call_t *call)
    313 {
    314         cap_handle_t chandle;
     308 * @return  Error code.
     309 *
     310 */
     311int ipc_trywait_for_call(ipc_call_t *call)
     312{
     313        int rc;
    315314       
    316315        do {
    317                 chandle = ipc_wait_cycle(call, SYNCH_NO_TIMEOUT,
     316                rc = ipc_wait_cycle(call, SYNCH_NO_TIMEOUT,
    318317                    SYNCH_FLAGS_NON_BLOCKING);
    319         } while ((chandle == CAP_NIL) && (call->flags & IPC_CALL_ANSWERED));
    320        
    321         return chandle;
     318        } while ((rc == EOK) && (call->cap_handle == CAP_NIL) && (call->flags & IPC_CALL_ANSWERED));
     319       
     320        return rc;
    322321}
    323322
  • uspace/lib/c/include/ipc/common.h

    r125c09c r6deb2cd  
    5252        unsigned flags;
    5353        struct async_call *label;
     54        cap_handle_t cap_handle;
    5455} ipc_call_t;
    5556
  • uspace/lib/c/include/ipc/ipc.h

    r125c09c r6deb2cd  
    4848typedef void (*ipc_async_callback_t)(void *, int, ipc_call_t *);
    4949
    50 extern cap_handle_t ipc_wait_cycle(ipc_call_t *, sysarg_t, unsigned int);
     50extern int ipc_wait_cycle(ipc_call_t *, sysarg_t, unsigned int);
    5151extern void ipc_poke(void);
    5252
     
    5454        ipc_wait_for_call_timeout(data, SYNCH_NO_TIMEOUT);
    5555
    56 extern cap_handle_t ipc_wait_for_call_timeout(ipc_call_t *, sysarg_t);
    57 extern cap_handle_t ipc_trywait_for_call(ipc_call_t *);
     56extern int ipc_wait_for_call_timeout(ipc_call_t *, sysarg_t);
     57extern int ipc_trywait_for_call(ipc_call_t *);
    5858
    5959/*
Note: See TracChangeset for help on using the changeset viewer.