mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-08-21 22:04:56 -06:00
CtrlCore: MT related fix [critical]
git-svn-id: svn://ultimatepp.org/upp/trunk@1979 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
f6efbc2fb0
commit
10d60182b4
3 changed files with 20 additions and 9 deletions
|
|
@ -1,6 +1,6 @@
|
|||
#include "CtrlCore.h"
|
||||
|
||||
#define LLOG(x) // LOG(x)
|
||||
#define LLOG(x) // if(!IsMainThread()) DLOG((int)GetCurrentThreadId() << " " << x)
|
||||
|
||||
NAMESPACE_UPP
|
||||
|
||||
|
|
@ -11,26 +11,26 @@ static StaticMutex NonMainLock;
|
|||
|
||||
void EnterGuiMutex()
|
||||
{
|
||||
LLOG("Thread " << IsMainThread() << " trying to lock");
|
||||
LLOG("Thread " << IsMainThread() << " trying to lock" << ", nonmain: " << NonMain);
|
||||
bool nonmain = !IsMainThread();
|
||||
if(nonmain)
|
||||
NonMainLock.Enter();
|
||||
EnterGMutex();
|
||||
if(nonmain)
|
||||
NonMain++;
|
||||
LLOG("Thread " << IsMainThread() << " LOCK");
|
||||
LLOG("Thread " << IsMainThread() << " LOCK" << ", nonmain: " << NonMain);
|
||||
}
|
||||
|
||||
void LeaveGuiMutex()
|
||||
{
|
||||
LLOG("Thread " << IsMainThread() << " trying to unlock");
|
||||
LLOG("Thread " << IsMainThread() << " trying to unlock" << ", nonmain: " << NonMain);
|
||||
bool nonmain = !IsMainThread();
|
||||
if(nonmain)
|
||||
NonMain--;
|
||||
LeaveGMutex();
|
||||
if(nonmain)
|
||||
NonMainLock.Leave();
|
||||
LLOG("Thread " << IsMainThread() << " UNLOCK");
|
||||
LLOG("Thread " << IsMainThread() << " UNLOCK" << ", nonmain: " << NonMain);
|
||||
}
|
||||
|
||||
struct Ctrl::CallBox {
|
||||
|
|
@ -46,14 +46,19 @@ void Ctrl::PerformCall(Ctrl::CallBox *cbox)
|
|||
}
|
||||
|
||||
Callback Ctrl::CtrlCall;
|
||||
static Mutex CtrlCallMutex;
|
||||
|
||||
void WakeUpGuiThread();
|
||||
|
||||
bool Ctrl::DoCall()
|
||||
{
|
||||
LLOG("DoCall");
|
||||
CtrlCall();
|
||||
CtrlCall.Clear();
|
||||
GuiLock __;
|
||||
{
|
||||
Mutex::Lock __(CtrlCallMutex);
|
||||
CtrlCall();
|
||||
CtrlCall.Clear();
|
||||
}
|
||||
LLOG("--- DoCall, nonmain: " << NonMain);
|
||||
return NonMain;
|
||||
}
|
||||
|
|
@ -64,9 +69,13 @@ void Ctrl::ICall(Callback cb)
|
|||
if(IsMainThread())
|
||||
cb();
|
||||
else {
|
||||
GuiLock __;
|
||||
CallBox cbox;
|
||||
cbox.cb = cb;
|
||||
CtrlCall = callback1(PerformCall, &cbox);
|
||||
{
|
||||
Mutex::Lock __(CtrlCallMutex);
|
||||
CtrlCall = callback1(PerformCall, &cbox);
|
||||
}
|
||||
int level = LeaveGMutexAll();
|
||||
WakeUpGuiThread();
|
||||
LLOG("Waiting for semaphore");
|
||||
|
|
@ -82,6 +91,7 @@ void Ctrl::Call(Callback cb)
|
|||
if(IsMainThread())
|
||||
cb();
|
||||
else {
|
||||
GuiLock __;
|
||||
CallBox cbox;
|
||||
cbox.cb = cb;
|
||||
UPP::PostCallback(callback1(PerformCall, &cbox));
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ NAMESPACE_UPP
|
|||
|
||||
#ifdef PLATFORM_WIN32
|
||||
|
||||
#define LLOG(x) // LOG(x)
|
||||
#define LLOG(x) LOG(x)
|
||||
|
||||
int GetClipboardFormatCode(const char *format_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -746,6 +746,7 @@ bool Ctrl::IsWaitingEvent()
|
|||
|
||||
bool Ctrl::ProcessEvent(bool *quit)
|
||||
{
|
||||
ASSERT(IsMainThread());
|
||||
if(DoCall())
|
||||
return false;
|
||||
if(EndSession())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue