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