CtrlCore: MT related fix [critical]

git-svn-id: svn://ultimatepp.org/upp/trunk@1979 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2010-01-29 13:29:17 +00:00
parent f6efbc2fb0
commit 10d60182b4
3 changed files with 20 additions and 9 deletions

View file

@ -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));

View file

@ -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);

View file

@ -746,6 +746,7 @@ bool Ctrl::IsWaitingEvent()
bool Ctrl::ProcessEvent(bool *quit)
{
ASSERT(IsMainThread());
if(DoCall())
return false;
if(EndSession())