diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-08-05 17:46:11 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-08-05 17:46:11 +0200 |
commit | 758b3799a8afca1bcfcc80f1863d99417a8de1eb (patch) | |
tree | 50fa1e01674183d812aa84e35837b48a4fd841b3 /odb/details/thread.hxx | |
parent | be85d32f0f645e47104ef1241acac1041cc58c16 (diff) |
Initial take on build2-based build
Only C++11 is supported with GCC 4.8 and up and VC 14 and up.
This change also introduces the ODB_THREADS_CXX11 threading model. It
is the default for the build2 build but can be disabled with a global
ODB_THREADS_NONE define (global means that it should be in effect both
when building and using the library).
Diffstat (limited to 'odb/details/thread.hxx')
-rw-r--r-- | odb/details/thread.hxx | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/odb/details/thread.hxx b/odb/details/thread.hxx index 858263d..79c1b62 100644 --- a/odb/details/thread.hxx +++ b/odb/details/thread.hxx @@ -8,9 +8,51 @@ #include <odb/pre.hxx> #include <odb/details/config.hxx> +#include <odb/details/export.hxx> #ifdef ODB_THREADS_NONE # error no thread support available +#elif defined(ODB_THREADS_CXX11) +# include <thread> +# include <future> +# include <utility> // move() + +namespace odb +{ + namespace details + { + class LIBODB_EXPORT thread + { + public: + thread (void* (*thread_func) (void*), void* arg = 0) + { + std::promise<void*> p; + f_ = p.get_future (); + t_ = std::thread (thunk, thread_func, arg, std::move (p)); + } + + void* + join () + { + f_.wait (); + t_.join (); + return f_.get (); + } + + thread (const thread&) = delete; + thread& operator= (const thread&) = delete; + + private: + static void + thunk (void* (*) (void*), void*, std::promise<void*>); + + private: + std::thread t_; + std::future<void*> f_; + }; + } +} + #elif defined(ODB_THREADS_POSIX) #include <odb/details/posix/thread.hxx> #elif defined(ODB_THREADS_WIN32) |