00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef AMINO_FUTURE_H
00022 #define AMINO_FUTURE_H
00023
00024 #include <assert.h>
00025
00026 #include <amino/condition.h>
00027 #include <amino/mutex.h>
00028
00029 #ifdef DEBUG
00030 #include <sstream>
00031 #include <iostream>
00032 using namespace std;
00033 #endif
00034
00035 namespace amino{
00036
00044 class Future{
00045 public:
00055 virtual void * get()=0;
00056
00066 virtual bool get(int milli, void ** result=NULL)=0;
00067
00068 virtual ~Future(){}
00069 };
00070
00078 class AbstractFuture:public Future{
00079 private:
00084 condition_variable cond;
00085
00090 recursive_mutex f_mutex;
00094 volatile bool isAvail;
00095 protected:
00099 volatile void * f_result;
00100
00106 virtual void fireEvent(){
00107 unique_lock<mutex> llock(f_mutex);
00108 setAvailable(true);
00109 cond.notify_all();
00110 }
00111
00117 virtual void setAvailable(bool flag){
00118 unique_lock<mutex> llock(f_mutex);
00119 isAvail = flag;
00120 }
00121
00125 virtual bool getAvailable(){
00126 unique_lock<mutex> llock(f_mutex);
00127 return isAvail;
00128 }
00129 public:
00130 AbstractFuture(){
00131 isAvail = false;
00132 }
00133
00134 virtual ~AbstractFuture(){
00135 }
00136
00143 virtual void * get(){
00144 while(!getAvailable()){
00145 unique_lock<mutex> llock(f_mutex);
00146 if(!getAvailable()){
00147 cond.wait(llock);
00148 }
00149 else
00150 break;
00151 }
00152 #ifdef DEBUG_FUTURE
00153 stringstream ss;
00154 ss <<"IsAvail in get(): "<<isAvail<<this<<endl;
00155 cout << ss.str();
00156 #endif
00157 assert(isAvail);
00158 return (void *) f_result;
00159 }
00160
00170 virtual bool get(int milli, void ** result=NULL){
00171 bool res=true;
00172
00173 if(!isAvail){
00174 unique_lock<mutex> llock(f_mutex);
00175 res = cond.timed_wait(llock, milli);
00176 if(res){
00177 if(result!=NULL)
00178 *result = (void *)f_result;
00179 }
00180 return res;
00181 }
00182
00183 if(result!=NULL)
00184 *result = (void *) f_result;
00185
00186 return res;
00187 }
00188 };
00189 };
00190 #endif