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