summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-08-16 00:59:35 +0000
committerDavid Robillard <d@drobilla.net>2012-08-16 00:59:35 +0000
commit2f719c364449f3e338822e7cc740daac0870cbc9 (patch)
tree349be87a97baf7a48d5c42fc45c1ed5fa006c225
parentadbad7fcffe9fab239da23b846091e88586b3846 (diff)
downloadraul-2f719c364449f3e338822e7cc740daac0870cbc9.tar.gz
raul-2f719c364449f3e338822e7cc740daac0870cbc9.tar.bz2
raul-2f719c364449f3e338822e7cc740daac0870cbc9.zip
Remove Raul::Slave class.
Merge Thread::stop() and Thread::join(). Clean thread shut down without the use of pthread_cancel(). git-svn-id: http://svn.drobilla.net/lad/trunk/raul@4708 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--raul/Slave.hpp62
-rw-r--r--raul/Thread.hpp20
-rw-r--r--src/Thread.cpp11
3 files changed, 17 insertions, 76 deletions
diff --git a/raul/Slave.hpp b/raul/Slave.hpp
deleted file mode 100644
index 593d5e2..0000000
--- a/raul/Slave.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- This file is part of Raul.
- Copyright 2007-2012 David Robillard <http://drobilla.net>
-
- Raul is free software: you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation, either version 3 of the License, or any later version.
-
- Raul is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Raul. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef RAUL_SLAVE_HPP
-#define RAUL_SLAVE_HPP
-
-#include "raul/Semaphore.hpp"
-#include "raul/Thread.hpp"
-
-namespace Raul {
-
-/** Thread driven by (realtime safe) signals.
- *
- * Use this to perform some task in a separate thread you want to 'drive'
- * from a realtime (or otherwise) thread.
- *
- * \ingroup raul
- */
-class Slave : public Thread
-{
-public:
- explicit Slave(const std::string& name="") : Thread(name), _whip(0) {}
-
- /** Tell the slave to do whatever work it does. Realtime safe. */
- inline void whip() { _whip.post(); }
-
-protected:
- /** Worker method.
- *
- * This is called once from this thread every time whip() is called.
- * Implementations likely want to put a single (non loop) chunk of code
- * here, e.g. to process an event.
- */
- virtual void _whipped() = 0;
-
- Semaphore _whip;
-
-private:
- inline void _run() {
- while (true) {
- _whip.wait();
- _whipped();
- }
- }
-};
-
-} // namespace Raul
-
-#endif // RAUL_SLAVE_HPP
diff --git a/raul/Thread.hpp b/raul/Thread.hpp
index 6ac5aeb..f6f57d3 100644
--- a/raul/Thread.hpp
+++ b/raul/Thread.hpp
@@ -37,13 +37,18 @@ class Thread : Noncopyable
public:
virtual ~Thread();
- /** Start the thread if it is not already running. */
+ /** Start the thread if it is not already running.
+ *
+ * This is separate from construction to prevent race conditions during
+ * construction of derived classes.
+ */
virtual void start();
- /** Stop the thread if it is running. */
- virtual void stop();
-
- /** Wait until the thread exits. */
+ /** Stop the thread and block the caller until the thread exits.
+ *
+ * This sets _exit_flag to true, derived classes must ensure they actually
+ * exit when this occurs.
+ */
virtual void join();
/** Set the scheduling policy for this thread.
@@ -55,6 +60,11 @@ public:
const std::string& name() const { return _name; }
protected:
+ /** Construct a thread.
+ *
+ * Note this does not actually start a thread to prevent race conditions
+ * during construction. To actually begin execution, call start().
+ */
explicit Thread(const std::string& name="");
/** Thread function to execute.
diff --git a/src/Thread.cpp b/src/Thread.cpp
index 1f85ce0..d299138 100644
--- a/src/Thread.cpp
+++ b/src/Thread.cpp
@@ -43,7 +43,7 @@ Thread::Thread(const std::string& name)
Thread::~Thread()
{
- stop();
+ join();
delete _impl;
}
@@ -72,23 +72,16 @@ Thread::start()
}
void
-Thread::stop()
+Thread::join()
{
if (_thread_exists) {
_exit_flag = true;
- pthread_cancel(_impl->pthread);
pthread_join(_impl->pthread, NULL);
_thread_exists = false;
LOG(info) << "Exiting thread" << endl;
}
}
-void
-Thread::join()
-{
- pthread_join(_impl->pthread, NULL);
-}
-
bool
Thread::set_scheduling(bool realtime, unsigned priority)
{