From: Matthias Kruk Date: Sat, 4 Apr 2020 15:57:57 +0000 (+0900) Subject: kernel/core: Make mailbox_get() return -EINTR if the call to sem_wait() failed X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=d416bbc58f70e557873bff6440d7851eaad97f32;p=corax kernel/core: Make mailbox_get() return -EINTR if the call to sem_wait() failed --- diff --git a/kernel/core/mailbox.c b/kernel/core/mailbox.c index 1167995..1510e02 100644 --- a/kernel/core/mailbox.c +++ b/kernel/core/mailbox.c @@ -94,16 +94,18 @@ int mailbox_get(struct mailbox *mbox, void **dst) * This function always succeeds, so we don't have to * check its return value. */ - sem_wait(&(mbox->mb_rsem)); + ret_val = sem_wait(&(mbox->mb_rsem)); - /* retrieve the message */ - *dst = mbox->mb_msg; - - /* - * Rendevouz with the sender: Let them know we have - * received their message. - */ - ret_val = sem_post(&(mbox->mb_ssem)); + if(!ret_val) { + /* retrieve the message */ + *dst = mbox->mb_msg; + + /* + * Rendevouz with the sender: Let them know we have + * received their message. + */ + ret_val = sem_post(&(mbox->mb_ssem)); + } } return(ret_val); diff --git a/kernel/core/mailbox.h b/kernel/core/mailbox.h index b5c50be..1f585d9 100644 --- a/kernel/core/mailbox.h +++ b/kernel/core/mailbox.h @@ -148,10 +148,14 @@ int mailbox_put(struct mailbox*, void*); * message can be retrieved. The sending and receiving tasks will * rendevouz during the message transmission, meaning that the sender * will wait for the message to be retrieved by a receiving task. + * If a signal is delivered to the task while it is waiting for a + * message to be put into the mailbox, this function will return early, + * leaving the mailbox unmodified. * * RETURN VALUE * 0 A message was successfully retrieved from the mailbox * -EINVAL Invalid mailbox specified + * -EINTR The function call was interrupted by a signal * -EOVERFLOW An overflow occured during the rendevouz. This error * means that the mailbox was overwritten with invalid * data due to a kernel bug