From d19a69cd0d22dfbe802286baf8b33ebb8c6f4fa2 Mon Sep 17 00:00:00 2001 From: sapier Date: Sat, 30 Nov 2013 01:51:54 +0100 Subject: [PATCH] Fix broken thread stop handling --- src/jthread/jthread.h | 2 ++ src/jthread/pthread/jthread.cpp | 13 ++++++++++++- src/jthread/win32/jthread.cpp | 13 ++++++++++++- src/script/lua_api/l_async_events.cpp | 11 +++++++---- src/script/lua_api/l_async_events.h | 2 ++ 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/jthread/jthread.h b/src/jthread/jthread.h index 92b05f1c..867701c7 100644 --- a/src/jthread/jthread.h +++ b/src/jthread/jthread.h @@ -47,6 +47,7 @@ public: int Kill(); virtual void *Thread() = 0; bool IsRunning(); + bool StopRequested(); void *GetReturnValue(); bool IsSameThread(); protected: @@ -69,6 +70,7 @@ private: #endif // WIN32 void *retval; bool running; + bool requeststop; JMutex runningmutex; JMutex continuemutex,continuemutex2; diff --git a/src/jthread/pthread/jthread.cpp b/src/jthread/pthread/jthread.cpp index 2980e26b..c4d9162c 100644 --- a/src/jthread/pthread/jthread.cpp +++ b/src/jthread/pthread/jthread.cpp @@ -34,6 +34,7 @@ JThread::JThread() { retval = NULL; mutexinit = false; + requeststop = false; running = false; } @@ -44,7 +45,7 @@ JThread::~JThread() void JThread::Stop() { runningmutex.Lock(); - running = false; + requeststop = true; runningmutex.Unlock(); } @@ -78,6 +79,7 @@ int JThread::Start() runningmutex.Unlock(); return ERR_JTHREAD_ALREADYRUNNING; } + requeststop = false; runningmutex.Unlock(); pthread_attr_t attr; @@ -141,6 +143,15 @@ bool JThread::IsRunning() return r; } +bool JThread::StopRequested() { + bool r; + + runningmutex.Lock(); + r = requeststop; + runningmutex.Unlock(); + return r; +} + void *JThread::GetReturnValue() { void *val; diff --git a/src/jthread/win32/jthread.cpp b/src/jthread/win32/jthread.cpp index 1cf4f93a..e56c1627 100644 --- a/src/jthread/win32/jthread.cpp +++ b/src/jthread/win32/jthread.cpp @@ -35,6 +35,7 @@ JThread::JThread() { retval = NULL; mutexinit = false; + requeststop = false; running = false; } @@ -45,7 +46,7 @@ JThread::~JThread() void JThread::Stop() { runningmutex.Lock(); - running = false; + requeststop = false; runningmutex.Unlock(); } @@ -76,6 +77,7 @@ int JThread::Start() runningmutex.Unlock(); return ERR_JTHREAD_ALREADYRUNNING; } + requeststop = false;e runningmutex.Unlock(); continuemutex.Lock(); @@ -134,6 +136,15 @@ bool JThread::IsRunning() return r; } +bool JThread::StopRequested() { + bool r; + + runningmutex.Lock(); + r = requeststop; + runningmutex.Unlock(); + return r; +} + void *JThread::GetReturnValue() { void *val; diff --git a/src/script/lua_api/l_async_events.cpp b/src/script/lua_api/l_async_events.cpp index cc4644cd..63ca87ae 100644 --- a/src/script/lua_api/l_async_events.cpp +++ b/src/script/lua_api/l_async_events.cpp @@ -149,9 +149,11 @@ LuaJobInfo AsyncEngine::getJob() { m_JobQueueMutex.Lock(); LuaJobInfo retval; + retval.valid = false; if (m_JobQueue.size() != 0) { retval = m_JobQueue.front(); + retval.valid = true; m_JobQueue.erase((m_JobQueue.begin())); } m_JobQueueMutex.Unlock(); @@ -322,11 +324,12 @@ void* AsyncWorkerThread::worker_thread_main() { assert("no future with broken builtin async environment scripts" == 0); } /** main loop **/ - while(IsRunning()) { + while(!StopRequested()) { //wait for job LuaJobInfo toprocess = m_JobDispatcher->getJob(); - if (!IsRunning()) { continue; } + if (toprocess.valid == false) { continue; } + if (StopRequested()) { continue; } //first push error handler lua_pushcfunction(m_LuaStack, script_error_handler); @@ -350,7 +353,7 @@ void* AsyncWorkerThread::worker_thread_main() { toprocess.serializedParams.c_str(), toprocess.serializedParams.length()); - if (!IsRunning()) { continue; } + if (StopRequested()) { continue; } if(lua_pcall(m_LuaStack, 2, 2, errorhandler)) { scriptError("Async WORKER thread: %s\n", lua_tostring(m_LuaStack, -1)); toprocess.serializedResult="ERROR"; @@ -362,7 +365,7 @@ void* AsyncWorkerThread::worker_thread_main() { toprocess.serializedResult = std::string(retval,lenght); } - if (!IsRunning()) { continue; } + if (StopRequested()) { continue; } //put job result m_JobDispatcher->putJobResult(toprocess); } diff --git a/src/script/lua_api/l_async_events.h b/src/script/lua_api/l_async_events.h index 347d9c0f..079a0800 100644 --- a/src/script/lua_api/l_async_events.h +++ b/src/script/lua_api/l_async_events.h @@ -57,6 +57,8 @@ struct LuaJobInfo { std::string serializedResult; /** jobid used to identify a job and match it to callback **/ unsigned int JobId; + /** valid marker **/ + bool valid; }; /** class encapsulating a asynchronous working environment **/ -- 2.30.2