From 327f61eacfd899ac0b35edbc39d01ebc0621b443 Mon Sep 17 00:00:00 2001 From: hogliux Date: Mon, 20 Feb 2017 20:03:18 +0000 Subject: [PATCH] Fixed a dead-lock which could occur if an OpenGLContext was created and immedietely deleted before it had a chance to render --- modules/juce_opengl/opengl/juce_OpenGLContext.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp index c1e421097c..2539712b84 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp @@ -112,7 +112,14 @@ public: { // make sure everything has finished executing destroying.set (1); - execute (new DoNothingWorker(), true, true); + + if (workQueue.size() > 0) + { + if (! renderThread->contains (this)) + resume(); + + execute (new DoNothingWorker(), true, true); + } pause(); renderThread = nullptr; @@ -417,8 +424,10 @@ public: JobStatus runJob() override { { + MessageLockWorker worker (*this); + // Allow the message thread to finish setting-up the context before using it.. - MessageManagerLock mml (this); + MessageManagerLock mml (worker); if (! mml.lockWasGained()) return ThreadPoolJob::jobHasFinished; } @@ -579,6 +588,8 @@ public: OpenGLContext::AsyncWorker::Ptr worker = (blocker != nullptr ? blocker : static_cast (workerToUse)); workQueue.add (worker); + context.triggerRepaint(); + if (blocker != nullptr) blocker->block(); }