00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "ArExport.h"
00027 #include "ariaOSDef.h"
00028 #include "ariaUtil.h"
00029 #include "ArSyncTask.h"
00030 #include "ArLog.h"
00031
00036 AREXPORT ArSyncTask::ArSyncTask(const char *name, ArFunctor *functor,
00037 ArTaskState::State *state, ArSyncTask *parent)
00038 {
00039 myName = name;
00040 myStatePointer = state;
00041 myFunctor = functor;
00042 myParent = parent;
00043 myIsDeleting = false;
00044 setState(ArTaskState::INIT);
00045 if (myParent != NULL)
00046 {
00047 setWarningTimeCB(parent->getWarningTimeCB());
00048 setNoTimeWarningCB(parent->getNoTimeWarningCB());
00049 }
00050 else
00051 {
00052 setWarningTimeCB(NULL);
00053 setNoTimeWarningCB(NULL);
00054 }
00055 }
00056
00062 AREXPORT ArSyncTask::~ArSyncTask()
00063 {
00064 myIsDeleting = true;
00065 if (myParent != NULL && !myParent->isDeleting())
00066 myParent->remove(this);
00067
00068 ArUtil::deleteSetPairs(myMultiMap.begin(), myMultiMap.end());
00069 myMultiMap.clear();
00070 }
00071
00072 AREXPORT ArTaskState::State ArSyncTask::getState(void)
00073 {
00074 if (myStatePointer != NULL)
00075 return *myStatePointer;
00076 else
00077 return myState;
00078 }
00079
00080 AREXPORT void ArSyncTask::setState(ArTaskState::State state)
00081 {
00082 if (myStatePointer != NULL)
00083 *myStatePointer = state;
00084 else
00085 myState = state;
00086 }
00087
00088 AREXPORT std::string ArSyncTask::getName(void)
00089 {
00090 return myName;
00091 }
00092
00093
00099 AREXPORT ArSyncTask *ArSyncTask::find(ArFunctor *functor)
00100 {
00101 ArSyncTask *proc;
00102 std::multimap<int, ArSyncTask *>::iterator it;
00103
00104 if (myFunctor == functor)
00105 return this;
00106
00107 for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00108 {
00109 proc = (*it).second;
00110 if (proc->find(functor) != NULL)
00111 return proc;
00112 }
00113 return NULL;
00114
00115 }
00116
00122 AREXPORT ArSyncTask *ArSyncTask::find(const char *name)
00123 {
00124 ArSyncTask *proc;
00125 std::multimap<int, ArSyncTask *>::iterator it;
00126
00127 if (strcmp(myName.c_str(), name) == 0)
00128 return this;
00129
00130 for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00131 {
00132 proc = (*it).second;
00133 if (proc->find(name) != NULL)
00134 return proc;
00135 }
00136 return NULL;
00137
00138 }
00139
00145 AREXPORT ArSyncTask *ArSyncTask::findNonRecursive(const char * name)
00146 {
00147 ArSyncTask *proc;
00148 std::multimap<int, ArSyncTask *>::iterator it;
00149
00150 for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00151 {
00152 proc = (*it).second;
00153 if (strcmp(proc->getName().c_str(), name) == 0)
00154 return proc;
00155 }
00156 return NULL;
00157 }
00158
00164 AREXPORT ArSyncTask *ArSyncTask::findNonRecursive(ArFunctor *functor)
00165 {
00166 ArSyncTask *proc;
00167 std::multimap<int, ArSyncTask *>::iterator it;
00168
00169 for (it = myMultiMap.begin(); it != myMultiMap.end(); ++it)
00170 {
00171 proc = (*it).second;
00172 if (proc->getFunctor() == functor)
00173 return proc;
00174 }
00175 return NULL;
00176 }
00177
00186 AREXPORT void ArSyncTask::addNewBranch(const char *nameOfNew, int position,
00187 ArTaskState::State *state)
00188 {
00189 ArSyncTask *proc = new ArSyncTask(nameOfNew, NULL, state, this);
00190 myMultiMap.insert(std::pair<int, ArSyncTask *>(position, proc));
00191 }
00192
00204 AREXPORT void ArSyncTask::addNewLeaf(const char *nameOfNew, int position,
00205 ArFunctor *functor,
00206 ArTaskState::State *state)
00207 {
00208 ArSyncTask *proc = new ArSyncTask(nameOfNew, functor, state, this);
00209 myMultiMap.insert(std::pair<int, ArSyncTask *>(position, proc));
00210 }
00211
00212 AREXPORT void ArSyncTask::remove(ArSyncTask *proc)
00213 {
00214 std::multimap<int, ArSyncTask *>::iterator it;
00215
00216 for (it = myMultiMap.begin(); it != myMultiMap.end(); it++)
00217 {
00218 if ((*it).second == proc)
00219 {
00220 myMultiMap.erase(it);
00221 return;
00222 }
00223 }
00224 }
00225
00226 AREXPORT bool ArSyncTask::isDeleting(void)
00227 {
00228 return myIsDeleting;
00229 }
00230
00231 AREXPORT ArFunctor *ArSyncTask::getFunctor(void)
00232 {
00233 return myFunctor;
00234 }
00235
00241 AREXPORT void ArSyncTask::run(void)
00242 {
00243 std::multimap<int, ArSyncTask *>::reverse_iterator it;
00244 ArTaskState::State state;
00245 ArTime runTime;
00246 int took;
00247
00248 state = getState();
00249 switch (state)
00250 {
00251 case ArTaskState::SUSPEND:
00252 case ArTaskState::SUCCESS:
00253 case ArTaskState::FAILURE:
00254
00255 return;
00256 case ArTaskState::INIT:
00257 case ArTaskState::RESUME:
00258 case ArTaskState::ACTIVE:
00259 default:
00260 break;
00261 }
00262
00263 runTime.setToNow();
00264 if (myFunctor != NULL)
00265 myFunctor->invoke();
00266
00267 if (myNoTimeWarningCB != NULL && !myNoTimeWarningCB->invokeR() &&
00268 myFunctor != NULL && myWarningTimeCB != NULL &&
00269 (took = runTime.mSecSince()) > (signed int)myWarningTimeCB->invokeR())
00270 ArLog::log(ArLog::Normal,
00271 "Warning: Task '%s' took %d ms to run (longer than the %d warning time)",
00272 myName.c_str(), took, (signed int)myWarningTimeCB->invokeR());
00273
00274
00275 for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00276 (*it).second->run();
00277 }
00278
00284 AREXPORT void ArSyncTask::setWarningTimeCB(ArRetFunctor<unsigned int> *functor)
00285 {
00286 std::multimap<int, ArSyncTask *>::reverse_iterator it;
00287 myWarningTimeCB = functor;
00288 for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00289 (*it).second->setWarningTimeCB(functor);
00290 }
00291
00297 AREXPORT ArRetFunctor<unsigned int> *ArSyncTask::getWarningTimeCB(void)
00298 {
00299 return myWarningTimeCB;
00300 }
00301
00306 AREXPORT void ArSyncTask::setNoTimeWarningCB(ArRetFunctor<bool> *functor)
00307 {
00308 std::multimap<int, ArSyncTask *>::reverse_iterator it;
00309 myNoTimeWarningCB = functor;
00310 for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00311 (*it).second->setNoTimeWarningCB(functor);
00312 }
00313
00318 AREXPORT ArRetFunctor<bool> *ArSyncTask::getNoTimeWarningCB(void)
00319 {
00320 return myNoTimeWarningCB;
00321 }
00322
00323
00328 AREXPORT void ArSyncTask::log(int depth)
00329 {
00330 int i;
00331 std::multimap<int, ArSyncTask *>::reverse_iterator it;
00332 std::string str = "";
00333 ArTaskState::State state;
00334
00335 for (i = 0; i < depth; i++)
00336 str += "\t";
00337 str += myName.c_str();
00338 str += " (";
00339 state = getState();
00340 switch (state)
00341 {
00342 case ArTaskState::INIT:
00343 str += "INIT, running)";
00344 break;
00345 case ArTaskState::RESUME:
00346 str += "RESUME, running)";
00347 break;
00348 case ArTaskState::ACTIVE:
00349 str += "ACTIVE, running)";
00350 break;
00351 case ArTaskState::SUSPEND:
00352 str += "SUSPEND, NOT running)";
00353 break;
00354 case ArTaskState::SUCCESS:
00355 str += "SUCCESS, NOT running)";
00356 break;
00357 case ArTaskState::FAILURE:
00358 str += "FAILURE, NOT running)";
00359 break;
00360 default:
00361 str += state;
00362 str += ", running)";
00363 break;
00364 }
00365 ArLog::log(ArLog::Terse, const_cast<char *>(str.c_str()));
00366 for (it = myMultiMap.rbegin(); it != myMultiMap.rend(); it++)
00367 (*it).second->log(depth + 1);
00368
00369 }
00370