| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #include "Thread.h" | |
| 2 | |
| 3 using namespace AdblockPlus; | |
| 4 | |
| 5 namespace | |
| 6 { | |
| 7 void CallRun(Thread* thread) | |
| 8 { | |
| 9 thread->Run(); | |
| 10 } | |
| 11 } | |
| 12 | |
| 13 Thread::Mutex::Mutex() | |
| 14 { | |
| 15 #ifdef WIN32 | |
| 16 InitializeCriticalSection(&nativeMutex); | |
| 17 #else | |
| 18 pthread_mutex_init(&nativeMutex, 0); | |
| 19 #endif | |
| 20 } | |
| 21 | |
| 22 Thread::Mutex::~Mutex() | |
| 23 { | |
| 24 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
| |
| 25 #ifdef WIN32 | |
| 26 DeleteCriticalSection(&nativeMutex); | |
| 27 #else | |
| 28 pthread_mutex_destroy(&nativeMutex); | |
| 29 #endif | |
| 30 } | |
| 31 | |
| 32 void Thread::Mutex::Lock() | |
| 33 { | |
| 34 #ifdef WIN32 | |
| 35 EnterCriticalSection(&nativeMutex); | |
| 36 #else | |
| 37 pthread_mutex_lock(&nativeMutex); | |
| 38 #endif | |
| 39 } | |
| 40 | |
| 41 void Thread::Mutex::Unlock() | |
| 42 { | |
| 43 #ifdef WIN32 | |
| 44 LeaveCriticalSection(&nativeMutex); | |
| 45 #else | |
| 46 pthread_mutex_unlock(&nativeMutex); | |
| 47 #endif | |
| 48 } | |
|
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
| |
| 49 | |
| 50 Thread::Condition::Condition() | |
| 51 { | |
| 52 #ifdef WIN32 | |
| 53 InitializeConditionVariable(&nativeCondition); | |
| 54 #else | |
| 55 pthread_cond_init(&nativeCondition, 0); | |
| 56 #endif | |
| 57 } | |
| 58 | |
| 59 Thread::Condition::~Condition() | |
| 60 { | |
| 61 #ifndef WIN32 | |
| 62 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.
| |
| 63 pthread_cond_destroy(&nativeCondition); | |
| 64 #endif | |
| 65 } | |
| 66 | |
| 67 void Thread::Condition::Wait(Thread::Mutex& mutex) | |
| 68 { | |
| 69 #ifdef WIN32 | |
| 70 SleepConditionVariableCS(&nativeCondition, &mutex.nativeMutex, INFINITE); | |
| 71 #else | |
| 72 pthread_cond_wait(&nativeCondition, &mutex.nativeMutex); | |
| 73 #endif | |
| 74 } | |
| 75 | |
| 76 void Thread::Condition::Signal() | |
| 77 { | |
| 78 #ifdef WIN32 | |
| 79 WakeConditionVariable(&nativeCondition); | |
| 80 #else | |
| 81 pthread_cond_signal(&nativeCondition); | |
| 82 #endif | |
| 83 } | |
| 84 | |
| 85 Thread::~Thread() | |
| 86 { | |
| 87 } | |
| 88 | |
| 89 void Thread::Start() | |
| 90 { | |
| 91 #ifdef WIN32 | |
| 92 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
| |
| 93 #else | |
| 94 pthread_create(&thread, 0, (void *(*)(void*)) &CallRun, this); | |
| 95 #endif | |
| 96 } | |
| 97 | |
| 98 void Thread::Join() | |
| 99 { | |
| 100 #ifdef WIN32 | |
| 101 WaitForSingleObject(thread, INFINITE); | |
| 102 #else | |
| 103 pthread_join(thread, 0); | |
| 104 #endif | |
| 105 } | |
| OLD | NEW |