diff --git a/Makefile.am b/Makefile.am index d5d46c6..035879a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -349,6 +349,7 @@ sgpemv2_SOURCES = \ src/schedulables_statistics_widget.cc \ src/schedulables_tree_widget.cc \ src/simulation_controller.cc \ + src/simulation_statistics_widget.cc \ src/simulation_widget.cc \ src/statistics_container_window.cc \ src/text_simulation.cc @@ -371,6 +372,7 @@ noinst_HEADERS += \ src/schedulables_statistics_widget.hh \ src/schedulables_tree_widget.hh \ src/simulation_controller.hh \ + src/simulation_statistics_widget.hh \ src/simulation_widget.hh \ src/schedulables_statistics_widget.hh \ src/text_simulation.hh @@ -385,7 +387,8 @@ glade_DATA = \ glade/add-thread-dialog.glade \ glade/configure-dialog.glade \ glade/jump-to-dialog.glade \ - glade/main-window.glade + glade/main-window.glade \ + glade/statistics-window.glade EXTRA_DIST += $(glade_DATA) diff --git a/src/gui_builder.cc b/src/gui_builder.cc index 6c97d8c..21e08b9 100644 --- a/src/gui_builder.cc +++ b/src/gui_builder.cc @@ -29,6 +29,7 @@ #include "holt_widget.hh" #include "ready_queue_widget.hh" #include "schedulables_tree_widget.hh" +#include "schedulables_statistics_widget.hh" #include "simulation_widget.hh" #include "resources_widget.hh" #include "jump_to_dialog.hh" @@ -64,6 +65,7 @@ #include #include #include +#include #include #include @@ -122,6 +124,20 @@ GuiBuilder::on_view_show_holt_graph_activate() } } +void +GuiBuilder::on_view_show_statistics_activate() +{ + if(_statistics_container.get_main_window()->is_visible()) + { + _statistics_container.get_main_window()->hide(); + } + else + { + _statistics_container.get_main_window()->show(); + } +} + + void GuiBuilder::on_file_new_activate() @@ -565,6 +581,10 @@ GuiBuilder::GuiBuilder(const std::string& gladefile) _refXml->get_widget("MenuItem.View.ShowHoltGraph", show_holt_graph); show_holt_graph->signal_activate().connect(sigc::mem_fun(*this, &GuiBuilder::on_view_show_holt_graph_activate)); + // show/hide statistics window + MenuItem* show_statistics_graph; + _refXml->get_widget("MenuItem.View.ShowStatistics", show_statistics_graph); + show_statistics_graph->signal_activate().connect(sigc::mem_fun(*this, &GuiBuilder::on_view_show_statistics_activate)); CheckMenuItem* continuous_mode; @@ -656,9 +676,20 @@ GuiBuilder::GuiBuilder(const std::string& gladefile) _holt_container.get_holt_widget().set_show_threads(_show_threads); _holt_container.show(); - // Statistics container window - _statistics_container.set_transient_for(main_window); - _statistics_container.show(); + _statistics_container.get_main_window()->set_transient_for(main_window); + + // Moves and resize windows + int w = gdk_screen_width(), h= gdk_screen_height();; + get_initial_window().move(0,0); + get_initial_window().resize(w,(h/3)*2 - 50); + + _holt_container.move(0, (h/3)*2); + _holt_container.resize(h/3, h/3); + + _statistics_container.get_main_window()->move(h/3 + 15,(h/3)*2); + _statistics_container.get_main_window()->resize(w - h/3 - 15, h/3); + + } diff --git a/src/gui_builder.hh b/src/gui_builder.hh index 7129cdd..639e4b6 100644 --- a/src/gui_builder.hh +++ b/src/gui_builder.hh @@ -62,6 +62,7 @@ namespace sgpem void on_view_show_threads_activate(); void on_view_show_holt_graph_activate(); + void on_view_show_statistics_activate(); void on_configure_cpu_policy(); void on_configure_resource_policy(); diff --git a/src/schedulables_statistics_widget.cc b/src/schedulables_statistics_widget.cc index a0c0145..867bca2 100644 --- a/src/schedulables_statistics_widget.cc +++ b/src/schedulables_statistics_widget.cc @@ -136,17 +136,6 @@ TabularSchedulableStatisticsWidget::update(const History& changed_history) } } expand_all(); - - const SimulationStatistics* sim = Statistics::get_instance().get_simulation_statistics(); - cout << "\n\n****** SIMULATION STATISTICS *******\n AVG_RESP= " - << sim->get_average_response_time() << " AVG_INACT= " << sim->get_average_inactivity_time() << - " AVG_EXEC= " << sim->get_average_execution_progress() << - "% AVG_EFFIC= " << sim->get_average_efficiency() << - "% AVG_TURN= " << sim->get_average_turn_around() << - " TERM_PROCS= " << sim->get_terminated_processes() << - " TERM_THRES= " << sim->get_terminated_threads() << - " THRU_PROCS= " << sim->get_average_processes_throughput() << - " THRU_THREA= " << sim->get_average_threads_throughput() << "\n\n"; } diff --git a/src/simulation_statistics_widget.cc b/src/simulation_statistics_widget.cc new file mode 100644 index 0000000..96f9a70 --- /dev/null +++ b/src/simulation_statistics_widget.cc @@ -0,0 +1,133 @@ +// src/simulation_statistics_widget.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 "gettext.h" + + +#include "simulation_statistics_widget.hh" +#include +#include +#include + +#include +#include //per sprintf + + +using namespace sgpem; +using namespace std; + +using namespace Gtk; +using namespace Glib; + + +TabularSimulationStatisticsWidget::TabularSimulationStatisticsWidget() +{ + //insert columns + _columns.add(_col_inactivity); + _columns.add(_col_progress); + _columns.add(_col_turn); + _columns.add(_col_response); + _columns.add(_col_effic); + _columns.add(_col_term_procs); + _columns.add(_col_term_threads); + _columns.add(_col_through_procs); + _columns.add(_col_through_threads); + + _model = TreeStore::create(_columns); + set_model(_model); + + append_column(_("Avg. inactivity time"), _col_inactivity); + append_column(_("Avg. execution progress"), _col_progress); + append_column(_("Avg. turn around"), _col_turn); + append_column(_("Avg. response time"), _col_response); + append_column(_("Avg. efficiency"), _col_effic); + append_column(_("# terminated processes"), _col_term_procs); + append_column(_("# terminated threads"), _col_term_threads); + append_column(_("Avg. processes throughput"), _col_through_procs); + append_column(_("Avg. threads throughput"), _col_through_threads); + + + set_headers_visible(true); + + // Register this HistoryObserver: + Simulation::get_instance().get_history().attach(*this); +} + +TabularSimulationStatisticsWidget::~TabularSimulationStatisticsWidget() +{ + Simulation::get_instance().get_history().detach(*this); +} + + +void +TabularSimulationStatisticsWidget::update(const History& changed_history) +{ + _model->clear(); + int num_procs=0, num_threads=0; + vector procs = Simulation::get_instance().get_history().get_environment_at(0).get_processes(); + num_procs = procs.size(); + for (uint i =0; i < procs.size(); i++) + num_threads += procs[i]->get_threads().size(); + + if (num_procs == 0) + return; + + Statistics::get_instance().calculateStatisticsAt(changed_history.get_front()); + const SimulationStatistics* stats = Statistics::get_instance().get_simulation_statistics(); + + TreeModel::Row riga_P = *(_model->append()); + + char buff[100]; + + sprintf(buff, "%.2f", stats->get_average_inactivity_time()); + riga_P[_col_inactivity] = Glib::ustring(buff); + sprintf(buff, "%.1f", stats->get_average_execution_progress()); + riga_P[_col_progress] = Glib::ustring(buff) + Glib::ustring("%"); + sprintf(buff, "%.2f", stats->get_average_turn_around()); + riga_P[_col_turn] = Glib::ustring(buff); + sprintf(buff, "%.2f", stats->get_average_response_time()); + riga_P[_col_response] = Glib::ustring(buff); + sprintf(buff, "%.1f", stats->get_average_efficiency()); + riga_P[_col_effic] = Glib::ustring(buff) + Glib::ustring("%"); + sprintf(buff, "%d / %d", stats->get_terminated_processes(), num_procs); + riga_P[_col_term_procs] = Glib::ustring(buff); + sprintf(buff, "%d / %d", stats->get_terminated_threads(), num_threads); + riga_P[_col_term_threads] = Glib::ustring(buff); + sprintf(buff, "%.3f", stats->get_average_processes_throughput()); + riga_P[_col_through_procs] = Glib::ustring(buff); + sprintf(buff, "%.3f", stats->get_average_threads_throughput()); + riga_P[_col_through_threads]= Glib::ustring(buff); + + expand_all(); + /* + const SimulationStatistics* sim = Statistics::get_instance().get_simulation_statistics(); + cout << "\n\n****** SIMULATION STATISTICS *******\n AVG_RESP= " + << sim->get_average_response_time() << " AVG_INACT= " << sim->get_average_inactivity_time() << + " AVG_EXEC= " << sim->get_average_execution_progress() << + "% AVG_EFFIC= " << sim->get_average_efficiency() << + "% AVG_TURN= " << sim->get_average_turn_around() << + " TERM_PROCS= " << sim->get_terminated_processes() << + " TERM_THRES= " << sim->get_terminated_threads() << + " THRU_PROCS= " << sim->get_average_processes_throughput() << + " THRU_THREA= " << sim->get_average_threads_throughput() << "\n\n"; + */ +} + diff --git a/src/simulation_statistics_widget.hh b/src/simulation_statistics_widget.hh new file mode 100644 index 0000000..de36245 --- /dev/null +++ b/src/simulation_statistics_widget.hh @@ -0,0 +1,65 @@ +// src/simulation_statistics_widget.hh - 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 + +#ifndef SIMULATION_STATISTICS_WIDGET_HH +#define SIMULATION_STATISTICS_WIDGET_HH 1 + +#include "config.h" + +#include + +#include +#include + +namespace sgpem +{ + + + class TabularSimulationStatisticsWidget : public HistoryObserver, public Gtk::TreeView + { + public: + TabularSimulationStatisticsWidget(); + virtual ~TabularSimulationStatisticsWidget(); + + void update(const History& changed_history); + + + protected: + + + Glib::RefPtr _model; //treeview stuffs + Gtk::TreeModelColumnRecord _columns; + + Gtk::TreeModelColumn _col_inactivity; //all columns + Gtk::TreeModelColumn _col_progress; + Gtk::TreeModelColumn _col_turn; + Gtk::TreeModelColumn _col_response; + Gtk::TreeModelColumn _col_effic; + Gtk::TreeModelColumn _col_term_procs; + Gtk::TreeModelColumn _col_term_threads; + Gtk::TreeModelColumn _col_through_procs; + Gtk::TreeModelColumn _col_through_threads; + + }; + +} //~ namespace sgpem + + +#endif diff --git a/src/statistics_container_window.cc b/src/statistics_container_window.cc index b68ca39..0bd3ace 100644 --- a/src/statistics_container_window.cc +++ b/src/statistics_container_window.cc @@ -19,17 +19,44 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "statistics_container_window.hh" +#include + #include + +using namespace Gtk; +using Gnome::Glade::Xml; using namespace sgpem; using namespace std; -StatisticsContainerWindow::StatisticsContainerWindow() +StatisticsContainerWindow::StatisticsContainerWindow(const std::string& gladefile) + : _refXml(Xml::create(gladefile)) { + _refXml->get_widget("StatisticsWindow", _main_win); // This just sets the title of our new window. - set_title(_("Simulation Statistics")); - set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY); + _main_win->set_title(_("Simulation Statistics")); + + + + ScrolledWindow *scroll1, *scroll2; + _refXml->get_widget("SchedulableStatisticsScroll", scroll1); + _tab_sched = manage(new TabularSchedulableStatisticsWidget()); + scroll1->add(*_tab_sched); + + _refXml->get_widget("SimulationStatisticsScroll", scroll2); + _tab_sim = manage(new TabularSimulationStatisticsWidget()); + scroll2->add(*_tab_sim); + + + _main_win->show(); + scroll1->show(); + scroll2->show(); + _tab_sched->show(); + _tab_sim->show(); + + _main_win->set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY); + /* _scrolled_tabular.add(_tabular_schedulables_statistics_widget); add(_scrolled_tabular); _scrolled_tabular.show(); @@ -37,7 +64,7 @@ StatisticsContainerWindow::StatisticsContainerWindow() _scrolled_tabular.get_hscrollbar()->property_visible() = true; _scrolled_tabular.get_vscrollbar()->property_visible() = true; - + */ //_scrolled_tabular.get_vscrollbar()->set_visible(true); /*cout << "\n\nSIIIIIIIIIIIIIIIIIIIII\n\n"; @@ -51,16 +78,28 @@ StatisticsContainerWindow::StatisticsContainerWindow() StatisticsContainerWindow::~StatisticsContainerWindow() { } - -void -StatisticsContainerWindow::on_size_request(Gtk::Requisition* /* requisition */ ) -{ +void +StatisticsContainerWindow::make_child(Window& w) +{ + _main_win->set_transient_for(w); } -TabularSchedulableStatisticsWidget& +TabularSimulationStatisticsWidget* +StatisticsContainerWindow::get_tabular_simulation_statistics_widget() +{ + return _tab_sim; +} + +TabularSchedulableStatisticsWidget* StatisticsContainerWindow::get_tabular_schedulables_statistics_widget() { - return _tabular_schedulables_statistics_widget; + return _tab_sched; +} + +Window* +StatisticsContainerWindow::get_main_window() +{ + return _main_win; } diff --git a/src/statistics_container_window.hh b/src/statistics_container_window.hh index dadf807..8ad0d51 100644 --- a/src/statistics_container_window.hh +++ b/src/statistics_container_window.hh @@ -27,28 +27,35 @@ #include #include #include +#include #include #include #include #include "schedulables_statistics_widget.hh" +#include "simulation_statistics_widget.hh" namespace sgpem { - class StatisticsContainerWindow : public Gtk::Window + class StatisticsContainerWindow { public: - StatisticsContainerWindow(); + StatisticsContainerWindow(const std::string& gladefile = GLADEDIR "/statistics-window.glade"); virtual ~StatisticsContainerWindow(); - TabularSchedulableStatisticsWidget& get_tabular_schedulables_statistics_widget(); + void make_child(Gtk::Window&); + TabularSchedulableStatisticsWidget* get_tabular_schedulables_statistics_widget(); + TabularSimulationStatisticsWidget* get_tabular_simulation_statistics_widget(); + Gtk::Window* get_main_window(); protected: - virtual void on_size_request (Gtk::Requisition* requisition); - TabularSchedulableStatisticsWidget _tabular_schedulables_statistics_widget; - Gtk::ScrolledWindow _scrolled_tabular; + Glib::RefPtr _refXml; + Gtk::Window* _main_win; + TabularSchedulableStatisticsWidget* _tab_sched; + TabularSimulationStatisticsWidget* _tab_sim; + }; } // ~ namespace sgpem