You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-13 13:31:48 +00:00
Make MessageQueue::flush() reentrant
This commit is contained in:
@@ -318,12 +318,19 @@ void MessageQueue::flush() {
|
|||||||
|
|
||||||
while (read_pos < buffer_end) {
|
while (read_pos < buffer_end) {
|
||||||
|
|
||||||
_THREAD_SAFE_UNLOCK_
|
|
||||||
|
|
||||||
//lock on each interation, so a call can re-add itself to the message queue
|
//lock on each interation, so a call can re-add itself to the message queue
|
||||||
|
|
||||||
Message *message = (Message *)&buffer[read_pos];
|
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);
|
Object *target = ObjectDB::get_instance(message->instance_ID);
|
||||||
|
|
||||||
if (target != NULL) {
|
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();
|
message->~Message();
|
||||||
|
|
||||||
_THREAD_SAFE_LOCK_
|
_THREAD_SAFE_LOCK_
|
||||||
read_pos += advance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_end = 0; // reset buffer
|
buffer_end = 0; // reset buffer
|
||||||
|
|||||||
Reference in New Issue
Block a user