* Insert message to the back of the message queue. */
| 232 | * Insert message to the back of the message queue. |
| 233 | */ |
| 234 | Error |
| 235 | sendMessage(phys_ptr<MessageQueue> queue, |
| 236 | Message message, |
| 237 | MessageFlags flags) |
| 238 | { |
| 239 | while (queue->used == queue->size) { |
| 240 | if (flags & MessageFlags::NonBlocking) { |
| 241 | return Error::Max; |
| 242 | } |
| 243 | |
| 244 | internal::sleepThread(phys_addrof(queue->sendQueue)); |
| 245 | internal::reschedule(); |
| 246 | |
| 247 | auto thread = internal::getCurrentThread(); |
| 248 | if (thread->context.queueWaitResult != Error::OK) { |
| 249 | return thread->context.queueWaitResult; |
| 250 | } |
| 251 | } |
| 252 | |
| 253 | auto index = (queue->first + queue->used) % queue->size; |
| 254 | queue->messages[index] = message; |
| 255 | queue->used++; |
| 256 | |
| 257 | internal::wakeupOneThread(phys_addrof(queue->receiveQueue), Error::OK); |
| 258 | internal::reschedule(); |
| 259 | return Error::OK; |
| 260 | } |
| 261 | |
| 262 | |
| 263 | /** |
no test coverage detected