diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2017-05-18 18:52:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-18 18:52:55 +0200 |
commit | 1f62c331412f7f89bae7655c50cbbdf99f972082 (patch) | |
tree | d1e92a3a30c9346dc1aa2881f2853d9c346da42c | |
parent | 1877a31a860a6fadf0f14d15098a359f80457883 (diff) | |
parent | 983fd3a7bbb6ac0e02ffcca78d60053ec8847aee (diff) |
Merge pull request #8807 from RandomShaper/mq-flush-reentrant
Make MessageQueue::flush() reentrant
-rw-r--r-- | core/message_queue.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/core/message_queue.cpp b/core/message_queue.cpp index fa1c8112cc..d7d31b6c1e 100644 --- a/core/message_queue.cpp +++ b/core/message_queue.cpp @@ -318,12 +318,19 @@ void MessageQueue::flush() { while (read_pos < buffer_end) { - _THREAD_SAFE_UNLOCK_ - //lock on each interation, so a call can re-add itself to the message queue Message *message = (Message *)&buffer[read_pos]; + uint32_t advance = sizeof(Message); + if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) + advance += sizeof(Variant) * message->args; + + //pre-advance so this function is reentrant + read_pos += advance; + + _THREAD_SAFE_UNLOCK_ + Object *target = ObjectDB::get_instance(message->instance_ID); if (target != NULL) { @@ -359,13 +366,9 @@ void MessageQueue::flush() { } } - uint32_t advance = sizeof(Message); - if ((message->type & FLAG_MASK) != TYPE_NOTIFICATION) - advance += sizeof(Variant) * message->args; message->~Message(); _THREAD_SAFE_LOCK_ - read_pos += advance; } buffer_end = 0; // reset buffer |