cocoa: Prevent a deadlock when using SIMPLE_THREADS on macOS

Closes #491
Fixes #490
This commit is contained in:
Donny Lawrence 2018-12-26 22:46:29 +01:00 committed by rdb
parent 862906b86d
commit f29643dd14
4 changed files with 21 additions and 5 deletions

View File

@ -50,8 +50,8 @@ public:
FrameBufferProperties _fbprops;
CVDisplayLinkRef _display_link = nullptr;
Mutex _swap_lock;
ConditionVar _swap_condition;
TrueMutexImpl _swap_lock;
TrueConditionVarImpl _swap_condition;
AtomicAdjust::Integer _last_wait_frame = 0;
protected:

View File

@ -37,8 +37,9 @@ display_link_cb(CVDisplayLinkRef link, const CVTimeStamp *now,
const CVTimeStamp* output_time, CVOptionFlags flags_in,
CVOptionFlags *flags_out, void *context) {
CocoaGraphicsStateGuardian *gsg = (CocoaGraphicsStateGuardian *)context;
MutexHolder swap_holder(gsg->_swap_lock);
gsg->_swap_lock.lock();
gsg->_swap_condition.notify();
gsg->_swap_lock.unlock();
return kCVReturnSuccess;
}
@ -73,8 +74,9 @@ CocoaGraphicsStateGuardian::
if (_display_link != nil) {
CVDisplayLinkRelease(_display_link);
_display_link = nil;
MutexHolder swap_holder(_swap_lock);
_swap_lock.lock();
_swap_condition.notify();
_swap_lock.unlock();
}
if (_context != nil) {
[_context clearDrawable];

View File

@ -277,8 +277,9 @@ end_flip() {
if (_vsync_enabled) {
AtomicAdjust::Integer cur_frame = ClockObject::get_global_clock()->get_frame_count();
if (AtomicAdjust::set(cocoagsg->_last_wait_frame, cur_frame) != cur_frame) {
MutexHolder swap_holder(cocoagsg->_swap_lock);
cocoagsg->_swap_lock.lock();
cocoagsg->_swap_condition.wait();
cocoagsg->_swap_lock.unlock();
}
}

View File

@ -50,4 +50,17 @@ typedef ConditionVarPosixImpl ConditionVarFullImpl;
#endif
#if defined(WIN32_VC)
#include "conditionVarWin32Impl.h"
typedef ConditionVarWin32Impl TrueConditionVarImpl;
#elif defined(HAVE_POSIX_THREADS)
#include "conditionVarPosixImpl.h"
typedef ConditionVarPosixImpl TrueConditionVarImpl;
#else
// No true threads, sorry. Better not try to use 'em.
#endif
#endif