summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-06-24 17:21:14 +0000
committerDavid Robillard <d@drobilla.net>2007-06-24 17:21:14 +0000
commitee0ddf0b33d4ec241e7b4b95ed30828bc9bb8d53 (patch)
tree1f34ce49546083cfccd30be1cb2014b98a36d4e9 /src
parentcb6c4950c1f4370c7de7aee8dbc0a85ce86f8705 (diff)
downloadraul-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.cpp85
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