diff --git a/src/holt_widget.cc b/src/holt_widget.cc index ef49944..6e470bc 100644 --- a/src/holt_widget.cc +++ b/src/holt_widget.cc @@ -21,7 +21,7 @@ #include "cairo_elements.hh" #include "backend/history.hh" -#include "backend/process.hh" +#include "backend/schedulable.hh" #include "backend/resource.hh" #include "backend/simulation.hh" #include "backend/string_utils.hh" @@ -151,35 +151,39 @@ Vec2 HoltResource::get_intersection_to(Vec2 pt) -HoltProcess::HoltProcess(const Process& process, Vec2 pt) +HoltSchedulable::HoltSchedulable(const Schedulable& schedulable, Vec2 pt) : HoltNode(pt) { - _process = &process; + _schedulable = &schedulable; } -HoltProcess::~HoltProcess() +HoltSchedulable::~HoltSchedulable() { } -void HoltProcess::draw(cairo_t *cr) +void HoltSchedulable::draw(cairo_t *cr) { cairo_save(cr); // save context state // draw circle cairo_arc (cr, _pos.real(), _pos.imag(), _radius, 0, 2 * M_PI); // filling - switch(_process->get_state()) + switch(_schedulable->get_state()) { case Schedulable::state_running: - cairo_set_source_rgb (cr, 0.5, 1, 0.5); + //cairo_set_source_rgb (cr, 0.5, 1, 0.5); + cairo_set_source_rgb (cr, 0, 1, 0); break; case Schedulable::state_ready: - cairo_set_source_rgb (cr, 1, 1, 0.5); + // cairo_set_source_rgb (cr, 1, 1, 0.5); + cairo_set_source_rgb (cr, 1, 1, 0); break; case Schedulable::state_blocked: - cairo_set_source_rgb (cr, 1, 0.5, 0.5); + // cairo_set_source_rgb (cr, 1, 0.5, 0.5); + cairo_set_source_rgb (cr, 1, 0, 0); break; case Schedulable::state_future: + // cairo_set_source_rgb (cr, 0.5, 0.5, 1); cairo_set_source_rgb (cr, 0.5, 0.5, 1); break; case Schedulable::state_terminated: @@ -195,10 +199,10 @@ void HoltProcess::draw(cairo_t *cr) cairo_clip_preserve (cr); // draw text cairo_text_extents_t extents; - cairo_text_extents(cr, _process->get_name().c_str(), &extents); + cairo_text_extents(cr, _schedulable->get_name().c_str(), &extents); // cairo_move_to(cr, xpos - _radius, ypos - _radius + extents.height); cairo_move_to(cr, _pos.real() - extents.width/2, _pos.imag() + extents.height/2); - cairo_show_text(cr, _process->get_name().c_str()); + cairo_show_text(cr, _schedulable->get_name().c_str()); cairo_reset_clip (cr); // reset clip region // stroke all @@ -206,7 +210,7 @@ void HoltProcess::draw(cairo_t *cr) cairo_restore(cr); // restore context state } -Vec2 HoltProcess::get_intersection_to(Vec2 pt) +Vec2 HoltSchedulable::get_intersection_to(Vec2 pt) { Vec2 final = _pos; Vec2 segment = pt - _pos; @@ -221,7 +225,7 @@ Vec2 HoltProcess::get_intersection_to(Vec2 pt) -HoltRequest::HoltRequest(HoltProcess& hp, HoltResource& hr, Request::state state) +HoltRequest::HoltRequest(HoltSchedulable& hp, HoltResource& hr, Request::state state) : _hp(&hp), _hr(&hr), _state(state) @@ -295,6 +299,7 @@ HoltWidget::HoltWidget(Simulation& simulation) _n_proc(0), _n_res(0), _radius(20), + _show_threads(false), _arrange_mode(arrange_horizontal) { @@ -329,7 +334,7 @@ HoltWidget::set_radius(double radius) double old_radius = _radius; if(radius>0) _radius = radius; - resize_redraw(); + // resize_redraw(); return old_radius; } @@ -345,13 +350,14 @@ HoltWidget::set_arrange_mode(arrange_mode mode) arrange_mode old_mode = _arrange_mode; _arrange_mode = mode; arrange(); - resize_redraw(); + // resize_redraw(); return old_mode; } void HoltWidget::arrange() { + std::cout << "HoltWidget::arrange" << endl; // cout << "START:" << endl; // _x_req = 0; // _y_req = 0; @@ -371,7 +377,7 @@ HoltWidget::arrange() { int sx = _draw_w; // get_width(); int sy = _draw_h; // get_height(); - int nelem = _holt_resources.size()+_holt_processes.size(); + int nelem = _holt_resources.size()+_holt_schedulables.size(); if(sx<=sy) inc = Vec2(sx/2-2*_radius, 0); else @@ -423,10 +429,10 @@ HoltWidget::arrange() inc = Vec2(0, 3*_radius); } typedef HoltProcesses::const_iterator holt_proc_iterator; - holt_proc_iterator piter = _holt_processes.begin(); - while(piter!=_holt_processes.end()) + holt_proc_iterator piter = _holt_schedulables.begin(); + while(piter!=_holt_schedulables.end()) { - HoltProcess* hp = (*piter); + HoltSchedulable* hp = (*piter); // cout << "p-A) pos=" << pos << " cen=" << cen << " inc=" << inc << " mul=" << mul << endl; hp->set_position(pos); hp->set_radius(_radius); @@ -452,9 +458,29 @@ HoltWidget::arrange() } +bool +HoltWidget::get_show_threads() +{ + return _show_threads; +} + +bool +HoltWidget::set_show_threads(bool show) +{ + bool old_show = _show_threads; + _show_threads = show; + // resize_redraw(); + return old_show; +} + + + + + void HoltWidget::update(const Simulation& changed_simulation) { + std::cout << "HoltWidget::update - Simulation" << endl; // Force redraw //redraw(); acquire(); @@ -465,6 +491,7 @@ HoltWidget::update(const Simulation& changed_simulation) void HoltWidget::update(const History& changed_history) { + std::cout << "HoltWidget::update - History" << endl; // Force redraw //redraw(); //acquire(); @@ -477,8 +504,9 @@ HoltWidget::update(const History& changed_history) void HoltWidget::acquire() { + std::cout << "HoltWidget::acquire" << endl; _holt_resources.clear(); - _holt_processes.clear(); + _holt_schedulables.clear(); _holt_requests.clear(); _n_res = _n_proc = 0; @@ -517,9 +545,13 @@ HoltWidget::acquire() || proc_state==Schedulable::state_blocked ) { _n_proc++; - HoltProcess *hp = new HoltProcess(*p, pos); - _holt_processes.push_back(hp); - pos += Vec2(4*_radius, 0); + HoltSchedulable *hp; + if(!_show_threads) + { + hp = new HoltSchedulable(*p, pos); + _holt_schedulables.push_back(hp); + pos += Vec2(4*_radius, 0); + } // iter trough threads, requests, subrequests // FIXME @@ -543,6 +575,12 @@ HoltWidget::acquire() || thr_state==Schedulable::state_blocked ) { + if(_show_threads) + { + hp = new HoltSchedulable(*t, pos); + _holt_schedulables.push_back(hp); + pos += Vec2(4*_radius, 0); + } // iter trough requests const std::vector& rvect = t->get_requests(); std::vector::const_iterator req_iter = rvect.begin(); @@ -570,6 +608,7 @@ HoltWidget::acquire() HoltResources::const_iterator hpos = _holt_resources.find(sr->get_resource_key()); if (pos != env.get_resources().end() && hpos!=_holt_resources.end()) { + // associates process (or thread) with resource) HoltRequest *hreq = new HoltRequest(*hp, *(hpos->second), sr->get_state()); _holt_requests.push_back(hreq); // cout << "added HoltRequest\n" @@ -597,6 +636,7 @@ HoltWidget::acquire() void HoltWidget::draw_widget(cairo_t* ctx) { + std::cout << "HoltWidget::draw_widget" << endl; arrange(); typedef HoltResources::const_iterator holt_res_iterator; holt_res_iterator riter = _holt_resources.begin(); @@ -608,10 +648,10 @@ HoltWidget::draw_widget(cairo_t* ctx) } typedef HoltProcesses::const_iterator holt_proc_iterator; - holt_proc_iterator piter = _holt_processes.begin(); - while(piter!=_holt_processes.end()) + holt_proc_iterator piter = _holt_schedulables.begin(); + while(piter!=_holt_schedulables.end()) { - HoltProcess* hp = (*piter); + HoltSchedulable* hp = (*piter); hp->draw(ctx); piter++; } @@ -633,6 +673,7 @@ HoltWidget::draw_widget(cairo_t* ctx) void HoltWidget::calc_drawing_size(cairo_t* ctx, size_t& width, size_t& height) { + cout << "Holt widget BEFORE calc_drawing_size width=" << width << " height=" << height << endl; // int pos = _simulation->get_front(); // const History& hist = _simulation->get_history(); int max = _n_proc; @@ -641,7 +682,7 @@ HoltWidget::calc_drawing_size(cairo_t* ctx, size_t& width, size_t& height) cairo_text_extents_t extents; // std::cout << " x_unit: " << std::endl; - Glib::ustring val("Process 999 Resource 999"); + Glib::ustring val("Process 999 Resource 999"); cairo_text_extents(ctx, val.c_str(), &extents); _radius = extents.width/4.0; @@ -673,11 +714,12 @@ HoltWidget::calc_drawing_size(cairo_t* ctx, size_t& width, size_t& height) width = height = diam + 4 * _radius; break; } - // cout << "Holt widget width=" << width << " height=" << height << endl; + cout << "Holt widget AFTER calc_drawing_size width=" << width << " height=" << height << endl; } void HoltWidget::calc_widget_size(size_t& width, size_t& height) { + cout << "Holt widget BEFORE calc_widget_size width=" << width << " height=" << height << endl; width = height = 20; // default minimum size } diff --git a/src/holt_widget.hh b/src/holt_widget.hh index 3d21bf7..b6ed5ff 100644 --- a/src/holt_widget.hh +++ b/src/holt_widget.hh @@ -31,15 +31,10 @@ #include -// ********************************************************************************* -// --------------------------------------------------------------------------------- -// -// BEGIN - inserted from old version -// namespace sgpem { class History; - class Process; + class Schedulable; class Resource; } @@ -93,110 +88,38 @@ namespace sgpem }; - class HoltProcess : public HoltNode + class HoltSchedulable : public HoltNode { public: - //HoltProcess(const Process& process, double x=0.0, double y=0.0); - HoltProcess(const Process& process, Vec2 pt = Vec2(0.0, 0.0)); - virtual ~HoltProcess(); + //HoltSchedulable(const Schedulable& schedulable, double x=0.0, double y=0.0); + HoltSchedulable(const Schedulable& schedulable, Vec2 pt = Vec2(0.0, 0.0)); + virtual ~HoltSchedulable(); virtual void draw(cairo_t *cr); virtual Vec2 get_intersection_to(Vec2 pt); protected: private: - const Process* _process; + const Schedulable* _schedulable; }; class HoltRequest { public: - HoltRequest(HoltProcess& hp, HoltResource& hr, Request::state state); + HoltRequest(HoltSchedulable& hp, HoltResource& hr, Request::state state); virtual ~HoltRequest(); virtual void draw(cairo_t *cr); virtual void arrow(cairo_t *cr, Vec2 first, Vec2 second); protected: private: - HoltProcess* _hp; + HoltSchedulable* _hp; HoltResource* _hr; Request::state _state; }; - /* - class HoltGraph : public Gtk::DrawingArea - { - public: - enum arrange_mode - { - arrange_horizontal = 1 << 0, - arrange_vertical = 1 << 1, - arrange_circular = 1 << 2 - }; - enum resize_mode - { - resize_none = 0, - resize_radius = 1 << 0, - resize_distance = 1 << 1, - resize_both = resize_radius | resize_distance, - resize_asymetrical = 0, - resize_symetrical = 1 << 2 - }; - typedef std::map HoltResources; - typedef std::vector HoltProcesses; - typedef std::vector HoltRequests; - - HoltGraph(); - virtual ~HoltGraph(); - - void set_history(const sgpem::History& hist); - arrange_mode get_arrange_mode(); - arrange_mode set_arrange_mode(arrange_mode mode); - resize_mode get_resize_mode(); - resize_mode set_resize_mode(resize_mode mode); - void arrange(); - - protected: - //Overridden default signal handlers: - virtual void on_realize(); - virtual bool on_expose_event(GdkEventExpose* e); - virtual void on_size_request(Gtk::Requisition* requisition); - virtual void on_size_allocate(Gtk::Allocation& allocation); - - Glib::RefPtr gc_; - Gdk::Color blue_, red_; - Gdk::Color filler_, back_; - - - private: - const sgpem::History* _hist; - double _radius; - double _eff_radius; - double _x_dist; - double _y_dist; - double _x_req; - double _y_req; - - HoltResources _holt_resources; - HoltProcesses _holt_processes; - HoltRequests _holt_requests; - - arrange_mode _arrange_mode; - resize_mode _resize_mode; - }; - */ - -} // end namespace sgpem - -// -// END - inserted from old version -// -// --------------------------------------------------------------------------------- -// ********************************************************************************* -namespace sgpem -{ class HoltWidget : public SimulationObserver, public HistoryObserver, @@ -211,7 +134,7 @@ namespace sgpem }; typedef std::map HoltResources; - typedef std::vector HoltProcesses; + typedef std::vector HoltProcesses; typedef std::vector HoltRequests; HoltWidget(Simulation& simulation); @@ -226,6 +149,8 @@ namespace sgpem arrange_mode get_arrange_mode(); arrange_mode set_arrange_mode(arrange_mode mode); void arrange(); + bool get_show_threads(); + bool set_show_threads(bool show); protected: @@ -242,12 +167,13 @@ namespace sgpem double _radius; HoltResources _holt_resources; - HoltProcesses _holt_processes; + HoltProcesses _holt_schedulables; HoltRequests _holt_requests; int _n_proc; int _n_res; arrange_mode _arrange_mode; + bool _show_threads; }; } //~ namespace sgpem diff --git a/src/testsuite/test-holt_widget.cc b/src/testsuite/test-holt_widget.cc index 7a47a49..eadc923 100644 --- a/src/testsuite/test-holt_widget.cc +++ b/src/testsuite/test-holt_widget.cc @@ -243,6 +243,7 @@ protected: virtual void on_button_stop_clicked(); virtual void on_button_pause_clicked(); virtual void on_button_runmode_clicked(); + virtual void on_button_showthreads_clicked(); virtual void on_buttons_radio_clicked(); virtual void on_buttons_radio_disp_clicked(); virtual bool on_timer_timeout(); @@ -254,6 +255,7 @@ protected: Gtk::Button _stop_button; Gtk::Button _pause_button; Gtk::CheckButton _runmode_button; + Gtk::CheckButton _showthreads_button; Gtk::RadioButton _noscale_radio; Gtk::RadioButton _fit_radio; Gtk::RadioButton _stretch_radio; @@ -276,6 +278,7 @@ MainWindow::MainWindow(Simulation& simulation) _stop_button("Stop"), _pause_button("Pause"), _runmode_button("Continue"), + _showthreads_button("Show threads"), _noscale_radio("no scale"), _fit_radio("scale all"), _stretch_radio("stretch"), @@ -299,6 +302,10 @@ MainWindow::MainWindow(Simulation& simulation) _runmode_button.set_active(false); _runmode_button.show(); + _buttons_box.pack_start(_showthreads_button); + _showthreads_button.set_active(false); + _showthreads_button.show(); + // scale radio buttons Gtk::RadioButton::Group group = _noscale_radio.get_group(); _fit_radio.set_group(group); @@ -348,6 +355,7 @@ MainWindow::MainWindow(Simulation& simulation) _stop_button.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_button_stop_clicked), true ); _pause_button.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_button_pause_clicked), true ); _runmode_button.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_button_runmode_clicked), true ); + _showthreads_button.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_button_showthreads_clicked), true ); _noscale_radio.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_buttons_radio_clicked), true ); _fit_radio.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_buttons_radio_clicked), true ); @@ -359,6 +367,9 @@ MainWindow::MainWindow(Simulation& simulation) Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::on_timer_timeout), 1000); + on_button_runmode_clicked(); + on_button_showthreads_clicked(); + //is equivalent to: /* const Glib::RefPtr timeout_source = Glib::TimeoutSource::create(1000); @@ -373,6 +384,7 @@ MainWindow::~MainWindow() void MainWindow::on_button_start_clicked() { + std::cout << "on_button_start_clicked" << endl; if(_sim_state == Simulation::state_stopped || _sim_state == Simulation::state_paused) { @@ -392,6 +404,7 @@ void MainWindow::on_button_start_clicked() } void MainWindow::on_button_stop_clicked() { + std::cout << "on_button_stop_clicked" << endl; if(_sim_state == Simulation::state_running || _sim_state == Simulation::state_paused) { @@ -402,6 +415,7 @@ void MainWindow::on_button_stop_clicked() } void MainWindow::on_button_pause_clicked() { + std::cout << "on_button_pause_clicked" << endl; if(_sim_state == Simulation::state_running) { _sim_state = Simulation::state_paused; @@ -411,12 +425,23 @@ void MainWindow::on_button_pause_clicked() _sim_state = Simulation::state_running; } } + void MainWindow::on_button_runmode_clicked() { + std::cout << "on_button_runmode_clicked" << endl; } +void MainWindow::on_button_showthreads_clicked() +{ + std::cout << "on_button_showthreads_clicked" << endl; + _holt_widget.set_show_threads(_showthreads_button.get_active()); + _holt_widget.resize_redraw(); +} + + void MainWindow::on_buttons_radio_clicked() { + std::cout << "on_buttons_radio_clicked" << endl; if(_noscale_radio.get_active()) { // std::cout << "scaling_none" << endl; @@ -443,6 +468,7 @@ void MainWindow::on_buttons_radio_clicked() void MainWindow::on_buttons_radio_disp_clicked() { + std::cout << "on_buttons_radio_disp_clicked" << endl; if(_horizontal_radio.get_active()) { // std::cout << "_horizontal_radio" << endl; @@ -570,11 +596,11 @@ void fillHistory(History &hist) History::ResourcePair respair = hist.add_resource(Glib::ustring("Resource 1"), false, 1, 2); // add a resource - name, preemptable, places, availability - History::ResourcePair respair2 = hist.add_resource(Glib::ustring("Invalid? Resource 1"), false, 1, 2); + History::ResourcePair respair2 = hist.add_resource(Glib::ustring("Very Long Named Resource 2"), false, 1, 2); // delete resources to kreate a key numbering hole - hist.remove(respair0.first); - hist.remove(respair00.first); + // hist.remove(respair0.first); + // hist.remove(respair00.first); // add a process - name, arrival time, priority Process& p1 = hist.add_process(Glib::ustring("Process 1"), 0, 2); // name, arrival time, priority @@ -586,22 +612,31 @@ void fillHistory(History &hist) Process& p3 = hist.add_process(Glib::ustring("Process 3"), 5, 5); // name, arrival time, priority // add a process - name, arrival time, priority - Process& p4 = hist.add_process(Glib::ustring("Invalid? &3 or\\4"), 9, 1); // name, arrival time, priority + Process& p4 = hist.add_process(Glib::ustring("Very Long Named Process 4"), 9, 1); // name, arrival time, priority // add a thread - name, parent, cpu time, arrival time, priority - Thread& p1_t1 = hist.add_thread(Glib::ustring("P1 - Thread 1"), p1, 14, 0, 2); + Thread& p1_t1 = hist.add_thread(Glib::ustring("P1 - Th 1"), p1, 14, 0, 2); // add a thread - name, parent, cpu time, arrival time, priority - // Thread& p1_t2 = hist.add_thread(Glib::ustring("P1 - Thread 2"), p1, 3, 0, 5); + Thread& p1_t2 = hist.add_thread(Glib::ustring("P1 - Th 2"), p1, 3, 3, 5); // add a thread - name, parent, cpu time, arrival time, priority - Thread& p2_t1 = hist.add_thread(Glib::ustring("P2 - Thread 1"), p2, 20, 0, 2); + Thread& p1_t3 = hist.add_thread(Glib::ustring("P1 - Th 3"), p1, 4, 3, 5); // add a thread - name, parent, cpu time, arrival time, priority - Thread& p3_t1 = hist.add_thread(Glib::ustring("P3 - Thread 2"), p3, 12, 0, 2); + Thread& p1_t4 = hist.add_thread(Glib::ustring("P1 - Th 4"), p1, 5, 3, 4); // add a thread - name, parent, cpu time, arrival time, priority - Thread& p4_t1 = hist.add_thread(Glib::ustring("P4 - Thread 1"), p4, 3, 0, 2); + Thread& p2_t1 = hist.add_thread(Glib::ustring("P2 - Th 1"), p2, 20, 0, 2); + + // add a thread - name, parent, cpu time, arrival time, priority + Thread& p3_t1 = hist.add_thread(Glib::ustring("P3 - Th 2"), p3, 12, 0, 2); + + // add a thread - name, parent, cpu time, arrival time, priority + Thread& p4_t1 = hist.add_thread(Glib::ustring("P4 - Th 1"), p4, 7, 0, 2); + + // add a thread - name, parent, cpu time, arrival time, priority + Thread& p4_t2 = hist.add_thread(Glib::ustring("P4 - Th 2"), p4, 3, 6, 2); // add a request - Thread, time Request& req1 = hist.add_request(p1_t1, 3);