diff --git a/src/text_simulation.cc b/src/text_simulation.cc index adee9cd..c214f21 100644 --- a/src/text_simulation.cc +++ b/src/text_simulation.cc @@ -419,59 +419,6 @@ TextSimulation::on_configure_cpu_policy(const Tokens& arguments) parameters.set_int(p.get_name(), cmd_p.value); ++it; - - // ostringstream buf; -// -// buf << "\n"; -// -// if(p.is_required()) -// buf << "*"; -// -// buf << p.get_name() << " (range: [" << p.get_lower_bound() << ", " << -// p.get_upper_bound() << "] default: " << p.get_default() << ") = "; -// -// p_stdout(buf.str()); -// -// bool correct = true; -// -// ustring input = readline(); -// -// int value; -// -// // FIXME semi-hack, it's a bit overkill to tokenize the string -// // to find if it's only composed of white spaces... -// // Indedeed there's a pro: by using extensively tokenize() we are more sure -// // it's correct ;-) -// if(tokenize(input).size() > 0) -// { -// try -// { -// value = string_to(input); -// -// if(value > p.get_upper_bound() || value < p.get_lower_bound()) -// { -// p_stderr(_("\nERROR: Provided value is out of range")); -// correct = false; -// } -// } -// catch(domain_error e) -// { -// p_stderr(_("\nERROR: Please provide a valid integer value")); -// correct = false; -// } -// -// if(correct) -// parameters.set_int(p.get_name(), value); -// } -// else if(p.is_required()) -// { -// p_stderr(_("\nERROR: This is a mandatory attribute; you MUST provide a valid value!")); -// -// correct = false; -// } -// -// if(correct) -// ++it; } p_stdout(_("\nFloating-point arguments:\n")); @@ -494,58 +441,6 @@ TextSimulation::on_configure_cpu_policy(const Tokens& arguments) parameters.set_float(p.get_name(), cmd_p.value); ++it; -// ostringstream buf; -// -// buf << "\n"; -// -// if(p.is_required()) -// buf << "*"; -// -// buf << p.get_name() << " (range: [" << p.get_lower_bound() << ", " << -// p.get_upper_bound() << "] default: " << p.get_default() << ") = "; -// -// p_stdout(buf.str()); -// -// bool correct = true; -// -// ustring input = readline(); -// -// float value; -// -// // FIXME semi-hack, it's a bit overkill to tokenize the string -// // to find if it's only composed of white spaces... -// // Indedeed there's a pro: by using extensively tokenize() we are more sure -// // it's correct ;-) -// if(tokenize(input).size() > 0) -// { -// try -// { -// value = string_to(input); -// -// if(value > p.get_upper_bound() || value < p.get_lower_bound()) -// { -// p_stderr(_("\nERROR: Provided value is out of range")); -// correct = false; -// } -// } -// catch(domain_error e) -// { -// p_stderr(_("\nERROR: Please provide a valid floating-point value")); -// correct = false; -// } -// -// if(correct) -// parameters.set_float(p.get_name(), value); -// } -// else if(p.is_required()) -// { -// p_stderr(_("\nERROR: This is a mandatory attribute; you MUST provide a valid value!")); -// -// correct = false; -// } -// -// if(correct) -// ++it; } p_stdout(_("\nString arguments:\n")); @@ -563,32 +458,6 @@ TextSimulation::on_configure_cpu_policy(const Tokens& arguments) parameters.set_string(p.get_name(), cmd_p.value); ++it; - -// ustring buf; -// -// buf = "\n"; -// -// if(p.is_required()) -// buf += "*"; -// -// p_stdout(buf + p.get_name() + " = "); -// -// buf = readline(); -// -// // FIXME semi-hack, it's a bit overkill to tokenize the string -// // to find if it's only composed of white spaces... -// // Indedeed there's a pro: by using extensively tokenize() we are more sure -// // it's correct ;-) -// Tokens tokens = tokenize(buf); -// -// if(tokens.size() == 0 && p.is_required()) -// p_stderr(_("\nERROR: This is a mandatory atribute; you MUST provide a valid value!")); -// else -// { -// // FIXME should we insert the entire line here or just a token? -// parameters.set_string(p.get_name(), buf); -// ++it; -// } } } @@ -1436,397 +1305,66 @@ TextSimulation::parse_command(TextSimulation& sim, const ustring& str) (sim.*(command_handlers[key]))(arguments); } -// ** Please do NOT delete this code, I still use it as a reference ** -//void -//TextSimulation::parse_command(pair< pair, const ustring > p) -//{ -// -// TextSimulation* obj = p.first.first; -// ustring str = p.second; -// //looks for the IOManager who sent the command -// uint quale = 0; -// for (; quale < obj->_devices.size(); quale++) -// if (p.first.second == &(*obj->_devices[quale])) -// break; -// -// if (str.length() == 0) -// return; -// -// //CAPITALIZE alla grguments -// str = str.uppercase(); -// -// vector arguments; -// uint f = 0; -// static const ustring whitespaces = " \r\b\n\t\a"; -// //fills the vector with parameters -// while (true) -// { -// f = str.find_first_of(whitespaces); -// if (f > str.length()) -// { -// //the end of the string -// arguments.push_back(str); -// break; -// } -// else -// { -// //add the token -// arguments.push_back(str.substr(0, f)); -// //trim the initial whitespaces -// str = str.substr(f + 1); -// f = str.find_first_not_of(whitespaces); -// str = str.substr(f); -// } -// } -// -// if (arguments.size() == 0) -// return; -// -// bool show_help = false; -// int param = 0; -//check: -// -// if (arguments[param] == "RUN") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- RUN COMMAND --\nStarts the simulation. It can be continuous or step-by-step" -// " depending on the mode configured with SetMode (default=continuous).\n\n" -// "The output of RUN is one or more rows each of which represents the state of the " -// "schedulable entities. It can be RUNNING, READY, BLOCKED, FUTURE or TERMINATED." -// "\nThe row begins with the number of the instant described by the following lists of states. " -// "The instant 0 represents the INITIAL STATE during which no process is running. The scheduler " -// "activity begins at instant 1. Each schedulable entity is represented by its name followed " -// "by its priority enclosed between round parenthesis.")); -// return; -// } -// -// try -// { -// obj->run(); -// } -// catch(UserInterruptException e) -// { -// obj->_devices[quale]->write_buffer(_("\nERROR: ")); -// obj->_devices[quale]->write_buffer(_(e.what())); -// obj->_devices[quale]->write_buffer(_("\nSimulation is now stopped")); -// -// } -// } -// else if (arguments[param] == "PAUSE") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- PAUSE COMMAND --\nPauses the simulation. The next call to RUN will restart it.")); -// return; -// } -// obj->pause(); -// } -// else if (arguments[param] == "STOP") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- STOP COMMAND --\nStops the simulation. The next call to RUN will " -// "bring the simulation to the FIRST instant and start it.")); -// return; -// } -// obj->stop(); -// } -// else if (arguments[param] == "RESET") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- RESET COMMAND --\nResets the simulation jumping back to the first instant.")); -// return; -// } -// obj->reset(); -// } -// else if (arguments[param] == "QUIT") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- QUIT COMMAND --\nExits the program.")); -// return; -// } -// obj->_devices[quale]->write_buffer(_("\n\n*** Thank you for using SGPEM by Sirius Cybernetics Corporation ***\n\n")); -// exit(1); -// } -// else if (arguments[param] == "HELP") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- Do you really want me to explain what HELP means? --" -// "\n ************** YOU ARE JOKING ME !!! ************\n\n")); -// exit(1); -// } -// if (arguments.size() == 1) -// { -// obj->_devices[quale]->write_buffer( "\nAvaiable commands:\nRUN\nPAUSE\nSTOP\nRESET\nQUIT\nHELP" -// "\nGETMODE\nSETMODE\nSETTIMER\nGETTIMER\nJUMPTO\nGETPOLICY" -// "\nSETPOLICY\nGETPOLICYATTRIBUTES" -// "\n\nHELP followed by a command shows help about it." -// "\n ex. HELP RUN shows help about the command RUN"); -// return; -// } -// show_help = true; -// param = 1; -// goto check; -// } -// else if (arguments[param] == "SETMODE") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- SetMode COMMAND --\nPermits to change the mode of the simulation.\n\nSintax: Setmode \n\t can take values:\n" -// "\n\t\tCONTINUOUS - when calling RUN the simulation will show an animation using the wait-interval set by SETTIMER\n" -// "\n\t\tSTEP - when calling RUN the simulation will show only one step of the animation\n")); -// return; -// } -// if (arguments.size() != 2) -// { -// obj->_devices[quale]->write_buffer(_("\nERROR: wrong number of parameters." -// "\nType HELP SETMODE for the description of the sintax")); -// return; -// } -// if (arguments[1] == "CONTINUOUS") -// obj->set_mode(true); -// else if (arguments[1] == "STEP") -// obj->set_mode(false); -// else -// obj->_devices[quale]->write_buffer(_("\nERROR: the second parameter can be only CONTINUOUS or STEP")); -// -// } -// else if (arguments[param] == "GETMODE") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- GetMode COMMAND --\nReturns\n\tCONTINUOUS : if the simulation is shown with an animation" -// "\n\tSTEP : if if the simulation is shown step-by-step")); -// return; -// } -// if (obj->get_mode()) -// obj->_devices[quale]->write_buffer(_("\nCONTINUOUS")); -// else -// obj->_devices[quale]->write_buffer(_("\nSTEP")); -// } -// else if (arguments[param] == "SETTIMER") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- SetTimer COMMAND --\nPermits to change the interval between a step and the following one during a continuous animation." -// "\n\nSintax: SetTimer \n\t must be an integer value > 0 and < 10000.\n")); -// return; -// } -// if (arguments.size() != 2) -// { -// obj->_devices[quale]->write_buffer(_("\nERROR: wrong number of parameters." -// "\nType HELP SETTIMER for the description of the sintax")); -// return; -// } -// int num; -// if (string_to_int(arguments[1], num) && num > 0 && num < 10000) -// obj->set_timer(num); -// else -// obj->_devices[quale]->write_buffer(_( -// "\nERROR: the second parameter has a wrong value." -// "\nType HELP SETTIMER for the description of the sintax")); -// } -// else if (arguments[param] == "GETTIMER") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- GetTimer COMMAND --\nReturns the number of milliseconds the simulation " -// "in the continuous mode waits between a step and the following one")); -// return; -// } -// ustring ss; -// int_to_string(obj->get_timer(), ss); -// obj->_devices[quale]->write_buffer(ss); -// } -// else if (arguments[param] == "JUMPTO") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- JumpTo COMMAND --\nPermits to jump to a desired instant of the simulation." -// " All states of the simulation before will be recalculated and printed out." -// "\n\nSintax: JumpTo \n\t must be an integer value >= 0")); -// return; -// } -// if (arguments.size() != 2) -// { -// obj->_devices[quale]->write_buffer(_("\nERROR: wrong number of parameters." -// "\nType HELP JUMPTO for the description of the sintax")); -// return; -// } -// int num; -// if (string_to_int(arguments[1], num) && num >= 0) -// obj->jump_to(num); -// else -// obj->_devices[quale]->write_buffer(_( -// "\nERROR: the second parameter has a wrong value." -// "\nType HELP JUMPTO for the description of the sintax")); -// } -// else if (arguments[param] == "GETPOLICY") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- GetPolicy COMMAND --\nReturns the name and the description of the current applied policy.")); -// return; -// } -// obj->_devices[quale]->write_buffer(obj->get_policy()->get_description()); -// } -// else if(arguments[param] == "SETPOLICY") -// { -// if(show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- SetPolicy COMMAND --\nSelects the current applied policy." -// "Syntax: SetPolicy ")); -// return; -// } -// -// -// //FIXME assuming only one policy manager is present, but who cares, this -// //is only temporary code... -// PolicyManager* manager = PoliciesGatekeeper::get_instance().get_registered()[0]; -// -// vector available = manager->get_avail_policies(); -// -// -// obj->_devices[quale]->write_buffer(arguments[1] + "\n"); -// -// for(vector::iterator it = available.begin(); it != available.end(); ++it) -// { -// if((*it)->get_name().casefold() == arguments[1].casefold()) -// { -// obj->stop(); -// PoliciesGatekeeper::get_instance().activate_policy(&History::get_instance(), *it); -// return; -// } -// } -// -// -// obj->_devices[quale]->write_buffer(_( -// "\nERROR: no policy found with that name." -// "\nType HELP SETPOLICY for the description of the sintax")); -// -// } -// else if(arguments[param] == "LISTPOLICIES") -// { -// if(show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- ListPolicies COMMAND --\nShows the name of available policies.")); -// return; -// } -// -// //FIXME assuming only one policy manager is present, but who cares, this -// //is only temporary code... -// PolicyManager* manager = PoliciesGatekeeper::get_instance().get_registered()[0]; -// -// vector available = manager->get_avail_policies(); -// -// for(vector::iterator it = available.begin(); it != available.end(); ++it) -// { -// -//// Glib::ustring str; -//// int_to_string((int)*it, str); -//// obj->_devices[quale]->write_buffer(str + "\n"); -// obj->_devices[quale]->write_buffer("\n" + (*it)->get_name()); -// } -// } -// else if (arguments[param] == "GETPOLICYATTRIBUTES") -// { -// if (show_help) -// { -// obj->_devices[quale]->write_buffer(_( -// "\n-- GetPolicyAttributes COMMAND --\nReturns the list of attributes of the current applied policy." -// "\nThe description of each parameter includes:" -// "\n\tthe NAME of the marameter with its type\n\tits current VALUE" -// "\n\tits LOWER and UPPER bounds\n\twhether the parameter is REQUIRED")); -// return; -// } -// -// ustring temp; -// -// const PolicyParameters& param = obj->get_policy()->get_parameters(); -// map > map_i = param.get_registered_int_parameters(); -// map >::iterator i_i = map_i.begin(); -// -// for(; i_i != map_i.end(); i_i++) -// { -// obj->_devices[quale]->write_buffer("\nint\t" + i_i->second.get_name()); -// int_to_string(i_i->second.get_value(), temp); -// obj->_devices[quale]->write_buffer("\tvalue=" + temp); -// int_to_string(i_i->second.get_lower_bound(), temp); -// obj->_devices[quale]->write_buffer("\t\tlower=" + temp); -// int_to_string(i_i->second.get_upper_bound(), temp); -// obj->_devices[quale]->write_buffer("\t\tupper=" + temp); -// if (i_i->second.is_required()) -// obj->_devices[quale]->write_buffer("\t\trequired=true"); -// else -// obj->_devices[quale]->write_buffer("\t\trequired=false"); -// } -// -// map > map_f = param.get_registered_float_parameters(); -// map >::iterator i_f = map_f.begin(); -// -// for(; i_f != map_f.end(); i_f++) -// { -// obj->_devices[quale]->write_buffer("\nfloat\t" + i_f->second.get_name()); -// float_to_string(i_f->second.get_value(), temp); -// obj->_devices[quale]->write_buffer("\tvalue=" + temp); -// float_to_string(i_f->second.get_lower_bound(), temp); -// obj->_devices[quale]->write_buffer("\t\tlower=" + temp); -// float_to_string(i_f->second.get_upper_bound(), temp); -// obj->_devices[quale]->write_buffer("\t\tupper=" + temp); -// if (i_f->second.is_required()) -// obj->_devices[quale]->write_buffer("\t\trequired=true"); -// else -// obj->_devices[quale]->write_buffer("\t\trequired=false"); -// } -// -// map > map_s = param.get_registered_string_parameters(); -// map >::iterator i_s = map_s.begin(); -// -// for(; i_s != map_s.end(); i_s++) -// { -// obj->_devices[quale]->write_buffer("\nustring\t" + i_s->second.get_name()); -// obj->_devices[quale]->write_buffer("\tvalue=" + i_s->second.get_value()); -// if (i_s->second.is_required()) -// obj->_devices[quale]->write_buffer(" required=true"); -// else -// obj->_devices[quale]->write_buffer(" required=false"); -// } -// -// } -// else -// { -// obj->_devices[quale]->write_buffer(_("\nCommand not recognized: ")); -// obj->_devices[quale]->write_buffer(arguments[param]); -// obj->_devices[quale]->write_buffer(_("\nTyper HELP for a list of avaiable commands.")); -// return; -// } -//} +static ostream& +operator<<(ostream& os, Schedulable::state state) +{ + switch(state) + { + case Schedulable::state_running: + os << "RUNNING"; + break; + case Schedulable::state_ready: + os << "READY"; + break; + case Schedulable::state_blocked: + os << "BLOCKED"; + break; + case Schedulable::state_future: + os << "FUTURE"; + break; + case Schedulable::state_terminated: + os << "TERMINATED"; + break; + default: + os.setstate(ios_base::failbit); + } + + return os; +} +static ostream& +operator<<(ostream& os, Request::state state) +{ + switch(state) + { + case Request::state_unallocable: + os << "UNALLOCABLE"; + break; + case Request::state_allocated: + os << "ALLOCATED"; + break; + case Request::state_future: + os << "FUTURE"; + break; + case Request::state_exhausted: + os << "EXHAUSTED"; + break; + case Request::state_allocable: + os << "ALLOCABLE"; + break; + default: + os.setstate(ios_base::failbit); + } + + return os; +} void TextSimulation::update(const History& changed_history) { ostringstream oss; - oss << changed_history.get_size() - 1 << _(".\tready queue: { "); + oss << ">>>> " << changed_history.get_size() - 1 << _("\nREADY QUEUE: { "); p_stdout(oss.str()); @@ -1844,7 +1382,7 @@ TextSimulation::update(const History& changed_history) p_stdout("}\n"); - p_stdout(_("\tresources:\n")); + p_stdout(_("RESOURCES:\n")); const Environment::Resources& resources = env.get_resources(); typedef Environment::Resources::const_iterator ResourceIt; @@ -1854,7 +1392,7 @@ TextSimulation::update(const History& changed_history) const Resource& r = *it->second; Environment::resource_key_t key = it->first; - oss << "\t\t" << key << ". " << r.get_name() << _(", with "); + oss << " " << key << ") " << r.get_name() << _(", with "); oss << r.get_places() << _(" places\n"); @@ -1878,7 +1416,7 @@ TextSimulation::update(const History& changed_history) // p_stdout("}\n"); } - p_stdout(_("\tprocesses:\n")); + p_stdout(_("PROCESSES:\n")); const Environment::Processes& processes = env.get_processes(); @@ -1886,88 +1424,59 @@ TextSimulation::update(const History& changed_history) { Process& p = *processes[pi]; - oss << "\t\t" << pi + 1 << ". " << p.get_name() << " "; + oss << " " << pi + 1 << ") " << p.get_name() << " "; oss << "[" << p.get_state() << "] "; - oss << _("arriving at ") << p.get_arrival_time() << " "; - oss << _("requiring ") << p.get_total_cpu_time() << " "; - oss << _("elapsed ") << p.get_elapsed_time() << " "; + oss << _("arriving at ") << p.get_arrival_time() << ", "; + oss << _("requiring ") << p.get_total_cpu_time() << ", "; + oss << _("elapsed ") << p.get_elapsed_time() << ", "; oss << _("priority ") << p.get_current_priority() << endl; p_stdout(oss.str()); oss.str(string()); + + vector threads = p.get_threads(); + + for(unsigned int ti = 0; ti < threads.size(); ++ti) + { + Thread& t = *threads[ti]; + + oss << " " << ti + 1 << ") " << t.get_name() << " "; + oss << "[" << t.get_state() << "] "; + oss << _("arriving at ") << t.get_arrival_time() << ", "; + oss << _("requiring ") << t.get_total_cpu_time() << ", "; + oss << _("elapsed ") << t.get_elapsed_time() << ", "; + oss << _("priority ") << t.get_current_priority() << endl; + + p_stdout(oss.str()); + oss.str(string()); + + vector requests = t.get_requests(); + + for(unsigned int ri = 0; ri < requests.size(); ++ri) + { + Request& r = *requests[ri]; + + vector subrequests = r.get_subrequests(); + + for(unsigned int sri = 0; sri < subrequests.size(); ++sri) + { + SubRequest& sr = *subrequests[sri]; + oss << _(" --> request ") << ri + 1 << "." << sri + 1 << ") "; + oss << _("at ") << r.get_instant() << " "; + oss << _("for resource ") << sr.get_resource_key() << " "; + oss << "[" << sr.get_state() << "] "; + oss << _("requiring ") << sr.get_length() << ", "; + oss << _("remaining ") << sr.get_remaining_time() << endl; + + p_stdout(oss.str()); + oss.str(string()); + } + } + + } } p_stdout("\n"); - - - - -// History& h = History::get_instance(); -// int when, arr; -// ustring temp; -// -// when = h.get_current_time(); -// smart_ptr ll = h.get_simulation_status_at(when); -// -// for (uint dev = 0; dev < _devices.size(); dev++) -// { -// int_to_string(when, temp); -// if (when < 10) -// _devices[dev]->write_buffer("\n "); -// else -// _devices[dev]->write_buffer("\n"); -// _devices[dev]->write_buffer(temp + ") [RUNS]"); -// -// //insert the RUNNING ONE -// smart_ptr running = h.get_scheduled_at(when); -// if (running) -// { -// arr = running->get_schedulable()->get_arrival_time(); -// int_to_string(arr, temp); -// _devices[dev]->write_buffer(" " + running->get_schedulable()->get_name() + "_(" + temp + ")"); -// } -// -// _devices[dev]->write_buffer(" --[READY]"); -// //insert the READY ones -// for (uint i = 0; i < ll->size(); i++) -// if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_ready) -// { -// arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time(); -// int_to_string(arr, temp); -// _devices[dev]->write_buffer(" " + ll->get_item_at(i)->get_schedulable()->get_name() + "_(" + temp + ")"); -// } -// -// _devices[dev]->write_buffer(" --[BLOCKED]"); -// //insert the BLOCKED ones -// for (uint i = 0; i < ll->size(); i++) -// if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_blocked) -// { -// arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time(); -// int_to_string(arr, temp); -// _devices[dev]->write_buffer(" " + ll->get_item_at(i)->get_schedulable()->get_name() + "_(" + temp + ")"); -// } -// -// _devices[dev]->write_buffer(" --[FUTURE]"); -// //insert the FUTURE ones -// for (uint i = 0; i < ll->size(); i++) -// if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_future) -// { -// arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time(); -// int_to_string(arr, temp); -// _devices[dev]->write_buffer(" " + ll->get_item_at(i)->get_schedulable()->get_name() + "_(" + temp + ")"); -// } -// -// _devices[dev]->write_buffer(" --[TERM]"); -// //insert the TERMINATED ones -// for (uint i = 0; i < ll->size(); i++) -// if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_terminated) -// { -// arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time(); -// int_to_string(arr, temp); -// _devices[dev]->write_buffer(" " + ll->get_item_at(i)->get_schedulable()->get_name() + "_(" + temp + ")"); -// } -// -// } } void