// src/main.cc - Copyright 2005, 2006, University // of Padova, dept. of Pure and Applied // Mathematics // // This file is part of SGPEMv2. // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // SGPEMv2 is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with SGPEMv2; if not, write to the Free Software // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "config.h" #include "gettext.h" #include "main.hh" #include "parse_opts.hh" #include "start_gui.hh" #include "backend/history.hh" #include "backend/static_schedulable.hh" #include "backend/ready_queue.hh" #include "backend/dynamic_schedulable.hh" #include "backend/slice.hh" #include "backend/static_process.hh" #include "backend/policy.hh" #include "backend/policy_parameters.hh" #include "backend/global_preferences.hh" #include "standard_io.hh" #include "text_simulation.hh" #include "smartp.tcc" #include #include #include #include #include #include #include #include using namespace std; using namespace sgpem; using namespace memory; using Glib::ustring; static void load_pyloader_plugin() { // FIXME: this will need to be moved to an // appropriate PluginManager class in the backend, // and the Makefile fixed accordingly (partly done). using Glib::Module; // Leaks willingly: Module* pyloader = 0; GlobalPreferences& prefs = GlobalPreferences::get_instance(); GlobalPreferences::dir_iterator it = prefs.modules_dir_begin(); while(it != prefs.modules_dir_end()) { std::string pyloader_path = Module::build_path(*it, "pyloader"); pyloader = new Module(pyloader_path); if(*pyloader) break; else delete pyloader; it++; } if(!*pyloader) std::cerr << Module::get_last_error() << std::endl; // For the moment, we want to be sure it has been loaded: assert(*pyloader); } int main(int argc, char* argv[]) { using namespace sgpem; // Set up gettext support setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); // Set up Glib thread support Glib::thread_init(); // Parses options and prepares vector with // filenames of documents to be opened vector filenames; { int a_count = argc; char** a_ptr = argv; parse_options(a_count, a_ptr); filenames.insert(filenames.begin(), a_ptr, a_ptr + a_count); } load_pyloader_plugin(); // Create an INITIAL STATE StaticProcess p1("P1", 0, 5, 1); StaticProcess p2("P2", 0, 5, 2); StaticProcess p3("P3", 5, 3, 3); StaticProcess p4("P4", 6, 2, 3); StaticProcess p5("P5", 1, 2, 3); StaticProcess p6("P6", 10, 2, 1); DynamicSchedulable ss1(p1); DynamicSchedulable ss2(p2); DynamicSchedulable ss3(p3); DynamicSchedulable ss4(p4); DynamicSchedulable ss5(p5); DynamicSchedulable ss6(p6); ReadyQueue initial; initial.add_at_bottom(ss1); initial.add_at_bottom(ss2); initial.add_at_bottom(ss3); initial.add_at_bottom(ss4); initial.add_at_bottom(ss5); initial.add_at_bottom(ss6); History::get_instance().enqueue_slice(initial); Scheduler::get_instance(); // Forces initialization of scheduler. // Cross fingers (depends if PythonPolicyManager // static object has been initialized before?). //the textual simulation TextSimulation text_sim; History::get_instance().attach(&text_sim); //textual IO smart_ptr io(new StandardIO()); text_sim.add_io_device(io); text_sim.update(); //grafical IO start_gui(argc, argv, text_sim); //SMOKE-TEST for backend classes /* cout << "\n\n********************************"; // ************** TEST HISTORY ReadyQueue l1; l1.add_at_top(ss1); l1.add_at_top(ss2); l1.add_at_top(ss3); ReadyQueue l2; l2.add_at_top(ss4); l2.add_at_top(ss5); l2.add_at_top(ss6); History h(History::get_instance()); h.enqueue_slice(l1); //stato iniziale h.enqueue_slice(l2); smart_ptr quale; quale = h.get_simulation_status_at(0); //stato iniziale cout << quale->get_item_at(0)->get_schedulable()->get_name(); smart_ptr quale2 = h.get_scheduled_at(1); cout << quale2->get_schedulable()->get_name(); h.truncate_at(0); quale = h.get_simulation_status_at(0); //stato iniziale cout << bool(quale) << " " << quale->get_item_at(0)->get_schedulable()->get_name(); */ /* smart_ptr quale; quale = h.get_simulation_status_at(0); if (quale) cout << "\n" << quale->get_running()->get_schedulable()->get_name(); else cout << "NO"; quale = h.get_simulation_status_at(1); if (quale) cout << "\n" << quale->get_running()->get_schedulable()->get_name(); else cout << "NO"; quale = h.get_simulation_status_at(2); if (quale) cout << "\n" << quale->get_running()->get_schedulable()->get_name(); else cout << "NO"; h.truncate_at(2); smart_ptr quale2; quale2 = h.get_scheduled_at(0); if (quale2) cout << "\n" << quale2->get_schedulable()->get_name(); else cout << "NO"; quale2 = h.get_scheduled_at(1); if (quale2) cout << "\n" << quale2->get_schedulable()->get_name(); else cout << "NO"; quale2 = h.get_scheduled_at(2); if (quale2) cout << "\n" << quale2->get_schedulable()->get_name(); else cout << "NO"; */ //************** TEST QUEUE /* cout << "\n\nTEST QUEUE\n"; ReadyQueue sq; sq.add_at_bottom(ss1); sq.add_at_bottom(ss2); sq.add_at_bottom(ss3); cout << sq.get_item_at(0)->get_schedulable()->get_name() << "\n"; cout << sq.get_item_at(1)->get_schedulable()->get_name() << "\n"; cout << sq.get_item_at(2)->get_schedulable()->get_name() << "\n"; sq.insert_at(2,0); cout << sq.get_item_at(0)->get_schedulable()->get_name() << "\n"; cout << sq.get_item_at(1)->get_schedulable()->get_name() << "\n"; cout << sq.get_item_at(2)->get_schedulable()->get_name() << "\n"; cout << "\n\nTEST POLICYPARAMETERS\n"; PolicyParameters pp; pp.register_int("ciao", 0, 100, true, 50); pp.set_int("ciao",1); cout << pp.get_int("ciao"); cout << "\n\n"; */ return 0; }