Skip to content

Commit 16440e5

Browse files
committed
Decrease locking time in messages
1 parent 7ac3282 commit 16440e5

1 file changed

Lines changed: 23 additions & 16 deletions

File tree

kernel/src/kernel/ipc/message.cpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

185183
void _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

202204
void _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

221228
g_message_queue* _messageGetQueue(g_tid receiver)

0 commit comments

Comments
 (0)