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