summaryrefslogtreecommitdiffstats
path: root/raul
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-11-21 04:59:00 +0000
committerDavid Robillard <d@drobilla.net>2012-11-21 04:59:00 +0000
commitb1f1e98ff6ae6b01a17e1fb422900fa99d735d28 (patch)
tree58e1b03a8ca3624193647c3c9bc5940cf2b217dc /raul
parent1dfea4fe9fbb774b71b10cc3e97a450b62f96186 (diff)
downloadraul-b1f1e98ff6ae6b01a17e1fb422900fa99d735d28.tar.gz
raul-b1f1e98ff6ae6b01a17e1fb422900fa99d735d28.tar.bz2
raul-b1f1e98ff6ae6b01a17e1fb422900fa99d735d28.zip
Remove remaining library code, Raul is now header only.
git-svn-id: http://svn.drobilla.net/lad/trunk/raul@4837 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'raul')
-rw-r--r--raul/Thread.hpp49
1 files changed, 40 insertions, 9 deletions
diff --git a/raul/Thread.hpp b/raul/Thread.hpp
index fa5a3cb..ddd771b 100644
--- a/raul/Thread.hpp
+++ b/raul/Thread.hpp
@@ -33,26 +33,48 @@ struct ThreadImpl;
class Thread : Noncopyable
{
public:
- virtual ~Thread();
+ virtual ~Thread() {
+ join();
+ }
/** Start the thread if it is not already running.
*
* This is separate from construction to prevent race conditions during
* construction of derived classes.
*/
- virtual void start();
+ virtual void start() {
+ if (!_thread_exists) {
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 1500000);
+
+ pthread_create(&_pthread, &attr, _static_run, this);
+ _thread_exists = true;
+ }
+ }
/** Stop the thread and block the caller until the thread exits.
*
* This sets _exit_flag to true, derived classes must ensure they actually
* exit when this occurs.
*/
- virtual void join();
+ virtual void join() {
+ if (_thread_exists) {
+ _exit_flag = true;
+ pthread_join(_pthread, NULL);
+ _thread_exists = false;
+ }
+ }
/** Set the scheduling policy for this thread.
* @return True on success.
*/
- virtual bool set_scheduling(bool realtime, unsigned priority);
+ virtual bool set_scheduling(bool realtime, unsigned priority) {
+ sched_param sp;
+ sp.sched_priority = priority;
+ const int policy = realtime ? SCHED_FIFO : SCHED_OTHER;
+ return !pthread_setschedparam(_pthread, policy, &sp);
+ }
protected:
/** Construct a thread.
@@ -60,7 +82,11 @@ protected:
* Note this does not actually start a thread to prevent race conditions
* during construction. To actually begin execution, call start().
*/
- explicit Thread();
+ explicit Thread()
+ : _thread_exists(false)
+ , _exit_flag(false)
+ {}
+
/** Thread function to execute.
*
@@ -73,10 +99,15 @@ protected:
virtual void _run() {}
private:
- static void* _static_run(void* me);
-
- ThreadImpl* _impl;
- bool _thread_exists;
+ static void* _static_run(void* thread) {
+ Thread* me = static_cast<Thread*>(thread);
+ me->_run();
+ me->_thread_exists = false;
+ return NULL;
+ }
+
+ pthread_t _pthread;
+ bool _thread_exists;
protected:
bool _exit_flag;