This repository has been archived by the owner on Feb 4, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththreadtools.h
251 lines (203 loc) · 5.68 KB
/
threadtools.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
//===========================================================//
// Name: threadtools.h
// Purpose: Threading stuff
// Date: 8/11/2019
//===========================================================//
#pragma once
#include "platform.h"
#ifdef _WIN32
#include <Windows.h>
#elif defined(_LINUX)
#include <pthread.h>
#include <semaphore.h>
#endif
#ifdef __cplusplus
/* C++ includes */
#include <atomic>
#endif //__cplusplus
/* Simple thread proc */
typedef int(*ThreadProc_t)(void* param);
#ifdef __cplusplus
extern "C"
{
#endif //__cplusplus
#ifdef _LINUX
typedef pthread_mutex_t mutex_t;
typedef pthread_t thread_t;
#elif defined(_WIN32)
#error implement for windows
#endif
//===========================================================//
// Mutex C library
//===========================================================//
void mutex_lock(mutex_t* mutex);
void mutex_init(mutex_t* mutex);
void mutex_trylock(mutex_t* mutex);
void mutex_unlock(mutex_t* mutex);
void mutex_destroy(mutex_t* mutex);
//===========================================================//
// Thread procs
//===========================================================//
void thread_init(thread_t* thread, ThreadProc_t proc);
void thread_destroy(thread_t* thread);
void thread_kill(thread_t* thread);
int thread_getreturn(thread_t* thread);
#ifdef __cplusplus
}
#endif //__cplusplus
#ifdef __cplusplus
/*
Simple thread class
*/
class CThread
{
private:
bool m_bRunning = false;
bool m_bExited = false;
int m_nReturn = 1;
#ifdef _WIN32
#elif defined(_LINUX)
pthread_t m_thread;
pthread_attr_t m_threadattr;
pthread_mutex_t m_mutex;
/* private data */
void* m_pData;
#endif
public:
/* Types */
public:
CThread(ThreadProc_t proc);
~CThread();
public:
//-----------------------------------------------------//
// Start execution of the thread proc in a new thread
// with the specified parameter
//-----------------------------------------------------//
void Start(void* param);
//-----------------------------------------------------//
// Immediately stops the thread and kills it
//-----------------------------------------------------//
void Kill();
//-----------------------------------------------------//
// Suspends the thread until resumed
//-----------------------------------------------------//
void Suspend();
//-----------------------------------------------------//
// Resumes the execution of the thread
//-----------------------------------------------------//
void Resume();
//-----------------------------------------------------//
// Returns if the thread is running
//-----------------------------------------------------//
bool IsRunning() const;
//-----------------------------------------------------//
// Returns if the thread is paused
//-----------------------------------------------------//
bool IsPaused() const;
//-----------------------------------------------------//
// Returns if the thread proc has exited yet
//-----------------------------------------------------//
bool IsComplete() const;
//-----------------------------------------------------//
// If the thread is running still, returns -1, else,
// returns the return code of thread proc
//-----------------------------------------------------//
int GetReturnCode() const;
};
//-----------------------------------------------------//
// Status of a mutex
//-----------------------------------------------------//
enum class EMutexStatus
{
OK = 0,
TimedOut,
};
/*
Mutex that doesnt rely on the OS mutex things
Uses interlocked exchange and the like
*/
class CFastMutex
{
private:
public:
CFastMutex();
~CFastMutex();
public:
//-----------------------------------------------------//
// Lock the mutex, blocks until locked
//-----------------------------------------------------//
int Lock();
//-----------------------------------------------------//
// Try to lock mutex, does not block
//-----------------------------------------------------//
int TryLock();
//-----------------------------------------------------//
// Unlock the mutex
//-----------------------------------------------------//
void Unlock();
//-----------------------------------------------------//
// Destroy the mutex
//-----------------------------------------------------//
void Destroy();
};
/*
Simple mutex class
*/
class CMutex
{
private:
#ifdef _WIN32
#elif defined(_LINUX)
pthread_mutex_t mutex;
#endif
public:
CMutex();
~CMutex();
public:
//-----------------------------------------------------//
// Lock the mutex, blocks until locked
// Returns 1 is all is OK, 0 otherwise
//-----------------------------------------------------//
int Lock();
//-----------------------------------------------------//
// Try to lock mutex, does not block
// Returns 1 if locked, 0 if not
//-----------------------------------------------------//
int TryLock();
//-----------------------------------------------------//
// Unlock the mutex
//-----------------------------------------------------//
void Unlock();
};
/*
Mutex that multiple threads can lock
*/
class CSharedMutex
{
private:
std::atomic<int> m_nThreads;
public:
//-----------------------------------------------------//
// Create a new shared mutex with x max owning threads
//-----------------------------------------------------//
CSharedMutex(int nMaxThreads = 1);
~CSharedMutex();
public:
//-----------------------------------------------------//
// Lock the mutex, does not block
//-----------------------------------------------------//
int Lock();
//-----------------------------------------------------//
// Unlock the mutex
//-----------------------------------------------------//
void Unlock();
};
/*
Simple semaphore
*/
class CSemaphore
{
private:
public:
};
#endif //__cplusplus