From c3ba66781d7ad4398fde2bde6eb6df40ceed2d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= <rene.kijewski@fu-berlin.de> Date: Fri, 7 Nov 2014 12:32:15 +0100 Subject: [PATCH] core: put more intelligence into `queue_msg()` Fixes #1942. There were two instances were it was not checked the target thread has a message queue before queuing the message. This PR centralizes the check into `queue_msg()`. --- core/msg.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/core/msg.c b/core/msg.c index 905edc9ce0..aa82b3a930 100644 --- a/core/msg.c +++ b/core/msg.c @@ -39,17 +39,23 @@ static int _msg_receive(msg_t *m, int block); static int _msg_send(msg_t *m, kernel_pid_t target_pid, bool block); - -static int queue_msg(tcb_t *target, msg_t *m) +static int queue_msg(tcb_t *target, const msg_t *m) { - int n = cib_put(&(target->msg_queue)); + if (target->msg_array == NULL) { + DEBUG("queue_msg(): no message queue present\n"); + return 0; + } - if (n != -1) { - target->msg_array[n] = *m; - return 1; + int n = cib_put(&(target->msg_queue)); + if (n < 0) { + DEBUG("queue_msg(): message queue is full\n"); + return 0; } - return 0; + DEBUG("queue_msg(): queuing message\n"); + msg_t *dest = &target->msg_array[n]; + *dest = *m; + return 1; } int msg_send(msg_t *m, kernel_pid_t target_pid) { @@ -92,7 +98,7 @@ static int _msg_send(msg_t *m, kernel_pid_t target_pid, bool block) if (target->status != STATUS_RECEIVE_BLOCKED) { DEBUG("msg_send() %s:%i: Target %" PRIkernel_pid " is not RECEIVE_BLOCKED.\n", __FILE__, __LINE__, target_pid); - if (target->msg_array && queue_msg(target, m)) { + if (queue_msg(target, m)) { DEBUG("msg_send() %s:%i: Target %" PRIkernel_pid " has a msg_queue. Queueing message.\n", __FILE__, __LINE__, target_pid); eINT(); if (sched_active_thread->status == STATUS_REPLY_BLOCKED) { -- GitLab