libmoost
|
00001 /* vim:set ts=3 sw=3 sts=3 et: */ 00028 #ifndef MOOST_THREAD_SAFE_THREAD 00029 #define MOOST_THREAD_SAFE_THREAD 00030 00031 00032 #include <boost/thread.hpp> 00033 #include <boost/bind.hpp> 00034 #include <boost/bind/protect.hpp> 00035 #include <boost/noncopyable.hpp> 00036 00037 #include "detail/safe_thread_default_policy.hpp" 00038 00039 namespace moost { namespace thread { 00040 00041 // Note: The base class (boost::thread) is NOT polymorphic 00042 template <typename Policy = default_safe_thread_policy> 00043 class safe_thread : boost::thread, boost::noncopyable 00044 { 00045 public: 00046 template <typename F> 00047 boost::thread * create_thread(F f) 00048 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), f)); } 00049 00050 template <typename F, typename A1> 00051 boost::thread * create_thread(F f, A1 const & a1) 00052 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1)))); } 00053 00054 template <typename F, typename A1, typename A2> 00055 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2) 00056 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2)))); } 00057 00058 template <typename F, typename A1, typename A2, typename A3> 00059 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3) 00060 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a3)))); } 00061 00062 template <typename F, typename A1, typename A2, typename A3, typename A4> 00063 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) 00064 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a3, a4)))); } 00065 00066 template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5> 00067 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) 00068 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a4, a4, a5)))); } 00069 00070 template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6> 00071 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const &a6) 00072 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a4, a4, a5, a6)))); } 00073 00074 template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7> 00075 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) 00076 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a4, a4, a5, a6, a7)))); } 00077 00078 template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8> 00079 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) 00080 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a4, a4, a5, a6, a7, a8)))); } 00081 00082 template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9> 00083 boost::thread * create_thread(F f, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const &a6, A7 const & a7, A8 const & a8, A9 const & a9) 00084 { return boost::thread_group::create_thread(boost::bind<void>(Policy(), boost::protect(boost::bind<void>(f, a1, a2, a4, a4, a5, a6, a7, a8, a9)))); } 00085 }; 00086 00087 }} 00088 00089 #endif