Example #1
0
bool handle_result(char *s) {
  char buf[MAXSTR] = {0};
  strcpy(buf, s);
  char *blockpos = strrchr(buf, ' ');
  int c;

  if(blockpos) {
    *(blockpos - 1) = '\0'; 
    blockpos++;

    blocks[nresults] = atoi(blockpos);
    strncpy(results[nresults++], buf, MAXSTR);

    maybe_draw_results();
  } else fatal("invalid: '%s'", buf);

  if((c = getch()) != ERR) {
    ungetch(c);
    return false;
  } else if (nresults >= MAXRES) {
    handle_finish();
    return false;
  } else
    return true;
}
Example #2
0
void article_handler(int c) {
  switch(c) {
    case KEY_ENTER:
    case 13:
      handle_finish();
      handler = search_handler;
      search_redraw();
      return;
  }
}
bool des::event_simulation::run() {
  if( events.size() == 0 ) return false;

  timer_control.set( events.peek().get_time() );

  while( // handle all events at the next time stamp
    events.size() > 0 &&
    events.peek().get_time() == timer() )
  {
    event e = events.pop();
    e.get_process()->transition( e.get_transition() );
    switch( e.get_transition() ) {
      case prc::DISPATCH: throw std::logic_error("DISPATCH found in event queue");
      case prc::PREEMPT:  handle_preempt(e.get_process()); break;
      case prc::BLOCK:    handle_block(e.get_process());   break;
      case prc::UNBLOCK:  handle_unblock(e.get_process()); break;
      case prc::ARRIVE:   handle_arrive(e.get_process());  break;
      case prc::FINISH:   handle_finish(e.get_process());  break;
    }
  }

  // if scheduler not busy, dispatch a process and create an event upon its return
  if( timer() >= busy_until )
  {
    auto res = sched->dispatch();
    process *p = res.first;
    if( p )
    {
      busy_until = timer() + res.second.second;
      total_cpu_on += res.second.second;
      prc::state_transition upon_end_of_execution = res.second.first;

      switch( upon_end_of_execution ) {
        case prc::FINISH:
        case prc::BLOCK:
        case prc::PREEMPT:
          events.push(busy_until, p, upon_end_of_execution);
          break;
        default:
          throw std::logic_error("Dispatched process returned in an unexpected state");
      }
    }
  }

  return true;
}