diff options
author | David Robillard <d@drobilla.net> | 2007-06-24 17:21:14 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-06-24 17:21:14 +0000 |
commit | ee0ddf0b33d4ec241e7b4b95ed30828bc9bb8d53 (patch) | |
tree | 1f34ce49546083cfccd30be1cb2014b98a36d4e9 /src | |
parent | cb6c4950c1f4370c7de7aee8dbc0a85ce86f8705 (diff) | |
download | raul-ee0ddf0b33d4ec241e7b4b95ed30828bc9bb8d53.tar.gz raul-ee0ddf0b33d4ec241e7b4b95ed30828bc9bb8d53.tar.bz2 raul-ee0ddf0b33d4ec241e7b4b95ed30828bc9bb8d53.zip |
Move exessive Thread code from header to source file.
git-svn-id: http://svn.drobilla.net/lad/raul@544 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r-- | src/Thread.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/Thread.cpp b/src/Thread.cpp index 58edff2..1542363 100644 --- a/src/Thread.cpp +++ b/src/Thread.cpp @@ -23,5 +23,90 @@ namespace Raul { pthread_once_t Thread::_thread_key_once = PTHREAD_ONCE_INIT; pthread_key_t Thread::_thread_key; + +Thread::Thread(const std::string& name) + : _context(0) + , _name(name) + , _pthread_exists(false) +{ + pthread_once(&_thread_key_once, thread_key_alloc); + pthread_setspecific(_thread_key, this); +} + + +/** Must be called from thread */ +Thread::Thread(pthread_t thread, const std::string& name) + : _context(0) + , _name(name) + , _pthread_exists(true) + , _pthread(thread) +{ + pthread_once(&_thread_key_once, thread_key_alloc); + pthread_setspecific(_thread_key, this); +} + + +/** Return the calling thread. + * The return value of this should NOT be cached unless the thread is + * explicitly user created with create(). + */ +Thread& +Thread::get() +{ + Thread* this_thread = reinterpret_cast<Thread*>(pthread_getspecific(_thread_key)); + if (!this_thread) + this_thread = new Thread(); // sets thread-specific data + + return *this_thread; +} + +/** Launch and start the thread. */ +void +Thread::start() +{ + std::cout << "[" << _name << " Thread] Starting." << std::endl; + + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, 1500000); + + pthread_create(&_pthread, &attr, _static_run, this); + _pthread_exists = true; +} + +/** Stop and terminate the thread. */ +void +Thread::stop() +{ + if (_pthread_exists) { + pthread_cancel(_pthread); + pthread_join(_pthread, NULL); + _pthread_exists = false; + std::cout << "[" << _name << " Thread] Exiting." << std::endl; + } +} + +void +Thread::set_scheduling(int policy, unsigned int priority) +{ + sched_param sp; + sp.sched_priority = priority; + int result = pthread_setschedparam(_pthread, SCHED_FIFO, &sp); + if (!result) { + std::cout << "[" << _name << "] Set scheduling policy to "; + switch (policy) { + case SCHED_FIFO: std::cout << "SCHED_FIFO"; break; + case SCHED_RR: std::cout << "SCHED_RR"; break; + case SCHED_OTHER: std::cout << "SCHED_OTHER"; break; + default: std::cout << "UNKNOWN"; break; + } + std::cout << ", priority " << sp.sched_priority << std::endl; + } else { + std::cout << "[" << _name << "] Unable to set scheduling policy (" + << strerror(result) << ")" << std::endl; + } +} + + } // namespace Raul |