summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/message_queue.cpp9
-rw-r--r--core/message_queue.h4
-rw-r--r--editor/progress_dialog.cpp5
3 files changed, 18 insertions, 0 deletions
diff --git a/core/message_queue.cpp b/core/message_queue.cpp
index 7c3bdfec53..27da2c099a 100644
--- a/core/message_queue.cpp
+++ b/core/message_queue.cpp
@@ -271,6 +271,8 @@ void MessageQueue::flush() {
//using reverse locking strategy
_THREAD_SAFE_LOCK_
+ flushing = true;
+
while (read_pos < buffer_end) {
//lock on each iteration, so a call can re-add itself to the message queue
@@ -327,13 +329,20 @@ void MessageQueue::flush() {
}
buffer_end = 0; // reset buffer
+ flushing = false;
_THREAD_SAFE_UNLOCK_
}
+bool MessageQueue::is_flushing() const {
+
+ return flushing;
+}
+
MessageQueue::MessageQueue() {
ERR_FAIL_COND(singleton != NULL);
singleton = this;
+ flushing = false;
buffer_end = 0;
buffer_max_used = 0;
diff --git a/core/message_queue.h b/core/message_queue.h
index 696b8e2997..2515eb4a98 100644
--- a/core/message_queue.h
+++ b/core/message_queue.h
@@ -72,6 +72,8 @@ class MessageQueue {
static MessageQueue *singleton;
+ bool flushing;
+
public:
static MessageQueue *get_singleton();
@@ -87,6 +89,8 @@ public:
void statistics();
void flush();
+ bool is_flushing() const;
+
int get_max_buffer_usage() const;
MessageQueue();
diff --git a/editor/progress_dialog.cpp b/editor/progress_dialog.cpp
index d2378f33ed..5fdc725f50 100644
--- a/editor/progress_dialog.cpp
+++ b/editor/progress_dialog.cpp
@@ -166,6 +166,11 @@ void ProgressDialog::_popup() {
void ProgressDialog::add_task(const String &p_task, const String &p_label, int p_steps, bool p_can_cancel) {
+ if (MessageQueue::get_singleton()->is_flushing()) {
+ ERR_PRINT("Do not use progress dialog (task) while flushing the message queue or using call_deferred()!");
+ return;
+ }
+
ERR_FAIL_COND(tasks.has(p_task));
ProgressDialog::Task t;
t.vb = memnew(VBoxContainer);