| Index: src/Thread.cpp |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/src/Thread.cpp |
| @@ -0,0 +1,105 @@ |
| +#include "Thread.h" |
| + |
| +using namespace AdblockPlus; |
| + |
| +namespace |
| +{ |
| + void CallRun(Thread* thread) |
| + { |
| + thread->Run(); |
| + } |
| +} |
| + |
| +Thread::Mutex::Mutex() |
| +{ |
| +#ifdef WIN32 |
| + InitializeCriticalSection(&nativeMutex); |
| +#else |
| + pthread_mutex_init(&nativeMutex, 0); |
| +#endif |
| +} |
| + |
| +Thread::Mutex::~Mutex() |
| +{ |
| + Unlock(); |
|
Wladimir Palant
2013/04/03 13:14:47
That's a race condition - you unlock the mutex so
Felix Dahlke
2013/04/03 16:27:59
Both DeleteCriticalSection and pthread_mutex_destr
Wladimir Palant
2013/04/03 19:30:16
To me it sounds like AutoLock is a better solution
Felix Dahlke
2013/04/04 02:52:58
Yeah, you're probably right. I was planning to wra
|
| +#ifdef WIN32 |
| + DeleteCriticalSection(&nativeMutex); |
| +#else |
| + pthread_mutex_destroy(&nativeMutex); |
| +#endif |
| +} |
| + |
| +void Thread::Mutex::Lock() |
| +{ |
| +#ifdef WIN32 |
| + EnterCriticalSection(&nativeMutex); |
| +#else |
| + pthread_mutex_lock(&nativeMutex); |
| +#endif |
| +} |
| + |
| +void Thread::Mutex::Unlock() |
| +{ |
| +#ifdef WIN32 |
| + LeaveCriticalSection(&nativeMutex); |
| +#else |
| + pthread_mutex_unlock(&nativeMutex); |
| +#endif |
| +} |
|
Wladimir Palant
2013/04/03 13:14:47
I would be in favor of an AutoLock helper class th
Felix Dahlke
2013/04/03 16:27:59
Agreed, that's neat. I'll add one later with a new
|
| + |
| +Thread::Condition::Condition() |
| +{ |
| +#ifdef WIN32 |
| + InitializeConditionVariable(&nativeCondition); |
| +#else |
| + pthread_cond_init(&nativeCondition, 0); |
| +#endif |
| +} |
| + |
| +Thread::Condition::~Condition() |
| +{ |
| +#ifndef WIN32 |
| + Signal(); |
|
Wladimir Palant
2013/04/03 13:14:47
This is a race condition again. Why would we want
Felix Dahlke
2013/04/03 16:27:59
As above, to avoid undefined behaviour.
Wladimir Palant
2013/04/03 19:30:16
I think that not destroying conditions that are st
Felix Dahlke
2013/04/04 02:52:58
Yeah, same as above, removed the Signal() call.
|
| + pthread_cond_destroy(&nativeCondition); |
| +#endif |
| +} |
| + |
| +void Thread::Condition::Wait(Thread::Mutex& mutex) |
| +{ |
| +#ifdef WIN32 |
| + SleepConditionVariableCS(&nativeCondition, &mutex.nativeMutex, INFINITE); |
| +#else |
| + pthread_cond_wait(&nativeCondition, &mutex.nativeMutex); |
| +#endif |
| +} |
| + |
| +void Thread::Condition::Signal() |
| +{ |
| +#ifdef WIN32 |
| + WakeConditionVariable(&nativeCondition); |
| +#else |
| + pthread_cond_signal(&nativeCondition); |
| +#endif |
| +} |
| + |
| +Thread::~Thread() |
| +{ |
| +} |
| + |
| +void Thread::Start() |
| +{ |
| +#ifdef WIN32 |
| + CreateThread(0, 0, &CallRun, 0, this, &thread); |
|
Wladimir Palant
2013/04/03 13:14:47
Wrong order of parameters? |this| should passed as
Felix Dahlke
2013/04/03 16:27:59
Yep, I somehow mixed that up and didn't manage to
|
| +#else |
| + pthread_create(&thread, 0, (void *(*)(void*)) &CallRun, this); |
| +#endif |
| +} |
| + |
| +void Thread::Join() |
| +{ |
| +#ifdef WIN32 |
| + WaitForSingleObject(thread, INFINITE); |
| +#else |
| + pthread_join(thread, 0); |
| +#endif |
| +} |