| 14459 | } |
| 14460 | |
| 14461 | void TrackerBase::close() { |
| 14462 | |
| 14463 | // Close any still open children (e.g. generators) |
| 14464 | while( &m_ctx.currentTracker() != this ) |
| 14465 | m_ctx.currentTracker().close(); |
| 14466 | |
| 14467 | switch( m_runState ) { |
| 14468 | case NeedsAnotherRun: |
| 14469 | break; |
| 14470 | |
| 14471 | case Executing: |
| 14472 | m_runState = CompletedSuccessfully; |
| 14473 | break; |
| 14474 | case ExecutingChildren: |
| 14475 | if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) ) |
| 14476 | m_runState = CompletedSuccessfully; |
| 14477 | break; |
| 14478 | |
| 14479 | case NotStarted: |
| 14480 | case CompletedSuccessfully: |
| 14481 | case Failed: |
| 14482 | CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState ); |
| 14483 | |
| 14484 | default: |
| 14485 | CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState ); |
| 14486 | } |
| 14487 | moveToParent(); |
| 14488 | m_ctx.completeCycle(); |
| 14489 | } |
| 14490 | void TrackerBase::fail() { |
| 14491 | m_runState = Failed; |
| 14492 | if( m_parent ) |