Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

ArSyncTask.cpp

00001 /*
00002 ActivMedia Robotics Interface for Applications (ARIA)
00003 Copyright (C) 2004,2005 ActivMedia Robotics, LLC
00004 
00005 
00006      This program is free software; you can redistribute it and/or modify
00007      it under the terms of the GNU General Public License as published by
00008      the Free Software Foundation; either version 2 of the License, or
00009      (at your option) any later version.
00010 
00011      This program is distributed in the hope that it will be useful,
00012      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014      GNU General Public License for more details.
00015 
00016      You should have received a copy of the GNU General Public License
00017      along with this program; if not, write to the Free Software
00018      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 
00020 If you wish to redistribute ARIA under different terms, contact 
00021 ActivMedia Robotics for information about a commercial version of ARIA at 
00022 robots@activmedia.com or 
00023 ActivMedia Robotics, 19 Columbia Drive, Amherst, NH 03031; 800-639-9481
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     // The task isn't running so just return
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 

Generated on Wed Oct 19 12:56:37 2005 for Aria by  doxygen 1.4.0