aboutsummaryrefslogtreecommitdiff
path: root/odb/details/posix/thread.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/details/posix/thread.cxx')
-rw-r--r--odb/details/posix/thread.cxx47
1 files changed, 47 insertions, 0 deletions
diff --git a/odb/details/posix/thread.cxx b/odb/details/posix/thread.cxx
new file mode 100644
index 0000000..52ab6e9
--- /dev/null
+++ b/odb/details/posix/thread.cxx
@@ -0,0 +1,47 @@
+// file : odb/details/posix/thread.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#include <memory> // std::auto_ptr
+
+#include <odb/details/posix/thread.hxx>
+#include <odb/details/posix/exceptions.hxx>
+
+typedef void* (*thread_func) (void*);
+
+struct thread_data
+{
+ thread_func func;
+ void* arg;
+};
+
+extern "C" void*
+odb_thread_thunk (void* arg)
+{
+ thread_data* data (static_cast<thread_data*> (arg));
+ thread_func func = data->func;
+ arg = data->arg;
+ delete data;
+ return func (arg);
+}
+
+namespace odb
+{
+ namespace details
+ {
+ thread::
+ thread (void* (*func) (void*), void* arg)
+ : detached_ (false)
+ {
+ std::auto_ptr<thread_data> data (new thread_data);
+ data->func = func;
+ data->arg = arg;
+
+ if (int e = pthread_create (&id_, 0, &odb_thread_thunk, data.get ()))
+ throw posix_exception (e);
+
+ data.release (); // Thread thunk will free this.
+ }
+ }
+}