diff --git a/core/msg.c b/core/msg.c index 45999420b7..1afa19eb76 100644 --- a/core/msg.c +++ b/core/msg.c @@ -298,7 +298,7 @@ static int _msg_receive(msg_t *m, int block) } /* no message, fail */ - if ((!block) && (queue_index == -1)) { + if ((!block) && ((!me->msg_waiters.first) && (queue_index == -1))) { restoreIRQ(state); return -1; } diff --git a/tests/msg_try_receive/Makefile b/tests/msg_try_receive/Makefile new file mode 100644 index 0000000000..d071f60e62 --- /dev/null +++ b/tests/msg_try_receive/Makefile @@ -0,0 +1,4 @@ +APPLICATION = msg_try_receive +include ../Makefile.tests_common + +include $(RIOTBASE)/Makefile.include diff --git a/tests/msg_try_receive/main.c b/tests/msg_try_receive/main.c new file mode 100644 index 0000000000..ce64d89b89 --- /dev/null +++ b/tests/msg_try_receive/main.c @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2016 Kaspar Schleiser + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief msg_try_receive regression test application + * + * @author Kaspar Schleiser + * + * @} + */ + +#include +#include "thread.h" + +#include "msg.h" + +static kernel_pid_t _main_pid; + +static char stack[THREAD_STACKSIZE_MAIN]; +static void *second_thread(void *arg) +{ + (void) arg; + msg_t test; + puts("sending message..."); + msg_send(&test, _main_pid); + + return NULL; +} + +int main(void) +{ + printf("main starting\n"); + + _main_pid = thread_getpid(); + + thread_create(stack, + sizeof(stack), + THREAD_PRIORITY_MAIN - 1, + 0, + second_thread, + NULL, + "second_thread"); + + msg_t m; + printf("msg available: %i (should be 1!)\n", msg_try_receive(&m)); + + return 0; +}