summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-07-25 04:57:30 +0000
committerDavid Robillard <d@drobilla.net>2007-07-25 04:57:30 +0000
commitae1ae583cebc1230afc4db3939a8d47579266653 (patch)
tree8c3c7199972338b944904dff9d60881ab2fbb3e6 /src
parent3b4a308ff647def75e647ac8f97e1e48b57672c3 (diff)
downloadraul-ae1ae583cebc1230afc4db3939a8d47579266653.tar.gz
raul-ae1ae583cebc1230afc4db3939a8d47579266653.tar.bz2
raul-ae1ae583cebc1230afc4db3939a8d47579266653.zip
Never launch the same thread twice, no matter what the stupid caller says.
git-svn-id: http://svn.drobilla.net/lad/raul@620 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r--src/Thread.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/src/Thread.cpp b/src/Thread.cpp
index cea32d8..059886f 100644
--- a/src/Thread.cpp
+++ b/src/Thread.cpp
@@ -15,8 +15,11 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <iostream>
#include "raul/Thread.hpp"
+using namespace std;
+
namespace Raul {
/* Thread-specific data key (once-only initialized) */
@@ -24,7 +27,7 @@ pthread_once_t Thread::_thread_key_once = PTHREAD_ONCE_INIT;
pthread_key_t Thread::_thread_key;
-Thread::Thread(const std::string& name)
+Thread::Thread(const string& name)
: _context(0)
, _name(name)
, _pthread_exists(false)
@@ -35,7 +38,7 @@ Thread::Thread(const std::string& name)
/** Must be called from thread */
-Thread::Thread(pthread_t thread, const std::string& name)
+Thread::Thread(pthread_t thread, const string& name)
: _context(0)
, _name(name)
, _pthread_exists(true)
@@ -64,14 +67,18 @@ Thread::get()
void
Thread::start()
{
- std::cout << "[" << _name << " Thread] Starting." << std::endl;
+ if (_pthread_exists) {
+ cout << "[" << _name << " Thread] Already started." << endl;
+ } else {
+ cout << "[" << _name << " Thread] Starting." << endl;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setstacksize(&attr, 1500000);
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 1500000);
- pthread_create(&_pthread, &attr, _static_run, this);
- _pthread_exists = true;
+ pthread_create(&_pthread, &attr, _static_run, this);
+ _pthread_exists = true;
+ }
}
/** Stop and terminate the thread. */
@@ -82,7 +89,7 @@ Thread::stop()
pthread_cancel(_pthread);
pthread_join(_pthread, NULL);
_pthread_exists = false;
- std::cout << "[" << _name << " Thread] Exiting." << std::endl;
+ cout << "[" << _name << " Thread] Exiting." << endl;
}
}
@@ -93,17 +100,17 @@ Thread::set_scheduling(int policy, unsigned int priority)
sp.sched_priority = priority;
int result = pthread_setschedparam(_pthread, SCHED_FIFO, &sp);
if (!result) {
- std::cout << "[" << _name << "] Set scheduling policy to ";
+ 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;
+ case SCHED_FIFO: cout << "SCHED_FIFO"; break;
+ case SCHED_RR: cout << "SCHED_RR"; break;
+ case SCHED_OTHER: cout << "SCHED_OTHER"; break;
+ default: cout << "UNKNOWN"; break;
}
- std::cout << ", priority " << sp.sched_priority << std::endl;
+ cout << ", priority " << sp.sched_priority << endl;
} else {
- std::cout << "[" << _name << "] Unable to set scheduling policy ("
- << strerror(result) << ")" << std::endl;
+ cout << "[" << _name << "] Unable to set scheduling policy ("
+ << strerror(result) << ")" << endl;
}
}