struct future_object_helper\r
{ \r
template<typename T, typename F>\r
- static void invoke(T& future_object, F& f)\r
+ static void nonlocking_invoke(T& future_object, F& f)\r
{ \r
try\r
{\r
future_object.mark_exceptional_finish_internal(boost::current_exception());\r
}\r
}\r
+\r
+ template<typename T, typename F>\r
+ static void locking_invoke(T& future_object, F& f)\r
+ { \r
+ try\r
+ {\r
+ future_object.mark_finished_with_result(f());\r
+ }\r
+ catch(...)\r
+ {\r
+ future_object.mark_exceptional_finish();\r
+ }\r
+ }\r
};\r
\r
template<>\r
struct future_object_helper<void>\r
{ \r
template<typename T, typename F>\r
- static void invoke(T& future_object, F& f)\r
+ static void nonlocking_invoke(T& future_object, F& f)\r
{ \r
try\r
{\r
future_object.mark_exceptional_finish_internal(boost::current_exception());\r
}\r
}\r
+\r
+ template<typename T, typename F>\r
+ static void locking_invoke(T& future_object, F& f)\r
+ { \r
+ try\r
+ {\r
+ f();\r
+ future_object.mark_finished_with_result();\r
+ }\r
+ catch(...)\r
+ {\r
+ future_object.mark_exceptional_finish();\r
+ }\r
+ }\r
};\r
\r
template<typename R, typename F>\r
if(done)\r
return;\r
\r
- future_object_helper<R>::invoke(*this, f);\r
+ future_object_helper<R>::nonlocking_invoke(*this, f);\r
\r
done = true;\r
}\r
\r
void run()\r
{\r
- boost::lock_guard<boost::mutex> lock2(mutex); \r
-\r
- future_object_helper<R>::invoke(*this, f);\r
+ future_object_helper<R>::locking_invoke(*this, f);\r
}\r
};\r
\r