summaryrefslogtreecommitdiff
path: root/include/threadengine.h
blob: 822774c6ef6f5d9db4a2ddab41bd9db9020b0242 (plain)
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
#ifndef THREADENGINE_H
#define THREADENGINE_H

#ifdef _WIN32
typedef HANDLE ThreadHandle;
typedef CRITICAL_SECTION MutexHandle;
typedef HANDLE CondHandle;
#else
# include <pthread.h>
typedef pthread_t ThreadHandle;
typedef pthread_mutex_t MutexHandle;
typedef pthread_cond_t CondHandle;
#endif

class ThreadEngine;
class Thread;

extern CoreExport ThreadEngine threadEngine;

class CoreExport ThreadEngine
{
 public:
	/* Vector of threads */
	std::vector<Thread *> threads;

	/** Threadengines constructor
	 */
	ThreadEngine();

	/** Threadengines destructor
	 */
	~ThreadEngine();

	/** Start a new thread
	 * @param thread A pointer to a newley allocated thread
	 */
	void Start(Thread *thread);

	/** Check for finished threads
	 */
	void Process();
};

class CoreExport Thread : public Extensible
{
 private:
	/* Set to true to tell the thread to finish and we are waiting for it */
	bool Exit;

 public:
	/* Handle for this thread */
	ThreadHandle Handle;

	/** Threads constructor
	 */
	Thread();

	/** Threads destructor
	 */
	virtual ~Thread();

	/** Join to the thread, sets the exit state to true
	 */
	void Join();

	/** Sets the exit state as true informing the thread we want it to shut down
	 */
	void SetExitState();

	/** Returns the exit state of the thread
	 * @return true if we want to exit
	 */
	bool GetExitState() const;

	/** Called to run the thread, should be overloaded
	 */
	virtual void Run();
};

class CoreExport Mutex
{
 protected:
	/* A mutex, used to keep threads in sync */
	MutexHandle mutex;

 public:
	/** Constructor
	 */
	Mutex();

	/** Destructor
	 */
	~Mutex();

	/** Attempt to lock the mutex, will hang until a lock can be achieved
	 */
	void Lock();

	/** Unlock the mutex, it must be locked first
	 */
	void Unlock();

	/** Attempt to lock the mutex, will return true on success and false on fail
	 * Does not block
	 * @return true or false
	 */
	bool TryLock();
};

class CoreExport Condition : public Mutex
{
 private:
	/* A condition */
	CondHandle cond;

 public:
	/** Constructor
	 */
	Condition();

	/** Destructor
	 */
	~Condition();

	/** Called to wakeup the waiter
	 */
	void Wakeup();

	/** Called to wait for a Wakeup() call
	 */
	void Wait();
};

#endif // THREADENGINE_H