00001
00019 #ifndef COIL_ASYNC_H
00020 #define COIL_ASYNC_H
00021
00022 #include <coil/Task.h>
00023 #include <coil/Guard.h>
00024 #include <iostream>
00025
00026 namespace coil
00027 {
00028 class Async
00029 : public coil::Task
00030 {
00031 public:
00032 Async() {}
00033 virtual ~Async(){}
00034 virtual void invoke() = 0;
00035 virtual bool finished() = 0;
00036 };
00037
00038 template <typename Object, typename Func>
00039 class Async_t
00040 : public Async
00041 {
00042 public:
00043 Async_t(Object* obj, Func func, bool auto_delete = false)
00044 : m_obj(obj), m_func(func), m_finished(false), m_autodelete(auto_delete)
00045 {
00046 }
00047 virtual ~Async_t()
00048 {
00049 }
00050
00051 virtual int svc()
00052 {
00053 m_func(m_obj);
00054 {
00055 Guard<Mutex> guard(m_mutex);
00056 m_finished = true;
00057 }
00058
00059 return 0;
00060 }
00061 virtual void finalize()
00062 {
00063 Task::finalize();
00064 if (m_autodelete) delete this;
00065 }
00066 virtual void invoke()
00067 {
00068 activate();
00069 }
00070 virtual bool finished()
00071 {
00072 Guard<Mutex> guard(m_mutex);
00073 return m_finished;
00074 }
00075 private:
00076 Object* m_obj;
00077 Func m_func;
00078 bool m_finished;
00079 const bool m_autodelete;
00080 Mutex m_mutex;
00081 };
00082
00083 template <typename Object, typename Func>
00084 class Async_ref_t
00085 : public Async
00086 {
00087 public:
00088 Async_ref_t(Object* obj, Func& func, bool auto_delete = false)
00089 : m_obj(obj), m_func(func), m_finished(false), m_autodelete(auto_delete)
00090 {
00091 }
00092 virtual ~Async_ref_t()
00093 {
00094 }
00095
00096 virtual int svc()
00097 {
00098 m_func(m_obj);
00099 m_finished = true;
00100 return 0;
00101 }
00102 virtual void invoke()
00103 {
00104 activate();
00105 }
00106 virtual bool finished()
00107 {
00108 return m_finished;
00109 }
00110 virtual void finalize()
00111 {
00112 Task::finalize();
00113 if (m_autodelete) delete this;
00114 }
00115 private:
00116 Object* m_obj;
00117 Func& m_func;
00118 bool m_finished;
00119 bool m_autodelete;
00120
00121 };
00122
00204 template <typename Object, typename Func>
00205 inline Async_t<Object, Func>*
00206 AsyncInvoker(Object* obj, Func func, bool auto_delete = false)
00207 {
00208 return new Async_t<Object, Func>(obj, func, auto_delete);
00209 }
00210
00211 template <typename Object, typename Func>
00212 inline Async_ref_t<Object, Func>*
00213 AsyncInvoker(Object* obj, Func* func, bool auto_delete = false)
00214 {
00215 return new Async_ref_t<Object, Func>(obj, *func, auto_delete);
00216 }
00217
00218
00219 };
00220
00221 #endif // COIL_ASYNC_H