@@ -45,17 +45,17 @@ g_message_send_status messageSend(g_tid sender, g_tid receiver, void* content, u
4545 g_message_transaction tx)
4646{
4747 if (length > G_MESSAGE_MAXIMUM_LENGTH)
48- {
4948 return G_MESSAGE_SEND_STATUS_EXCEEDS_MAXIMUM;
50- }
5149
52- auto queue = _messageGetQueue (receiver);
50+ g_message_send_status status;
51+ uint32_t len = sizeof (g_message_header) + length;
5352
53+ auto queue = _messageGetQueue (receiver);
5454 mutexAcquire (&queue->lock );
55+ bool queueFull = queue->size + len > G_MESSAGE_MAXIMUM_QUEUE_CONTENT;
56+ mutexRelease (&queue->lock );
5557
56- g_message_send_status status;
57- uint32_t len = sizeof (g_message_header) + length;
58- if (queue->size + len > G_MESSAGE_MAXIMUM_QUEUE_CONTENT)
58+ if (queueFull)
5959 {
6060 status = G_MESSAGE_SEND_STATUS_QUEUE_FULL;
6161 }
@@ -71,7 +71,6 @@ g_message_send_status messageSend(g_tid sender, g_tid receiver, void* content, u
7171 status = G_MESSAGE_SEND_STATUS_SUCCESSFUL;
7272 }
7373
74- mutexRelease (&queue->lock );
7574 return status;
7675}
7776
@@ -90,7 +89,6 @@ g_message_receive_status messageReceive(g_tid receiver, g_message_header* out, u
9089 }
9190
9291 mutexAcquire (&queue->lock );
93-
9492 g_message_header* message = queue->head ;
9593 while (message)
9694 {
@@ -99,18 +97,19 @@ g_message_receive_status messageReceive(g_tid receiver, g_message_header* out, u
9997
10098 message = message->next ;
10199 }
100+ mutexRelease (&queue->lock );
102101
103102 g_message_receive_status status;
104103 if (message)
105104 {
106- uint32_t len = sizeof (g_message_header) + message->length ;
105+ int32_t len = sizeof (g_message_header) + message->length ;
107106 if (len > max)
108107 {
109108 status = G_MESSAGE_RECEIVE_STATUS_EXCEEDS_BUFFER_SIZE;
110109 }
111110 else
112111 {
113- memoryCopy (( void *) out, message, len);
112+ memoryCopy (out, message, len);
114113 _messageRemoveFromQueue (queue, message);
115114 heapFree (message);
116115 waitQueueWake (&queue->waitersSend );
@@ -122,7 +121,6 @@ g_message_receive_status messageReceive(g_tid receiver, g_message_header* out, u
122121 status = G_MESSAGE_RECEIVE_STATUS_QUEUE_EMPTY;
123122 }
124123
125- mutexRelease (&queue->lock );
126124 return status;
127125}
128126
@@ -184,6 +182,8 @@ void _messageWakeWaitingReceiver(g_message_queue* queue)
184182
185183void _messageRemoveFromQueue (g_message_queue* queue, g_message_header* message)
186184{
185+ mutexAcquire (&queue->lock );
186+
187187 queue->size -= sizeof (g_message_header) + message->length ;
188188
189189 if (message == queue->head )
@@ -197,25 +197,32 @@ void _messageRemoveFromQueue(g_message_queue* queue, g_message_header* message)
197197
198198 if (message->previous )
199199 message->previous ->next = message->next ;
200+
201+ mutexRelease (&queue->lock );
200202}
201203
202204void _messageAddToQueueTail (g_message_queue* queue, g_message_header* message)
203205{
206+ mutexAcquire (&queue->lock );
207+
204208 queue->size += sizeof (g_message_header) + message->length ;
205209
206210 message->next = 0 ;
207- if (!queue->head )
211+ if (queue->head )
212+ {
213+ message->previous = queue->tail ;
214+ queue->tail ->next = message;
215+ queue->tail = message;
216+ }
217+ else
208218 {
209219 queue->head = message;
210220 queue->tail = message;
211221 message->previous = 0 ;
212222 message->next = 0 ;
213- return ;
214223 }
215224
216- message->previous = queue->tail ;
217- queue->tail ->next = message;
218- queue->tail = message;
225+ mutexRelease (&queue->lock );
219226}
220227
221228g_message_queue* _messageGetQueue (g_tid receiver)
0 commit comments