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