summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-14 06:05:48 +0000
committerDavid Robillard <d@drobilla.net>2012-05-14 06:05:48 +0000
commitb85ad0bc4e96566d8f936295e36fae2eef99d356 (patch)
tree8f0de609e77387b51e76a9be5bb7290d85f81194
parentff4c3ff14e76e5b06f1b4c44f03f900e1bd4ac50 (diff)
downloadraul-b85ad0bc4e96566d8f936295e36fae2eef99d356.tar.gz
raul-b85ad0bc4e96566d8f936295e36fae2eef99d356.tar.bz2
raul-b85ad0bc4e96566d8f936295e36fae2eef99d356.zip
Remove useless Thread::create().
Use safer C++isms for value allocation in ThreadVar. Test ThreadVar. git-svn-id: http://svn.drobilla.net/lad/trunk/raul@4412 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--raul/Thread.hpp5
-rw-r--r--raul/ThreadVar.hpp10
-rw-r--r--test/thread_test.cpp33
-rw-r--r--wscript6
4 files changed, 38 insertions, 16 deletions
diff --git a/raul/Thread.hpp b/raul/Thread.hpp
index 021bf86..0d6c094 100644
--- a/raul/Thread.hpp
+++ b/raul/Thread.hpp
@@ -39,11 +39,6 @@ class Thread : Noncopyable
public:
virtual ~Thread();
- /** Create a new thread. */
- static Thread* create(const std::string& name="") {
- return new Thread(name);
- }
-
/** Return the calling thread.
*
* If the calling thread does not yet have a Thread object associated with
diff --git a/raul/ThreadVar.hpp b/raul/ThreadVar.hpp
index 54e0d4e..eb6b63e 100644
--- a/raul/ThreadVar.hpp
+++ b/raul/ThreadVar.hpp
@@ -17,7 +17,6 @@
#ifndef RAUL_THREADVAR_HPP
#define RAUL_THREADVAR_HPP
-#include <stdlib.h>
#include <pthread.h>
namespace Raul {
@@ -33,7 +32,7 @@ public:
ThreadVar(const T& default_value)
: _default_value(default_value)
{
- pthread_key_create(&_key, free);
+ pthread_key_create(&_key, destroy_value);
}
~ThreadVar() {
@@ -45,8 +44,7 @@ public:
if (val) {
*val = value;
} else {
- val = (T*)malloc(sizeof(value));
- *val = value;
+ val = new T(value);
pthread_setspecific(_key, val);
}
return *this;
@@ -61,6 +59,10 @@ private:
ThreadVar(const ThreadVar& noncopyable);
ThreadVar& operator=(const ThreadVar& noncopyable);
+ static void destroy_value(void* ptr) {
+ delete (T*)ptr;
+ }
+
const T _default_value;
pthread_key_t _key;
};
diff --git a/test/thread_test.cpp b/test/thread_test.cpp
index b74db72..95bdb76 100644
--- a/test/thread_test.cpp
+++ b/test/thread_test.cpp
@@ -15,22 +15,34 @@
*/
#include <iostream>
-#include "raul/Thread.hpp"
+
+#include "raul/AtomicInt.hpp"
#include "raul/Semaphore.hpp"
+#include "raul/Thread.hpp"
+#include "raul/ThreadVar.hpp"
using namespace std;
using namespace Raul;
+Raul::ThreadVar<int> var(0);
+Raul::AtomicInt n_errors(0);
+
class Waiter : public Raul::Thread {
public:
- Waiter(Semaphore& sem) : Raul::Thread("Waiter"), _sem(sem) {
- }
+ Waiter(Semaphore& sem) : Raul::Thread("Waiter"), _sem(sem) {}
private:
void _run() {
+ set_scheduling(true, 10);
+ var = 41;
cout << "[Waiter] Waiting for signal..." << endl;
_sem.wait();
cout << "[Waiter] Received signal, exiting" << endl;
+ var = 42;
+ if (var != 42) {
+ cerr << "[Waiter] error: var != 42" << endl;
+ ++n_errors;
+ }
}
Semaphore& _sem;
@@ -39,10 +51,18 @@ private:
int
main()
{
+ Thread& main_thread = Thread::get("Main");
+ if (main_thread.name() != "Main") {
+ cerr << "error: Main thread name is not 'Main'" << endl;
+ return 1;
+ }
+
Semaphore sem(0);
Waiter waiter(sem);
waiter.start();
+ var = 24;
+
cout << "[Main] Signalling..." << endl;
sem.post();
@@ -51,5 +71,10 @@ main()
cout << "[Main] Exiting" << endl;
- return 0;
+ if (var != 24) {
+ cerr << "[Main] error: var != 24" << endl;
+ ++n_errors;
+ }
+
+ return n_errors.get();
}
diff --git a/wscript b/wscript
index f4ad382..752834d 100644
--- a/wscript
+++ b/wscript
@@ -187,9 +187,9 @@ def build(bld):
bld.add_post_fun(autowaf.run_ldconfig)
def test(ctx):
- autowaf.pre_test(ctx, APPNAME)
- autowaf.run_tests(ctx, APPNAME, tests.split(), dirs=['./src','./test'])
- autowaf.post_test(ctx, APPNAME)
+ autowaf.pre_test(ctx, APPNAME, dirs=['.', 'src', 'test'])
+ autowaf.run_tests(ctx, APPNAME, tests.split(), dirs=['.', 'src', 'test'])
+ autowaf.post_test(ctx, APPNAME, dirs=['.', 'src', 'test'])
def lint(ctx):
subprocess.call('cpplint.py --filter=-whitespace/comments,-whitespace/tab,-whitespace/braces,-whitespace/labels,-build/header_guard,-readability/casting,-readability/todo,-build/namespaces,-whitespace/line_length,-runtime/rtti,-runtime/references,-whitespace/blank_line,-runtime/sizeof,-readability/streams,-whitespace/operators,-whitespace/parens,-build/include,-whitespace/comma,-whitespace/newline `find -name *.cpp -or -name *.hpp`', shell=True)