Changeset acf6b55 in mainline


Ignore:
Timestamp:
2018-07-05T16:20:43Z (6 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
058c240
Parents:
bd9e868
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-04 23:32:32)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-05 16:20:43)
Message:

Make it possible for uspace to determine why SYS_IPC_WAIT returned.

Files:
5 edited

Legend:

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

    rbd9e868 racf6b55  
    193193extern errno_t ipc_call_sync(phone_t *, call_t *);
    194194extern errno_t ipc_call(phone_t *, call_t *);
    195 extern call_t *ipc_wait_for_call(answerbox_t *, uint32_t, unsigned int);
     195extern errno_t ipc_wait_for_call(answerbox_t *, uint32_t, unsigned int, call_t **);
    196196extern errno_t ipc_forward(call_t *, phone_t *, answerbox_t *, unsigned int);
    197197extern void ipc_answer(answerbox_t *, call_t *);
  • kernel/generic/src/ipc/ipc.c

    rbd9e868 racf6b55  
    230230        }
    231231
    232         call_t *answer = ipc_wait_for_call(mybox, SYNCH_NO_TIMEOUT,
    233             SYNCH_FLAGS_INTERRUPTIBLE);
     232        call_t *answer = NULL;
     233        (void) ipc_wait_for_call(mybox, SYNCH_NO_TIMEOUT,
     234            SYNCH_FLAGS_INTERRUPTIBLE, &answer);
    234235        if (!answer) {
    235236
     
    267268                         * now.
    268269                         */
    269                         answer = ipc_wait_for_call(mybox, SYNCH_NO_TIMEOUT,
    270                             SYNCH_FLAGS_NONE);
     270                        (void) ipc_wait_for_call(mybox, SYNCH_NO_TIMEOUT,
     271                            SYNCH_FLAGS_NONE, &answer);
    271272                }
    272273        }
     
    536537 *              waitq_sleep_timeout() for description of its special
    537538 *              meaning.
    538  *
    539  * @return Recived call structure or NULL.
     539 * @param call  Received call structure or NULL.
     540 *
     541 * @return Error code from waitq_sleep_timeout.
     542 *         ENOENT if sleep returns successfully, but there is no call.
    540543 *
    541544 * To distinguish between a call and an answer, have a look at call->flags.
    542545 *
    543546 */
    544 call_t *ipc_wait_for_call(answerbox_t *box, uint32_t usec, unsigned int flags)
     547errno_t ipc_wait_for_call(answerbox_t *box, uint32_t usec, unsigned int flags,
     548    call_t **call)
    545549{
    546550        call_t *request;
     
    552556        rc = waitq_sleep_timeout(&box->wq, usec, flags, NULL);
    553557        if (rc != EOK)
    554                 return NULL;
     558                return rc;
    555559
    556560        irq_spinlock_lock(&box->lock, true);
     
    594598                 */
    595599                irq_spinlock_unlock(&box->lock, true);
    596                 return NULL;
     600                return ENOENT;
    597601        }
    598602
     
    605609        irq_spinlock_unlock(&TASK->lock, true);
    606610
    607         return request;
     611        *call = request;
     612        return EOK;
    608613}
    609614
     
    779784{
    780785        while (atomic_get(&TASK->answerbox.active_calls) != 0) {
    781                 call_t *call = ipc_wait_for_call(&TASK->answerbox,
    782                     SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE);
     786                call_t *call = NULL;
     787                if (ipc_wait_for_call(&TASK->answerbox,
     788                    SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE, &call) == ENOENT)
     789                        continue;
     790                assert(call);
    783791                assert(call->flags & (IPC_CALL_ANSWERED | IPC_CALL_NOTIF));
    784792
  • kernel/generic/src/ipc/kbox.c

    rbd9e868 racf6b55  
    168168
    169169        while (!done) {
    170                 call_t *call = ipc_wait_for_call(&TASK->kb.box, SYNCH_NO_TIMEOUT,
    171                     SYNCH_FLAGS_NONE);
     170                call_t *call = NULL;
     171                (void) ipc_wait_for_call(&TASK->kb.box, SYNCH_NO_TIMEOUT,
     172                    SYNCH_FLAGS_NONE, &call);
    172173
    173174                if (call == NULL)
  • kernel/generic/src/ipc/sysipc.c

    rbd9e868 racf6b55  
    751751    unsigned int flags)
    752752{
    753         call_t *call;
     753        call_t *call = NULL;
    754754
    755755restart:
     
    759759#endif
    760760
    761         call = ipc_wait_for_call(&TASK->answerbox, usec,
    762             flags | SYNCH_FLAGS_INTERRUPTIBLE);
     761        errno_t rc = ipc_wait_for_call(&TASK->answerbox, usec,
     762            flags | SYNCH_FLAGS_INTERRUPTIBLE, &call);
    763763
    764764#ifdef CONFIG_UDEBUG
     
    766766#endif
    767767
    768         if (!call) {
    769                 ipc_data_t data = { };
    770                 data.cap_handle = CAP_NIL;
    771                 STRUCT_TO_USPACE(calldata, &data);
    772                 return EOK;
    773         }
     768        if (rc != EOK)
     769                return rc;
     770
     771        assert(call);
    774772
    775773        call->data.flags = call->flags;
     
    806804
    807805        cap_handle_t handle = CAP_NIL;
    808         errno_t rc = cap_alloc(TASK, &handle);
     806        rc = cap_alloc(TASK, &handle);
    809807        if (rc != EOK) {
    810808                goto error;
  • uspace/lib/c/generic/async/server.c

    rbd9e868 racf6b55  
    11991199                atomic_dec(&threads_in_ipc_wait);
    12001200
    1201                 assert(rc == EOK);
    1202                 handle_call(&call);
     1201                if (rc == EOK)
     1202                        handle_call(&call);
    12031203        }
    12041204
Note: See TracChangeset for help on using the changeset viewer.