diff options
| author | Pedro J. Estébanez | 2017-05-18 13:01:12 +0200 |
|---|---|---|
| committer | Pedro J. Estébanez | 2017-05-18 13:01:12 +0200 |
| commit | fa4b09f63da63cade61c03d72e6844874f996f29 (patch) | |
| tree | d10f19efbcee3af7572d5eca5b05ba39f098c289 /core/message_queue.cpp | |
| parent | 21bf3778d5c291e1587cddb154a5cc0e02b0aecc (diff) | |
| download | godot-fa4b09f63da63cade61c03d72e6844874f996f29.tar.gz godot-fa4b09f63da63cade61c03d72e6844874f996f29.tar.zst godot-fa4b09f63da63cade61c03d72e6844874f996f29.zip | |
Diffstat (limited to 'core/message_queue.cpp')
| -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 821414be0..ce7708efe 100644 --- a/core/message_queue.cpp +++ b/core/message_queue.cpp @@ -316,12 +316,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) { @@ -357,13 +364,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 |
