libmoost
/home/mhx/git/github/libmoost/include/moost/thread/safe_thread_group.hpp
Go to the documentation of this file.
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