From b85ad0bc4e96566d8f936295e36fae2eef99d356 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 14 May 2012 06:05:48 +0000 Subject: 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 --- raul/Thread.hpp | 5 ----- raul/ThreadVar.hpp | 10 ++++++---- test/thread_test.cpp | 33 +++++++++++++++++++++++++++++---- wscript | 6 +++--- 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 #include 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 -#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 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) -- cgit v1.2.1