Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/Thread.cpp

Issue 10026001: Cross-platform thread primitives (Closed)
Patch Set: Don't unlock/signal mutices/conditions, move Mutex and Condition to the top level Created April 4, 2013, 2:52 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/Thread.h ('k') | test/Thread.cpp » ('j') | test/Thread.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include "Thread.h" 1 #include "Thread.h"
2 2
3 using namespace AdblockPlus; 3 using namespace AdblockPlus;
4 4
5 namespace 5 namespace
6 { 6 {
7 void CallRun(Thread* thread) 7 void CallRun(Thread* thread)
8 { 8 {
9 thread->Run(); 9 thread->Run();
10 } 10 }
11 } 11 }
12 12
13 Thread::Mutex::Mutex() 13 Mutex::Mutex()
14 { 14 {
15 #ifdef WIN32 15 #ifdef WIN32
16 InitializeCriticalSection(&nativeMutex); 16 InitializeCriticalSection(&nativeMutex);
17 #else 17 #else
18 pthread_mutex_init(&nativeMutex, 0); 18 pthread_mutex_init(&nativeMutex, 0);
19 #endif 19 #endif
20 } 20 }
21 21
22 Thread::Mutex::~Mutex() 22 Mutex::~Mutex()
23 { 23 {
24 Unlock();
25 #ifdef WIN32 24 #ifdef WIN32
26 DeleteCriticalSection(&nativeMutex); 25 DeleteCriticalSection(&nativeMutex);
27 #else 26 #else
28 pthread_mutex_destroy(&nativeMutex); 27 pthread_mutex_destroy(&nativeMutex);
29 #endif 28 #endif
30 } 29 }
31 30
32 void Thread::Mutex::Lock() 31 void Mutex::Lock()
33 { 32 {
34 #ifdef WIN32 33 #ifdef WIN32
35 EnterCriticalSection(&nativeMutex); 34 EnterCriticalSection(&nativeMutex);
36 #else 35 #else
37 pthread_mutex_lock(&nativeMutex); 36 pthread_mutex_lock(&nativeMutex);
38 #endif 37 #endif
39 } 38 }
40 39
41 void Thread::Mutex::Unlock() 40 void Mutex::Unlock()
42 { 41 {
43 #ifdef WIN32 42 #ifdef WIN32
44 LeaveCriticalSection(&nativeMutex); 43 LeaveCriticalSection(&nativeMutex);
45 #else 44 #else
46 pthread_mutex_unlock(&nativeMutex); 45 pthread_mutex_unlock(&nativeMutex);
47 #endif 46 #endif
48 } 47 }
49 48
50 Thread::Condition::Condition() 49 ConditionVariable::ConditionVariable()
51 { 50 {
52 #ifdef WIN32 51 #ifdef WIN32
53 InitializeConditionVariable(&nativeCondition); 52 InitializeConditionVariable(&nativeCondition);
54 #else 53 #else
55 pthread_cond_init(&nativeCondition, 0); 54 pthread_cond_init(&nativeCondition, 0);
56 #endif 55 #endif
57 } 56 }
58 57
59 Thread::Condition::~Condition() 58 ConditionVariable::~ConditionVariable()
60 { 59 {
61 #ifndef WIN32 60 #ifndef WIN32
62 Signal();
63 pthread_cond_destroy(&nativeCondition); 61 pthread_cond_destroy(&nativeCondition);
64 #endif 62 #endif
65 } 63 }
66 64
67 void Thread::Condition::Wait(Thread::Mutex& mutex) 65 void ConditionVariable::Wait(Mutex& mutex)
68 { 66 {
69 #ifdef WIN32 67 #ifdef WIN32
70 SleepConditionVariableCS(&nativeCondition, &mutex.nativeMutex, INFINITE); 68 SleepConditionVariableCS(&nativeCondition, &mutex.nativeMutex, INFINITE);
71 #else 69 #else
72 pthread_cond_wait(&nativeCondition, &mutex.nativeMutex); 70 pthread_cond_wait(&nativeCondition, &mutex.nativeMutex);
73 #endif 71 #endif
74 } 72 }
75 73
76 void Thread::Condition::Signal() 74 void ConditionVariable::Signal()
77 { 75 {
78 #ifdef WIN32 76 #ifdef WIN32
79 WakeConditionVariable(&nativeCondition); 77 WakeConditionVariable(&nativeCondition);
80 #else 78 #else
81 pthread_cond_signal(&nativeCondition); 79 pthread_cond_signal(&nativeCondition);
82 #endif 80 #endif
83 } 81 }
84 82
85 Thread::~Thread() 83 Thread::~Thread()
86 { 84 {
87 } 85 }
88 86
89 void Thread::Start() 87 void Thread::Start()
90 { 88 {
91 #ifdef WIN32 89 #ifdef WIN32
92 thread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CallRun, this, 0, 0); 90 nativeThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&CallRun, this, 0, 0 );
93 #else 91 #else
94 pthread_create(&thread, 0, (void *(*)(void*)) &CallRun, this); 92 pthread_create(&nativeThread, 0, (void *(*)(void*)) &CallRun, this);
95 #endif 93 #endif
96 } 94 }
97 95
98 void Thread::Join() 96 void Thread::Join()
99 { 97 {
100 #ifdef WIN32 98 #ifdef WIN32
101 WaitForSingleObject(thread, INFINITE); 99 WaitForSingleObject(nativeThread, INFINITE);
102 #else 100 #else
103 pthread_join(thread, 0); 101 pthread_join(nativeThread, 0);
104 #endif 102 #endif
105 } 103 }
OLDNEW
« no previous file with comments | « src/Thread.h ('k') | test/Thread.cpp » ('j') | test/Thread.cpp » ('J')

Powered by Google App Engine
This is Rietveld