Changeset 601ef8 for src/Actions


Ignore:
Timestamp:
Jan 12, 2015, 10:10:30 PM (10 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
2440ce
Parents:
33c97e
git-author:
Frederik Heber <heber@…> (12/14/14 19:10:19)
git-committer:
Frederik Heber <heber@…> (01/12/15 22:10:30)
Message:

FIX: ActionQueue is no longer cleared when Action fails.

  • we only remove the present and all following Actions.
  • also cleaned up threaded/non-threaded parts of ActionQueue: CurrentAction, tempQueue is solely used in threaded part.
Location:
src/Actions
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/Action.cpp

    r33c97e r601ef8  
    146146  endTimer();
    147147
    148   if(shouldUndo() && state != failure){
    149     if(canUndo()){
     148  if (shouldUndo() && state != Action::failure) {
     149    if (canUndo()) {
    150150      ActionQueue::getInstance().addElement(this,state);
    151151    }
  • src/Actions/ActionQueue.cpp

    r33c97e r601ef8  
    4444#include <boost/date_time/posix_time/posix_time.hpp>
    4545#include <boost/version.hpp>
     46#include <iterator>
    4647#include <string>
    4748#include <sstream>
     
    6162    AR(new ActionRegistry()),
    6263    history(new ActionHistory),
    63     CurrentAction(0),
    6464#ifndef HAVE_ACTION_THREAD
    6565    lastActionOk(true)
    6666#else
     67    CurrentAction(0),
    6768    lastActionOk(true),
    6869    run_thread(boost::bind(&ActionQueue::run, this)),
     
    8283#ifdef HAVE_ACTION_THREAD
    8384  stop();
     85
     86  clearTempQueue();
    8487#endif
    8588
     
    111114    std::cerr << "Action " << *boost::get_error_info<ActionNameString>(e) << " has failed." << std::endl;
    112115    World::getInstance().setExitFlag(5);
    113 //    clearQueue();
     116    clearQueue(actionqueue.size()-1);
    114117    lastActionOk = false;
    115 //    std::cerr << "ActionQueue cleared." << std::endl;
     118    std::cerr << "Remaining Actions cleared from queue." << std::endl;
    116119  } catch (std::exception &e) {
    117120    pushStatus("FAIL: General exception caught, aborting.");
    118121    World::getInstance().setExitFlag(134);
    119     clearQueue();
     122    clearQueue(actionqueue.size()-1);
    120123    lastActionOk = false;
    121     std::cerr << "ActionQueue cleared." << std::endl;
     124    std::cerr << "Remaining Actions cleared from queue." << std::endl;
    122125  }
    123126  if (lastActionOk) {
     
    127130  }
    128131#else
    129   {
    130     boost::lock_guard<boost::mutex> lock(mtx_idle);
    131     run_thread_isIdle = (CurrentAction == actionqueue.size());
    132   }
     132  setRunThreadIdle(CurrentAction == actionqueue.size());
    133133  mtx_queue.unlock();
    134134#endif
     
    144144  mtx_queue.lock();
    145145  tempqueue.push_back( newaction );
    146   {
    147     boost::lock_guard<boost::mutex> lock(mtx_idle);
    148     run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
    149   }
     146  setRunThreadIdle( !((CurrentAction != actionqueue.size()) || !tempqueue.empty()) );
    150147  mtx_queue.unlock();
    151148#endif
     
    184181        pushStatus("FAIL: Action "+*boost::get_error_info<ActionNameString>(e)+" has failed.");
    185182        World::getInstance().setExitFlag(5);
    186         clearQueue();
     183        clearQueue(CurrentAction);
     184        clearTempQueue();
    187185        lastActionOk = false;
    188         std::cerr << "ActionQueue cleared." << std::endl;
    189         CurrentAction = (size_t)-1;
     186        std::cerr << "Remaining Actions cleared from queue." << std::endl;
    190187      } catch (std::exception &e) {
    191188        pushStatus("FAIL: General exception caught, aborting.");
    192189        World::getInstance().setExitFlag(134);
    193         clearQueue();
    194         std::cerr << "ActionQueue cleared." << std::endl;
    195         CurrentAction = (size_t)-1;
     190        clearQueue(CurrentAction);
     191        clearTempQueue();
     192        std::cerr << "Remaining Actions cleared from queue." << std::endl;
    196193      }
    197194      if (lastActionOk) {
     
    199196        NOTIFY(ActionQueued);
    200197        _lastchangedaction = actionqueue[CurrentAction];
     198        mtx_queue.lock();
     199        CurrentAction++;
     200        mtx_queue.unlock();
    201201      }
    202202      // access actionqueue, hence using mutex
    203203      mtx_queue.lock();
    204       // step on to next action and check for end
    205       CurrentAction++;
    206204      // insert new actions (before [CurrentAction]) if they have been spawned
    207205      // we must have an extra vector for this, as we cannot change actionqueue
     
    211209      mtx_queue.unlock();
    212210    }
    213     {
    214       boost::lock_guard<boost::mutex> lock(mtx_idle);
    215       run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
    216     }
     211    setRunThreadIdle( !((CurrentAction != actionqueue.size()) || !tempqueue.empty()) );
    217212    cond_idle.notify_one();
    218213//    LOG(1, "DEBUG: End of ActionQueue's run() loop.");
    219214  } while (!Interrupted);
    220215}
    221 #endif
    222216
    223217void ActionQueue::insertTempQueue()
     
    231225}
    232226
    233 #ifdef HAVE_ACTION_THREAD
    234227void ActionQueue::wait()
    235228{
     
    316309}
    317310
    318 void ActionQueue::clearQueue()
    319 {
    320   // free all actions contained in actionqueue
    321   for (ActionQueue_t::iterator iter = actionqueue.begin();
    322       !actionqueue.empty(); iter = actionqueue.begin()) {
     311void ActionQueue::clearQueue(const size_t _fromAction)
     312{
     313#ifdef HAVE_ACTION_THREAD
     314  mtx_queue.lock();
     315#endif
     316  LOG(1, "Removing all Actions from position " << _fromAction << " onward.");
     317  // free all actions still to be called contained in actionqueue
     318  ActionQueue_t::iterator inititer = actionqueue.begin();
     319  std::advance(inititer, _fromAction);
     320  for (ActionQueue_t::iterator iter = inititer; iter != actionqueue.end(); ++iter)
    323321    delete *iter;
    324     actionqueue.erase(iter);
    325   }
     322  actionqueue.erase(inititer, actionqueue.end());
     323  LOG(1, "There are " << actionqueue.size() << " remaining Actions.");
     324#ifdef HAVE_ACTION_THREAD
     325  CurrentAction = actionqueue.size();
     326  mtx_queue.unlock();
     327#endif
     328}
     329
     330#ifdef HAVE_ACTION_THREAD
     331void ActionQueue::clearTempQueue()
     332{
    326333  // free all actions contained in tempqueue
    327334  for (ActionQueue_t::iterator iter = tempqueue.begin();
     
    330337    tempqueue.erase(iter);
    331338  }
    332 #ifdef HAVE_ACTION_THREAD
     339}
     340
     341void ActionQueue::setRunThreadIdle(const bool _flag)
     342{
    333343  {
    334344    boost::unique_lock<boost::mutex> lock(mtx_idle);
    335     run_thread_isIdle = true;
    336   }
    337 #endif
    338 }
     345    run_thread_isIdle = _flag;
     346  }
     347}
     348#endif
    339349
    340350const ActionQueue::ActionTokens_t ActionQueue::getListOfActions() const
  • src/Actions/ActionQueue.hpp

    r33c97e r601ef8  
    202202  void clear();
    203203
    204   /** Clears all actions currently present in the actionqueues.
    205    *
    206    */
    207   void clearQueue();
    208 
    209 #ifdef HAVE_ACTION_THREAD
     204  /** Clears all actions present in the actionqueues from \a _fromAction.
     205   *
     206   * @param _fromAction 0 if all Actions to clear or else
     207   */
     208  void clearQueue(const size_t _fromAction = 0);
     209
     210#ifdef HAVE_ACTION_THREAD
     211
     212  /** Clears the temporary queue.
     213   *
     214   */
     215  void clearTempQueue();
     216
     217  /** Sets the run_thread_isIdle flag.
     218   *
     219   * @param _flag state to set to
     220   */
     221  void setRunThreadIdle(const bool _flag);
     222
    210223  /** Runs the ActionQueue.
    211224   *
     
    226239   */
    227240  void wait();
     241
     242  /** Moves all action from tempqueue into real queue.
     243   *
     244   */
     245  void insertTempQueue();
     246
    228247#endif
    229248
     
    236255  void insertAction(Action *_action, enum Action::QueryOptions state);
    237256
    238   /** Moves all action from tempqueue into real queue.
    239    *
    240    */
    241   void insertTempQueue();
    242 
    243257private:
    244258  /** Private cstor for ActionQueue.
     
    267281  ActionQueue_t actionqueue;
    268282
     283  //!> indicates that the last action has failed
     284  bool lastActionOk;
     285
     286#ifdef HAVE_ACTION_THREAD
    269287  //!> point to current action in actionqueue
    270288  size_t CurrentAction;
     
    273291  ActionQueue_t tempqueue;
    274292
    275   //!> indicates that the last action has failed
    276   bool lastActionOk;
    277 
    278 #ifdef HAVE_ACTION_THREAD
    279293  //!> internal thread to call Actions
    280294  boost::thread run_thread;
Note: See TracChangeset for help on using the changeset viewer.