Skip to content
Snippets Groups Projects
Commit d19a69cd authored by sapier's avatar sapier
Browse files

Fix broken thread stop handling

parent d02ce1cf
No related branches found
No related tags found
No related merge requests found
......@@ -47,6 +47,7 @@ class JThread
int Kill();
virtual void *Thread() = 0;
bool IsRunning();
bool StopRequested();
void *GetReturnValue();
bool IsSameThread();
protected:
......@@ -69,6 +70,7 @@ class JThread
#endif // WIN32
void *retval;
bool running;
bool requeststop;
JMutex runningmutex;
JMutex continuemutex,continuemutex2;
......
......@@ -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;
......
......@@ -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;
......
......@@ -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);
}
......
......@@ -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 **/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment