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; }
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; }