- Added the Schedulable interface
- Renamed SchedulableStatus to DynamicSchedulable - Implemented almost all methods of DynamicSchedulable git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@630 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
parent
94c0b563c7
commit
a1662de194
14
Makefile.am
14
Makefile.am
|
@ -142,6 +142,7 @@ src_backend_libbackend_la_LDFLAGS = \
|
||||||
|
|
||||||
# Please keep this in sorted order:
|
# Please keep this in sorted order:
|
||||||
src_backend_libbackend_la_SOURCES = \
|
src_backend_libbackend_la_SOURCES = \
|
||||||
|
src/backend/dynamic_schedulable.cc \
|
||||||
src/backend/global_preferences.cc \
|
src/backend/global_preferences.cc \
|
||||||
src/backend/history.cc \
|
src/backend/history.cc \
|
||||||
src/backend/observed_subject.cc \
|
src/backend/observed_subject.cc \
|
||||||
|
@ -149,17 +150,18 @@ src_backend_libbackend_la_SOURCES = \
|
||||||
src/backend/policy.cc \
|
src/backend/policy.cc \
|
||||||
src/backend/policy_manager.cc \
|
src/backend/policy_manager.cc \
|
||||||
src/backend/policy_parameters.cc \
|
src/backend/policy_parameters.cc \
|
||||||
src/backend/static_process.cc \
|
src/backend/schedulable.cc \
|
||||||
src/backend/static_schedulable.cc \
|
|
||||||
src/backend/schedulable_queue.cc \
|
src/backend/schedulable_queue.cc \
|
||||||
src/backend/schedulable_status.cc \
|
|
||||||
src/backend/scheduler.cc \
|
src/backend/scheduler.cc \
|
||||||
src/backend/slice.cc \
|
src/backend/slice.cc \
|
||||||
|
src/backend/static_process.cc \
|
||||||
|
src/backend/static_schedulable.cc \
|
||||||
src/backend/string_utils.cc \
|
src/backend/string_utils.cc \
|
||||||
src/backend/user_interrupt_exception.cc
|
src/backend/user_interrupt_exception.cc
|
||||||
|
|
||||||
pkginclude_HEADERS = \
|
pkginclude_HEADERS = \
|
||||||
config.h \
|
config.h \
|
||||||
|
src/backend/dynamic_schedulable.hh \
|
||||||
src/backend/global_preferences.hh \
|
src/backend/global_preferences.hh \
|
||||||
src/backend/history.hh \
|
src/backend/history.hh \
|
||||||
src/backend/observed_subject.hh \
|
src/backend/observed_subject.hh \
|
||||||
|
@ -168,12 +170,12 @@ pkginclude_HEADERS = \
|
||||||
src/backend/policy.hh \
|
src/backend/policy.hh \
|
||||||
src/backend/policy_manager.hh \
|
src/backend/policy_manager.hh \
|
||||||
src/backend/policy_parameters.hh \
|
src/backend/policy_parameters.hh \
|
||||||
src/backend/static_process.hh \
|
src/backend/schedulable.hh \
|
||||||
src/backend/static_schedulable.hh \
|
|
||||||
src/backend/schedulable_queue.hh \
|
src/backend/schedulable_queue.hh \
|
||||||
src/backend/schedulable_status.hh \
|
|
||||||
src/backend/scheduler.hh \
|
src/backend/scheduler.hh \
|
||||||
src/backend/slice.hh \
|
src/backend/slice.hh \
|
||||||
|
src/backend/static_process.hh \
|
||||||
|
src/backend/static_schedulable.hh \
|
||||||
src/backend/string_utils.hh \
|
src/backend/string_utils.hh \
|
||||||
src/backend/user_interrupt_exception.hh
|
src/backend/user_interrupt_exception.hh
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ class Policy:
|
||||||
# of the following ways:
|
# of the following ways:
|
||||||
# @code
|
# @code
|
||||||
# # As a lambda anonymous function (preferred)
|
# # As a lambda anonymous function (preferred)
|
||||||
# # (x and y are two SchedulableStatus objects)
|
# # (x and y are two DynamicSchedulable objects)
|
||||||
# cmpf = lambda x,y: x.someProperty() < y.someProperty()
|
# cmpf = lambda x,y: x.someProperty() < y.someProperty()
|
||||||
#
|
#
|
||||||
# # As a normal *global* function
|
# # As a normal *global* function
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "policy_parameters.hh"
|
#include "policy_parameters.hh"
|
||||||
#include "static_schedulable.hh"
|
#include "static_schedulable.hh"
|
||||||
#include "schedulable_queue.hh"
|
#include "schedulable_queue.hh"
|
||||||
#include "schedulable_status.hh"
|
#include "dynamic_schedulable.hh"
|
||||||
#include "scheduler.hh"
|
#include "scheduler.hh"
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ namespace sgpem {
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
unsigned int size() const;
|
unsigned int size() const;
|
||||||
const sgpem::SchedulableStatus* get_item_at(const unsigned int&) const;
|
const sgpem::DynamicSchedulable* get_item_at(const unsigned int&) const;
|
||||||
void swap(unsigned int positionA, unsigned int positionB) throw();
|
void swap(unsigned int positionA, unsigned int positionB) throw();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -164,7 +164,7 @@ namespace sgpem {
|
||||||
}; //~ class Schedulable
|
}; //~ class Schedulable
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
class SchedulableStatus
|
class DynamicSchedulable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum state
|
enum state
|
||||||
|
@ -176,7 +176,7 @@ namespace sgpem {
|
||||||
state_terminated = 1<<4
|
state_terminated = 1<<4
|
||||||
};
|
};
|
||||||
|
|
||||||
SchedulableStatus(const SchedulableStatus& obj);
|
DynamicSchedulable(const DynamicSchedulable& obj);
|
||||||
|
|
||||||
int get_cpu_time_left() const;
|
int get_cpu_time_left() const;
|
||||||
int get_last_scheduled() const;
|
int get_last_scheduled() const;
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
// src/backend/dynamic_schedulable.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 "dynamic_schedulable.hh"
|
||||||
|
|
||||||
|
using namespace sgpem;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
DynamicSchedulable::DynamicSchedulable(StaticSchedulable& obj) :
|
||||||
|
_time_left(obj.get_total_cpu_time()), _ref(&obj), _last_acquisition(-1),
|
||||||
|
_last_release(-1), _current_priority(obj.get_priority()), _last(-1),
|
||||||
|
_my_state(state_future)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
DynamicSchedulable::operator==(const DynamicSchedulable& dx) const
|
||||||
|
{
|
||||||
|
return (_ref==dx._ref)&&(_last==dx._last)&&(_time_left==dx._time_left)&&(_my_state==dx._my_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
Glib::ustring
|
||||||
|
DynamicSchedulable::get_name() const
|
||||||
|
{
|
||||||
|
return _ref->get_name();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_name(const Glib::ustring& new_name)
|
||||||
|
{
|
||||||
|
_ref->set_name(new_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
DynamicSchedulable::get_arrival_time() const
|
||||||
|
{
|
||||||
|
return _ref->get_arrival_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_arrival_time(unsigned int new_time)
|
||||||
|
{
|
||||||
|
_ref->set_arrival_time(new_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DynamicSchedulable::get_base_priority() const
|
||||||
|
{
|
||||||
|
return _ref->get_priority();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_base_priority(int new_priority)
|
||||||
|
{
|
||||||
|
_ref->set_priority(new_priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
DynamicSchedulable::get_total_cpu_time() const
|
||||||
|
{
|
||||||
|
return _ref->get_total_cpu_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DynamicSchedulable::get_current_priority() const
|
||||||
|
{
|
||||||
|
return _current_priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_current_priority(int new_priority)
|
||||||
|
{
|
||||||
|
_current_priority = new_priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
DynamicSchedulable::get_remaining_time() const
|
||||||
|
{
|
||||||
|
return _time_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::decrease_remaining_time()
|
||||||
|
{
|
||||||
|
--_time_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DynamicSchedulable::get_last_acquisition() const
|
||||||
|
{
|
||||||
|
return _last_acquisition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_last_acquisition(int instant)
|
||||||
|
{
|
||||||
|
_last_acquisition = instant;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DynamicSchedulable::get_last_release() const
|
||||||
|
{
|
||||||
|
return _last_release;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_last_release(int instant)
|
||||||
|
{
|
||||||
|
_last_release = instant;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::serialize(SerializeVisitor& translator) const
|
||||||
|
{
|
||||||
|
//TODO write me as part of the serialization infrastructure
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DynamicSchedulable::get_cpu_time_left() const
|
||||||
|
{
|
||||||
|
return _time_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::give_cpu_time(const int& time)
|
||||||
|
{
|
||||||
|
_time_left -= time;
|
||||||
|
if (_time_left < 0)
|
||||||
|
_time_left = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_last_scheduled(const int& time)
|
||||||
|
{
|
||||||
|
_last = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DynamicSchedulable::get_last_scheduled() const
|
||||||
|
{
|
||||||
|
return _last;
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicSchedulable::state
|
||||||
|
DynamicSchedulable::get_state() const
|
||||||
|
{
|
||||||
|
return _my_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DynamicSchedulable::set_state(state s)
|
||||||
|
{
|
||||||
|
_my_state = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
StaticSchedulable*
|
||||||
|
DynamicSchedulable::get_schedulable() const
|
||||||
|
{
|
||||||
|
return _ref;
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
// src/backend/schedulable_status.hh - Copyright 2005, 2006, University
|
// src/backend/dynamic_schedulable.hh - Copyright 2005, 2006, University
|
||||||
// of Padova, dept. of Pure and Applied
|
// of Padova, dept. of Pure and Applied
|
||||||
// Mathematics
|
// Mathematics
|
||||||
//
|
//
|
||||||
|
@ -18,15 +18,16 @@
|
||||||
// along with SGPEMv2; if not, write to the Free Software
|
// along with SGPEMv2; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
#ifndef SCHEDULABLESTATUS_HH
|
#ifndef DYNAMIC_SCHEDULABLE_HH
|
||||||
#define SCHEDULABLESTATUS_HH 1
|
#define DYNAMIC_SCHEDULABLE_HH 1
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "schedulable.hh"
|
||||||
#include "static_schedulable.hh"
|
#include "static_schedulable.hh"
|
||||||
|
|
||||||
namespace sgpem
|
namespace sgpem
|
||||||
{
|
{
|
||||||
class SchedulableStatus;
|
class DynamicSchedulable;
|
||||||
|
|
||||||
/** \brief Desribes the state of a schedulable entity in a particular moment
|
/** \brief Desribes the state of a schedulable entity in a particular moment
|
||||||
* of the simulation
|
* of the simulation
|
||||||
|
@ -34,32 +35,16 @@ namespace sgpem
|
||||||
* This class stores part of the information deeded by the Scheduler to
|
* This class stores part of the information deeded by the Scheduler to
|
||||||
* manage processes and other ones.
|
* manage processes and other ones.
|
||||||
*
|
*
|
||||||
* Objects of type SchedulableStatus are created by the Scheduler and are
|
* Objects of type DynamicSchedulable are created by the Scheduler and are
|
||||||
* destroyed by SimulationStatus if they are linked to it or by the Scheduler.
|
* destroyed by SimulationStatus if they are linked to it or by the Scheduler.
|
||||||
*/
|
*/
|
||||||
class SG_DLLEXPORT SchedulableStatus
|
class SG_DLLEXPORT DynamicSchedulable : public Schedulable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** \brief This flag describes the actual state of the schedulable
|
|
||||||
*
|
|
||||||
* You can think of this flag as the particular stack in the OS where the
|
|
||||||
* process are placed during their lifetime. In the OS there are three
|
|
||||||
* main stacks that are Running processes, Read processes, and Blocked
|
|
||||||
* processes. These are emulated in a single list by this flag.
|
|
||||||
*/
|
|
||||||
enum state
|
|
||||||
{
|
|
||||||
state_running = 1<<0,
|
|
||||||
state_ready = 1<<1,
|
|
||||||
state_blocked = 1<<2,
|
|
||||||
state_future = 1<<3,
|
|
||||||
state_terminated = 1<<4
|
|
||||||
};
|
|
||||||
|
|
||||||
/** \brief Object constructor */
|
/** \brief Object constructor */
|
||||||
SchedulableStatus(const StaticSchedulable& obj);
|
DynamicSchedulable(StaticSchedulable& obj);
|
||||||
|
|
||||||
//SchedulableStatus(const SchedulableStatus& obj); //copy constructor
|
//DynamicSchedulable(const DynamicSchedulable& obj); //copy constructor
|
||||||
|
|
||||||
/** \brief Verify if two instances represents the same situation
|
/** \brief Verify if two instances represents the same situation
|
||||||
*
|
*
|
||||||
|
@ -67,8 +52,45 @@ namespace sgpem
|
||||||
* actual represented process is the same, and if the status is also the
|
* actual represented process is the same, and if the status is also the
|
||||||
* same.
|
* same.
|
||||||
*/
|
*/
|
||||||
bool operator==(const SchedulableStatus&) const;
|
bool operator==(const DynamicSchedulable&) const;
|
||||||
|
|
||||||
|
Glib::ustring get_name() const;
|
||||||
|
|
||||||
|
void set_name(const Glib::ustring& new_name);
|
||||||
|
|
||||||
|
unsigned int get_arrival_time() const;
|
||||||
|
|
||||||
|
void set_arrival_time(unsigned int new_time);
|
||||||
|
|
||||||
|
int get_base_priority() const;
|
||||||
|
|
||||||
|
void set_base_priority(int new_priority);
|
||||||
|
|
||||||
|
unsigned int get_total_cpu_time() const;
|
||||||
|
|
||||||
|
int get_current_priority() const;
|
||||||
|
|
||||||
|
void set_current_priority(int new_priority);
|
||||||
|
|
||||||
|
unsigned int get_remaining_time() const;
|
||||||
|
|
||||||
|
void decrease_remaining_time();
|
||||||
|
|
||||||
|
int get_last_acquisition() const;
|
||||||
|
|
||||||
|
void set_last_acquisition(int instant);
|
||||||
|
|
||||||
|
int get_last_release() const;
|
||||||
|
|
||||||
|
void set_last_release(int instant);
|
||||||
|
|
||||||
|
void serialize(SerializeVisitor& translator) const;
|
||||||
|
|
||||||
|
/*
|
||||||
|
FIXME
|
||||||
|
all following methods are deprecated, drop them
|
||||||
|
*/
|
||||||
|
|
||||||
/** \brief Returns the remaining CPU time */
|
/** \brief Returns the remaining CPU time */
|
||||||
int get_cpu_time_left() const;
|
int get_cpu_time_left() const;
|
||||||
|
|
||||||
|
@ -86,7 +108,8 @@ namespace sgpem
|
||||||
state get_state() const;
|
state get_state() const;
|
||||||
|
|
||||||
/** \brief Sets the state of this process
|
/** \brief Sets the state of this process
|
||||||
* \see state */
|
* \see state
|
||||||
|
*/
|
||||||
void set_state(state s);
|
void set_state(state s);
|
||||||
|
|
||||||
/** \brief Returns a pointer to the schedulable object
|
/** \brief Returns a pointer to the schedulable object
|
||||||
|
@ -94,12 +117,19 @@ namespace sgpem
|
||||||
* This function returns a pointer to the actual schedable object
|
* This function returns a pointer to the actual schedable object
|
||||||
* represented, along with its status, by this instance.
|
* represented, along with its status, by this instance.
|
||||||
*/
|
*/
|
||||||
const StaticSchedulable* get_schedulable() const;
|
StaticSchedulable* get_schedulable() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int _time_left;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const StaticSchedulable* _ref;
|
StaticSchedulable* _ref;
|
||||||
|
int _last_acquisition;
|
||||||
|
int _last_release;
|
||||||
|
int _current_priority;
|
||||||
|
|
||||||
|
//FIXME deprecated stuff used by deprecated methods
|
||||||
int _last;
|
int _last;
|
||||||
int _time_left;
|
|
||||||
state _my_state;
|
state _my_state;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -45,24 +45,24 @@ History::get_instance()
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns a pointer to a copy of the SchedulableStatus object relative to this instant.
|
Returns a pointer to a copy of the DynamicSchedulable object relative to this instant.
|
||||||
It can be NULL if time is out of range or if there are no running entities in the associated
|
It can be NULL if time is out of range or if there are no running entities in the associated
|
||||||
SchedulableQueue
|
SchedulableQueue
|
||||||
*/
|
*/
|
||||||
smart_ptr<SchedulableStatus>
|
smart_ptr<DynamicSchedulable>
|
||||||
History::get_scheduled_at(int time) const
|
History::get_scheduled_at(int time) const
|
||||||
{
|
{
|
||||||
if (time > _total_time_elapsed || time < 0) //out of range
|
if (time > _total_time_elapsed || time < 0) //out of range
|
||||||
return smart_ptr<SchedulableStatus>(NULL);
|
return smart_ptr<DynamicSchedulable>(NULL);
|
||||||
|
|
||||||
//look for a runing entity
|
//look for a runing entity
|
||||||
smart_ptr<SchedulableQueue> p = get_simulation_status_at(time);
|
smart_ptr<SchedulableQueue> p = get_simulation_status_at(time);
|
||||||
|
|
||||||
for (uint i = 0; i < p->size(); i++)
|
for (uint i = 0; i < p->size(); i++)
|
||||||
if (p->get_item_at(i)->get_state() == SchedulableStatus::state_running)
|
if (p->get_item_at(i)->get_state() == DynamicSchedulable::state_running)
|
||||||
return smart_ptr<SchedulableStatus>(new SchedulableStatus(*(p->get_item_at(i))));
|
return smart_ptr<DynamicSchedulable>(new DynamicSchedulable(*(p->get_item_at(i))));
|
||||||
|
|
||||||
return smart_ptr<SchedulableStatus>(NULL);
|
return smart_ptr<DynamicSchedulable>(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "slice.hh"
|
#include "slice.hh"
|
||||||
#include "observed_subject.hh"
|
#include "observed_subject.hh"
|
||||||
#include "schedulable_queue.hh"
|
#include "schedulable_queue.hh"
|
||||||
#include "schedulable_status.hh"
|
#include "dynamic_schedulable.hh"
|
||||||
#include "../templates/smartp.hh"
|
#include "../templates/smartp.hh"
|
||||||
|
|
||||||
namespace sgpem
|
namespace sgpem
|
||||||
|
@ -55,7 +55,7 @@ namespace sgpem
|
||||||
\param time The inquired time instant.
|
\param time The inquired time instant.
|
||||||
\return The Schedulable object running at the given time.
|
\return The Schedulable object running at the given time.
|
||||||
*/
|
*/
|
||||||
virtual memory::smart_ptr<sgpem::SchedulableStatus> get_scheduled_at(int time) const;
|
virtual memory::smart_ptr<sgpem::DynamicSchedulable> get_scheduled_at(int time) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Gets the status of simulation at the specified time.
|
Gets the status of simulation at the specified time.
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
// src/backend/schedulable.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 "schedulable.hh"
|
||||||
|
|
||||||
|
using namespace sgpem;
|
||||||
|
|
||||||
|
Schedulable::~Schedulable()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
// src/backend/schedulable.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 SCHEDULABLE_HH
|
||||||
|
#define SCHEDULABLE_HH 1
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "glibmm/ustring.h"
|
||||||
|
|
||||||
|
namespace sgpem
|
||||||
|
{
|
||||||
|
class Schedulable;
|
||||||
|
class SerializeVisitor;
|
||||||
|
|
||||||
|
class SG_DLLEXPORT Schedulable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/** \brief This flag describes the actual state of the schedulable
|
||||||
|
*
|
||||||
|
* You can think of this flag as the particular stack in the OS where the
|
||||||
|
* process are placed during their lifetime. In the OS there are three
|
||||||
|
* main stacks that are Running processes, Read processes, and Blocked
|
||||||
|
* processes. These are emulated in a single list by this flag.
|
||||||
|
*/
|
||||||
|
enum state
|
||||||
|
{
|
||||||
|
state_running = 1<<0,
|
||||||
|
state_ready = 1<<1,
|
||||||
|
state_blocked = 1<<2,
|
||||||
|
state_future = 1<<3,
|
||||||
|
state_terminated = 1<<4
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual ~Schedulable();
|
||||||
|
|
||||||
|
virtual Glib::ustring get_name() const = 0;
|
||||||
|
|
||||||
|
virtual unsigned int get_arrival_time() const = 0;
|
||||||
|
|
||||||
|
virtual unsigned int get_remaining_time() const = 0;
|
||||||
|
|
||||||
|
virtual int get_base_priority() const = 0;
|
||||||
|
|
||||||
|
virtual unsigned int get_total_cpu_time() const = 0;
|
||||||
|
|
||||||
|
virtual int get_current_priority() const = 0;
|
||||||
|
|
||||||
|
virtual state get_state() const = 0;
|
||||||
|
|
||||||
|
virtual void serialize(SerializeVisitor& translator) const = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -28,7 +28,7 @@ SchedulableQueue::SchedulableQueue()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SchedulableStatus*
|
DynamicSchedulable*
|
||||||
SchedulableQueue::top()
|
SchedulableQueue::top()
|
||||||
{
|
{
|
||||||
if (_list.size() == 0)
|
if (_list.size() == 0)
|
||||||
|
@ -36,7 +36,7 @@ SchedulableQueue::top()
|
||||||
return &_list.front();
|
return &_list.front();
|
||||||
}
|
}
|
||||||
|
|
||||||
SchedulableStatus*
|
DynamicSchedulable*
|
||||||
SchedulableQueue::bottom()
|
SchedulableQueue::bottom()
|
||||||
{
|
{
|
||||||
if (_list.size() == 0)
|
if (_list.size() == 0)
|
||||||
|
@ -50,25 +50,25 @@ SchedulableQueue::bottom()
|
||||||
|
|
||||||
DON'T call delete on the returned pointer! Its destruction is managed by the queue.
|
DON'T call delete on the returned pointer! Its destruction is managed by the queue.
|
||||||
*/
|
*/
|
||||||
SchedulableStatus*
|
DynamicSchedulable*
|
||||||
SchedulableQueue::get_item_at(const uint& where)
|
SchedulableQueue::get_item_at(const uint& where)
|
||||||
{
|
{
|
||||||
if (_list.size() == 0 || where >= _list.size())
|
if (_list.size() == 0 || where >= _list.size())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
list<SchedulableStatus>::iterator i = _list.begin();
|
list<DynamicSchedulable>::iterator i = _list.begin();
|
||||||
for (uint f=0; f < where; f++)
|
for (uint f=0; f < where; f++)
|
||||||
i++;
|
i++;
|
||||||
return &(*i);
|
return &(*i);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SchedulableStatus*
|
const DynamicSchedulable*
|
||||||
SchedulableQueue::get_item_at(const uint& where) const
|
SchedulableQueue::get_item_at(const uint& where) const
|
||||||
{
|
{
|
||||||
if (_list.size() == 0 || where >= _list.size())
|
if (_list.size() == 0 || where >= _list.size())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
list<SchedulableStatus>::const_iterator i = _list.begin();
|
list<DynamicSchedulable>::const_iterator i = _list.begin();
|
||||||
for (uint f=0; f < where; f++)
|
for (uint f=0; f < where; f++)
|
||||||
i++;
|
i++;
|
||||||
return &(*i);
|
return &(*i);
|
||||||
|
@ -85,25 +85,25 @@ SchedulableQueue::size() const
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SchedulableQueue::add_at_top(const SchedulableStatus& ss)
|
SchedulableQueue::add_at_top(const DynamicSchedulable& ss)
|
||||||
{
|
{
|
||||||
_list.push_front(ss);
|
_list.push_front(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SchedulableQueue::add_at_bottom(const SchedulableStatus& ss)
|
SchedulableQueue::add_at_bottom(const DynamicSchedulable& ss)
|
||||||
{
|
{
|
||||||
_list.push_back(ss);
|
_list.push_back(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
smart_ptr<SchedulableStatus>
|
smart_ptr<DynamicSchedulable>
|
||||||
SchedulableQueue::remove(const uint& position)
|
SchedulableQueue::remove(const uint& position)
|
||||||
{
|
{
|
||||||
if (_list.size() == 0 || position >= _list.size())
|
if (_list.size() == 0 || position >= _list.size())
|
||||||
return smart_ptr<SchedulableStatus>(NULL);
|
return smart_ptr<DynamicSchedulable>(NULL);
|
||||||
|
|
||||||
//creates a copy of the first element
|
//creates a copy of the first element
|
||||||
smart_ptr<SchedulableStatus> sm = new SchedulableStatus(*top());
|
smart_ptr<DynamicSchedulable> sm = new DynamicSchedulable(*top());
|
||||||
//pops the first element
|
//pops the first element
|
||||||
_list.pop_front();
|
_list.pop_front();
|
||||||
//returns the copy
|
//returns the copy
|
||||||
|
@ -123,15 +123,15 @@ SchedulableQueue::insert_at(const uint& which, const uint& where)
|
||||||
if (where == which)
|
if (where == which)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
list<SchedulableStatus>::iterator i_where = _list.begin();
|
list<DynamicSchedulable>::iterator i_where = _list.begin();
|
||||||
list<SchedulableStatus>::iterator i_which = _list.begin();
|
list<DynamicSchedulable>::iterator i_which = _list.begin();
|
||||||
for (uint f=0; f < where; f++)
|
for (uint f=0; f < where; f++)
|
||||||
i_where++;
|
i_where++;
|
||||||
for (uint f=0; f < which; f++)
|
for (uint f=0; f < which; f++)
|
||||||
i_which++;
|
i_which++;
|
||||||
|
|
||||||
//save and pop WHICH
|
//save and pop WHICH
|
||||||
SchedulableStatus temp = *i_which;
|
DynamicSchedulable temp = *i_which;
|
||||||
_list.erase(i_which);
|
_list.erase(i_which);
|
||||||
|
|
||||||
//insert WHICH before WHERE
|
//insert WHICH before WHERE
|
||||||
|
@ -151,7 +151,7 @@ SchedulableQueue::clear()
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Returns TRUE if the two objects have the same SchedulableStatus objects in the same order.
|
\brief Returns TRUE if the two objects have the same DynamicSchedulable objects in the same order.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
SchedulableQueue::operator==(const SchedulableQueue& dx) const
|
SchedulableQueue::operator==(const SchedulableQueue& dx) const
|
||||||
|
@ -161,7 +161,7 @@ SchedulableQueue::operator==(const SchedulableQueue& dx) const
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Returns TRUE if the two objects have the same SchedulableStatus objects with NO ORDER IMPORTANCE.
|
\brief Returns TRUE if the two objects have the same DynamicSchedulable objects with NO ORDER IMPORTANCE.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
SchedulableQueue::has_same_objects(const SchedulableQueue& dx) const
|
SchedulableQueue::has_same_objects(const SchedulableQueue& dx) const
|
||||||
|
@ -170,7 +170,7 @@ SchedulableQueue::has_same_objects(const SchedulableQueue& dx) const
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//check if dx has ALL and ONLY the elements holded by _list with no order importance
|
//check if dx has ALL and ONLY the elements holded by _list with no order importance
|
||||||
for(list<SchedulableStatus>::const_iterator f=_list.begin(); f != _list.end(); f++)
|
for(list<DynamicSchedulable>::const_iterator f=_list.begin(); f != _list.end(); f++)
|
||||||
if (find(dx._list.begin(), dx._list.end(), *f) == dx._list.end()) //element NOT found!!
|
if (find(dx._list.begin(), dx._list.end(), *f) == dx._list.end()) //element NOT found!!
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -196,13 +196,13 @@ SchedulableQueue::swap(unsigned int positionA, unsigned int positionB) throw()
|
||||||
max = positionA;
|
max = positionA;
|
||||||
}
|
}
|
||||||
|
|
||||||
list<SchedulableStatus>::iterator i1 = _list.begin();
|
list<DynamicSchedulable>::iterator i1 = _list.begin();
|
||||||
list<SchedulableStatus>::iterator i2 = _list.begin();
|
list<DynamicSchedulable>::iterator i2 = _list.begin();
|
||||||
|
|
||||||
//reach the first element;
|
//reach the first element;
|
||||||
for (uint f=0; f < min; f++)
|
for (uint f=0; f < min; f++)
|
||||||
i1++;
|
i1++;
|
||||||
SchedulableStatus temp = *i1;
|
DynamicSchedulable temp = *i1;
|
||||||
|
|
||||||
//reach the second element;
|
//reach the second element;
|
||||||
i2 = i1;
|
i2 = i1;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
#include "schedulable_status.hh"
|
#include "dynamic_schedulable.hh"
|
||||||
#include "../templates/smartp.hh"
|
#include "../templates/smartp.hh"
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,18 +48,18 @@ namespace sgpem
|
||||||
* It is very important not to delete these pointers as their deallocation
|
* It is very important not to delete these pointers as their deallocation
|
||||||
* is managed by the queue.
|
* is managed by the queue.
|
||||||
*/
|
*/
|
||||||
SchedulableStatus* top();
|
DynamicSchedulable* top();
|
||||||
|
|
||||||
/** \brief Returns a pointer to the last element
|
/** \brief Returns a pointer to the last element
|
||||||
* \see top
|
* \see top
|
||||||
*/
|
*/
|
||||||
SchedulableStatus* bottom();
|
DynamicSchedulable* bottom();
|
||||||
|
|
||||||
/** \brief Adds an element at the top of the queue */
|
/** \brief Adds an element at the top of the queue */
|
||||||
void add_at_top(const SchedulableStatus&);
|
void add_at_top(const DynamicSchedulable&);
|
||||||
|
|
||||||
/** \brief Adds an element at the end of the queue */
|
/** \brief Adds an element at the end of the queue */
|
||||||
void add_at_bottom(const SchedulableStatus&);
|
void add_at_bottom(const DynamicSchedulable&);
|
||||||
|
|
||||||
/** \brief Removes */
|
/** \brief Removes */
|
||||||
/**
|
/**
|
||||||
|
@ -70,11 +70,11 @@ namespace sgpem
|
||||||
Ex. remove(size()-1) removes the bottom of the list
|
Ex. remove(size()-1) removes the bottom of the list
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memory::smart_ptr<sgpem::SchedulableStatus> remove(const unsigned int& position);
|
memory::smart_ptr<sgpem::DynamicSchedulable> remove(const unsigned int& position);
|
||||||
bool insert_at(const unsigned int&, const unsigned int&);
|
bool insert_at(const unsigned int&, const unsigned int&);
|
||||||
unsigned int size() const;
|
unsigned int size() const;
|
||||||
SchedulableStatus* get_item_at(const uint&);
|
DynamicSchedulable* get_item_at(const uint&);
|
||||||
const SchedulableStatus* get_item_at(const uint&) const;
|
const DynamicSchedulable* get_item_at(const uint&) const;
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
/** \brief This method swaps two elements given their list positions
|
/** \brief This method swaps two elements given their list positions
|
||||||
|
@ -94,7 +94,7 @@ namespace sgpem
|
||||||
void swap(unsigned int positionA, unsigned int positionB) throw();
|
void swap(unsigned int positionA, unsigned int positionB) throw();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::list<SchedulableStatus> _list;
|
std::list<DynamicSchedulable> _list;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
// src/backend/schedulable_status.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 "schedulable_status.hh"
|
|
||||||
|
|
||||||
using namespace sgpem;
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
SchedulableStatus::SchedulableStatus(const StaticSchedulable& obj) :
|
|
||||||
_ref(&obj), _last(-1), _time_left(obj.get_total_cpu_time()),
|
|
||||||
_my_state(state_future)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SchedulableStatus::operator==(const SchedulableStatus& dx) const
|
|
||||||
{
|
|
||||||
return (_ref==dx._ref)&&(_last==dx._last)&&(_time_left==dx._time_left)&&(_my_state==dx._my_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
SchedulableStatus::get_cpu_time_left() const
|
|
||||||
{
|
|
||||||
return _time_left;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SchedulableStatus::give_cpu_time(const int& time)
|
|
||||||
{
|
|
||||||
_time_left -= time;
|
|
||||||
if (_time_left < 0)
|
|
||||||
_time_left = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SchedulableStatus::set_last_scheduled(const int& time)
|
|
||||||
{
|
|
||||||
_last = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
SchedulableStatus::get_last_scheduled() const
|
|
||||||
{
|
|
||||||
return _last;
|
|
||||||
}
|
|
||||||
|
|
||||||
SchedulableStatus::state
|
|
||||||
SchedulableStatus::get_state() const
|
|
||||||
{
|
|
||||||
return _my_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SchedulableStatus::set_state(state s)
|
|
||||||
{
|
|
||||||
_my_state = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
const StaticSchedulable*
|
|
||||||
SchedulableStatus::get_schedulable() const
|
|
||||||
{
|
|
||||||
return _ref;
|
|
||||||
}
|
|
|
@ -101,18 +101,18 @@ Scheduler::step_forward() throw(UserInterruptException)
|
||||||
|
|
||||||
|
|
||||||
//adds running schedulable
|
//adds running schedulable
|
||||||
smart_ptr<SchedulableStatus> running_ptr = h.get_scheduled_at(h.get_current_time());
|
smart_ptr<DynamicSchedulable> running_ptr = h.get_scheduled_at(h.get_current_time());
|
||||||
if (running_ptr)
|
if (running_ptr)
|
||||||
_ready_queue.add_at_top(*running_ptr);
|
_ready_queue.add_at_top(*running_ptr);
|
||||||
|
|
||||||
//adds the READY ones
|
//adds the READY ones
|
||||||
for(uint rea=0; rea < initial->size(); rea++)
|
for(uint rea=0; rea < initial->size(); rea++)
|
||||||
if (initial->get_item_at(rea)->get_state() == SchedulableStatus::state_ready)
|
if (initial->get_item_at(rea)->get_state() == DynamicSchedulable::state_ready)
|
||||||
_ready_queue.add_at_bottom(*initial->get_item_at(rea));
|
_ready_queue.add_at_bottom(*initial->get_item_at(rea));
|
||||||
|
|
||||||
//adds each new ready schedulable and sorts the queue
|
//adds each new ready schedulable and sorts the queue
|
||||||
for(uint i=0; i < initial->size(); i++)
|
for(uint i=0; i < initial->size(); i++)
|
||||||
if (initial->get_item_at(i)->get_state() == SchedulableStatus::state_future
|
if (initial->get_item_at(i)->get_state() == DynamicSchedulable::state_future
|
||||||
&& (int)initial->get_item_at(i)->get_schedulable()->get_arrival_time() == h.get_current_time())
|
&& (int)initial->get_item_at(i)->get_schedulable()->get_arrival_time() == h.get_current_time())
|
||||||
{
|
{
|
||||||
//cout << "\nnuovo running: " << initial->get_item_at(i)->get_schedulable()->get_name();
|
//cout << "\nnuovo running: " << initial->get_item_at(i)->get_schedulable()->get_name();
|
||||||
|
@ -123,8 +123,8 @@ Scheduler::step_forward() throw(UserInterruptException)
|
||||||
|
|
||||||
//adds the NEW one
|
//adds the NEW one
|
||||||
_ready_queue.add_at_bottom(*initial->get_item_at(i));
|
_ready_queue.add_at_bottom(*initial->get_item_at(i));
|
||||||
_ready_queue.get_item_at(_ready_queue.size()-1)->set_state(SchedulableStatus::state_ready);
|
_ready_queue.get_item_at(_ready_queue.size()-1)->set_state(DynamicSchedulable::state_ready);
|
||||||
initial->get_item_at(i)->set_state(SchedulableStatus::state_ready);
|
initial->get_item_at(i)->set_state(DynamicSchedulable::state_ready);
|
||||||
|
|
||||||
// Sort the queue
|
// Sort the queue
|
||||||
policy.sort_queue();
|
policy.sort_queue();
|
||||||
|
@ -147,7 +147,7 @@ Scheduler::step_forward() throw(UserInterruptException)
|
||||||
{
|
{
|
||||||
_ready_queue.add_at_bottom(*_ready_queue.get_item_at(i));
|
_ready_queue.add_at_bottom(*_ready_queue.get_item_at(i));
|
||||||
_ready_queue.remove(i);
|
_ready_queue.remove(i);
|
||||||
_ready_queue.get_item_at(_ready_queue.size()-1)->set_state(SchedulableStatus::state_terminated);
|
_ready_queue.get_item_at(_ready_queue.size()-1)->set_state(DynamicSchedulable::state_terminated);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//cout << "\nTERMINATO!!";
|
//cout << "\nTERMINATO!!";
|
||||||
|
@ -168,24 +168,24 @@ Scheduler::step_forward() throw(UserInterruptException)
|
||||||
//******************
|
//******************
|
||||||
|
|
||||||
|
|
||||||
if (_ready_queue.size() != 0 && (_ready_queue.get_item_at(0)->get_state() == SchedulableStatus::state_ready
|
if (_ready_queue.size() != 0 && (_ready_queue.get_item_at(0)->get_state() == DynamicSchedulable::state_ready
|
||||||
|| _ready_queue.get_item_at(0)->get_state() == SchedulableStatus::state_running))
|
|| _ready_queue.get_item_at(0)->get_state() == DynamicSchedulable::state_running))
|
||||||
{
|
{
|
||||||
//the first ready element IS the running one (if != *running_ptr then there is a CONTEXT SWICH)
|
//the first ready element IS the running one (if != *running_ptr then there is a CONTEXT SWICH)
|
||||||
_ready_queue.get_item_at(0)->set_state(SchedulableStatus::state_running);
|
_ready_queue.get_item_at(0)->set_state(DynamicSchedulable::state_running);
|
||||||
_ready_queue.get_item_at(0)->give_cpu_time(1);
|
_ready_queue.get_item_at(0)->give_cpu_time(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//all the others are ready
|
//all the others are ready
|
||||||
for (uint i = 1; i < _ready_queue.size(); i++)
|
for (uint i = 1; i < _ready_queue.size(); i++)
|
||||||
if (_ready_queue.get_item_at(i)->get_state() == SchedulableStatus::state_running)
|
if (_ready_queue.get_item_at(i)->get_state() == DynamicSchedulable::state_running)
|
||||||
_ready_queue.get_item_at(i)->set_state(SchedulableStatus::state_ready);
|
_ready_queue.get_item_at(i)->set_state(DynamicSchedulable::state_ready);
|
||||||
|
|
||||||
//append blocked, future, and terminated schedulables
|
//append blocked, future, and terminated schedulables
|
||||||
for (uint i = 0; i < initial->size(); i++)
|
for (uint i = 0; i < initial->size(); i++)
|
||||||
if(initial->get_item_at(i)->get_state() == SchedulableStatus::state_blocked
|
if(initial->get_item_at(i)->get_state() == DynamicSchedulable::state_blocked
|
||||||
|| initial->get_item_at(i)->get_state() == SchedulableStatus::state_future
|
|| initial->get_item_at(i)->get_state() == DynamicSchedulable::state_future
|
||||||
|| initial->get_item_at(i)->get_state() == SchedulableStatus::state_terminated)
|
|| initial->get_item_at(i)->get_state() == DynamicSchedulable::state_terminated)
|
||||||
_ready_queue.add_at_bottom(*initial->get_item_at(i));
|
_ready_queue.add_at_bottom(*initial->get_item_at(i));
|
||||||
|
|
||||||
cout << "\n";
|
cout << "\n";
|
||||||
|
|
|
@ -41,14 +41,14 @@ namespace sgpem
|
||||||
{
|
{
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
|
|
||||||
/** \brief Manages the SchedulableStatus objects, implementing a given policy.
|
/** \brief Manages the DynamicSchedulable objects, implementing a given policy.
|
||||||
|
|
||||||
Class Scheduler manages the schedulable entities which are ready to run,
|
Class Scheduler manages the schedulable entities which are ready to run,
|
||||||
ordering them in a queue; it also checks that the current scheduling policy
|
ordering them in a queue; it also checks that the current scheduling policy
|
||||||
is well-defined and does not disrupt the application inner mechanism.
|
is well-defined and does not disrupt the application inner mechanism.
|
||||||
It is also responsible for the creation and the destruction of some of
|
It is also responsible for the creation and the destruction of some of
|
||||||
the SchedulableStatus objects (for further details about this, check
|
the DynamicSchedulable objects (for further details about this, check
|
||||||
class SchedulableStatus).
|
class DynamicSchedulable).
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,11 @@ StaticSchedulable::get_arrival_time() const
|
||||||
return _arrival_time;
|
return _arrival_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StaticSchedulable::set_arrival_time(unsigned int new_time)
|
||||||
|
{
|
||||||
|
_arrival_time = new_time;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
StaticSchedulable::get_total_cpu_time() const
|
StaticSchedulable::get_total_cpu_time() const
|
||||||
|
@ -54,9 +59,20 @@ StaticSchedulable::get_priority() const
|
||||||
return _priority;
|
return _priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StaticSchedulable::set_priority(int new_priority)
|
||||||
|
{
|
||||||
|
_priority = new_priority;
|
||||||
|
}
|
||||||
|
|
||||||
Glib::ustring
|
Glib::ustring
|
||||||
StaticSchedulable::get_name() const
|
StaticSchedulable::get_name() const
|
||||||
{
|
{
|
||||||
return _name;
|
return _name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StaticSchedulable::set_name(const Glib::ustring& new_name)
|
||||||
|
{
|
||||||
|
_name = new_name;
|
||||||
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace sgpem
|
||||||
* For a reference of a schedulable among its current status see referenced
|
* For a reference of a schedulable among its current status see referenced
|
||||||
* class.
|
* class.
|
||||||
*
|
*
|
||||||
* \see SchedulableStatus
|
* \see DynamicSchedulable
|
||||||
*/
|
*/
|
||||||
class SG_DLLEXPORT StaticSchedulable
|
class SG_DLLEXPORT StaticSchedulable
|
||||||
{
|
{
|
||||||
|
@ -53,6 +53,11 @@ namespace sgpem
|
||||||
*/
|
*/
|
||||||
virtual unsigned int get_arrival_time() const;
|
virtual unsigned int get_arrival_time() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
FIXME make me pure virtual when StaticProcess and StaticThread are completed
|
||||||
|
*/
|
||||||
|
void set_arrival_time(unsigned int new_time);
|
||||||
|
|
||||||
/** \brief Returns the amount of CPU time this process is going to require */
|
/** \brief Returns the amount of CPU time this process is going to require */
|
||||||
unsigned int get_total_cpu_time() const;
|
unsigned int get_total_cpu_time() const;
|
||||||
|
|
||||||
|
@ -63,6 +68,8 @@ namespace sgpem
|
||||||
*/
|
*/
|
||||||
int get_priority() const;
|
int get_priority() const;
|
||||||
|
|
||||||
|
void set_priority(int new_priority);
|
||||||
|
|
||||||
/** \brief Returns a string representing this object
|
/** \brief Returns a string representing this object
|
||||||
*
|
*
|
||||||
* The name of a process is a human readable string assigned to it by the
|
* The name of a process is a human readable string assigned to it by the
|
||||||
|
@ -70,6 +77,8 @@ namespace sgpem
|
||||||
*/
|
*/
|
||||||
Glib::ustring get_name() const;
|
Glib::ustring get_name() const;
|
||||||
|
|
||||||
|
void set_name(const Glib::ustring& new_name);
|
||||||
|
|
||||||
/** \brief Returns the type of the process
|
/** \brief Returns the type of the process
|
||||||
*
|
*
|
||||||
* This is an abstract method as the schedulable type is defined by the
|
* This is an abstract method as the schedulable type is defined by the
|
||||||
|
|
18
src/main.cc
18
src/main.cc
|
@ -29,7 +29,7 @@
|
||||||
#include "backend/history.hh"
|
#include "backend/history.hh"
|
||||||
#include "backend/static_schedulable.hh"
|
#include "backend/static_schedulable.hh"
|
||||||
#include "backend/schedulable_queue.hh"
|
#include "backend/schedulable_queue.hh"
|
||||||
#include "backend/schedulable_status.hh"
|
#include "backend/dynamic_schedulable.hh"
|
||||||
#include "backend/slice.hh"
|
#include "backend/slice.hh"
|
||||||
#include "backend/static_process.hh"
|
#include "backend/static_process.hh"
|
||||||
#include "backend/policy.hh"
|
#include "backend/policy.hh"
|
||||||
|
@ -112,12 +112,12 @@ main(int argc, char* argv[])
|
||||||
StaticProcess p5("P5", 1,2,3);
|
StaticProcess p5("P5", 1,2,3);
|
||||||
StaticProcess p6("P6", 10,2,1);
|
StaticProcess p6("P6", 10,2,1);
|
||||||
|
|
||||||
SchedulableStatus ss1(p1);
|
DynamicSchedulable ss1(p1);
|
||||||
SchedulableStatus ss2(p2);
|
DynamicSchedulable ss2(p2);
|
||||||
SchedulableStatus ss3(p3);
|
DynamicSchedulable ss3(p3);
|
||||||
SchedulableStatus ss4(p4);
|
DynamicSchedulable ss4(p4);
|
||||||
SchedulableStatus ss5(p5);
|
DynamicSchedulable ss5(p5);
|
||||||
SchedulableStatus ss6(p6);
|
DynamicSchedulable ss6(p6);
|
||||||
|
|
||||||
SchedulableQueue initial;
|
SchedulableQueue initial;
|
||||||
initial.add_at_bottom(ss1);
|
initial.add_at_bottom(ss1);
|
||||||
|
@ -166,7 +166,7 @@ main(int argc, char* argv[])
|
||||||
quale = h.get_simulation_status_at(0); //stato iniziale
|
quale = h.get_simulation_status_at(0); //stato iniziale
|
||||||
|
|
||||||
cout << quale->get_item_at(0)->get_schedulable()->get_name();
|
cout << quale->get_item_at(0)->get_schedulable()->get_name();
|
||||||
smart_ptr<const sgpem::SchedulableStatus> quale2 = h.get_scheduled_at(1);
|
smart_ptr<const sgpem::DynamicSchedulable> quale2 = h.get_scheduled_at(1);
|
||||||
cout << quale2->get_schedulable()->get_name();
|
cout << quale2->get_schedulable()->get_name();
|
||||||
|
|
||||||
h.truncate_at(0);
|
h.truncate_at(0);
|
||||||
|
@ -186,7 +186,7 @@ main(int argc, char* argv[])
|
||||||
|
|
||||||
h.truncate_at(2);
|
h.truncate_at(2);
|
||||||
|
|
||||||
smart_ptr<const sgpem::SchedulableStatus> quale2;
|
smart_ptr<const sgpem::DynamicSchedulable> quale2;
|
||||||
quale2 = h.get_scheduled_at(0);
|
quale2 = h.get_scheduled_at(0);
|
||||||
if (quale2) cout << "\n" << quale2->get_schedulable()->get_name(); else cout << "NO";
|
if (quale2) cout << "\n" << quale2->get_schedulable()->get_name(); else cout << "NO";
|
||||||
quale2 = h.get_scheduled_at(1);
|
quale2 = h.get_scheduled_at(1);
|
||||||
|
|
|
@ -100,7 +100,7 @@ Simulation::run() throw(UserInterruptException)
|
||||||
bool all_term = true;
|
bool all_term = true;
|
||||||
smart_ptr<SchedulableQueue> left = h.get_simulation_status_at(h.get_current_time());
|
smart_ptr<SchedulableQueue> left = h.get_simulation_status_at(h.get_current_time());
|
||||||
for(uint i = 0; i < left->size(); i++)
|
for(uint i = 0; i < left->size(); i++)
|
||||||
if (left->get_item_at(i)->get_state() != SchedulableStatus::state_terminated)
|
if (left->get_item_at(i)->get_state() != DynamicSchedulable::state_terminated)
|
||||||
{
|
{
|
||||||
all_term = false;
|
all_term = false;
|
||||||
break;
|
break;
|
||||||
|
@ -143,7 +143,7 @@ Simulation::run() throw(UserInterruptException)
|
||||||
bool all_term = true;
|
bool all_term = true;
|
||||||
smart_ptr<SchedulableQueue> left = h.get_simulation_status_at(h.get_current_time());
|
smart_ptr<SchedulableQueue> left = h.get_simulation_status_at(h.get_current_time());
|
||||||
for(uint i = 0; i < left->size(); i++)
|
for(uint i = 0; i < left->size(); i++)
|
||||||
if (left->get_item_at(i)->get_state() != SchedulableStatus::state_terminated)
|
if (left->get_item_at(i)->get_state() != DynamicSchedulable::state_terminated)
|
||||||
{
|
{
|
||||||
all_term = false;
|
all_term = false;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include "backend/slice.hh"
|
#include "backend/slice.hh"
|
||||||
#include "backend/observed_subject.hh"
|
#include "backend/observed_subject.hh"
|
||||||
#include "backend/schedulable_queue.hh"
|
#include "backend/schedulable_queue.hh"
|
||||||
#include "backend/schedulable_status.hh"
|
#include "backend/dynamic_schedulable.hh"
|
||||||
#include "templates/smartp.hh"
|
#include "templates/smartp.hh"
|
||||||
|
|
||||||
using namespace sgpem;
|
using namespace sgpem;
|
||||||
|
@ -83,7 +83,7 @@ public:
|
||||||
|
|
||||||
int _history_length; // mirrors the correct length of the history
|
int _history_length; // mirrors the correct length of the history
|
||||||
SchedulableQueue* _get_simulation_status_at[400]; // mirrors the correct content of the history
|
SchedulableQueue* _get_simulation_status_at[400]; // mirrors the correct content of the history
|
||||||
SchedulableStatus* _get_scheduled_at[400]; // mirrors the correct content of the history
|
DynamicSchedulable* _get_scheduled_at[400]; // mirrors the correct content of the history
|
||||||
SchedulableQueue _internal_schedulable_queue;
|
SchedulableQueue _internal_schedulable_queue;
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ public:
|
||||||
{
|
{
|
||||||
std::cout << "get_simulation_status_at";
|
std::cout << "get_simulation_status_at";
|
||||||
}
|
}
|
||||||
if (History::get_instance().get_scheduled_at(i) != memory::smart_ptr<SchedulableStatus>(NULL) && !(*History::get_instance().get_scheduled_at(i) == *_get_scheduled_at[i]))
|
if (History::get_instance().get_scheduled_at(i) != memory::smart_ptr<DynamicSchedulable>(NULL) && !(*History::get_instance().get_scheduled_at(i) == *_get_scheduled_at[i]))
|
||||||
{
|
{
|
||||||
std::cout << "get_simulation_status_at";
|
std::cout << "get_simulation_status_at";
|
||||||
}
|
}
|
||||||
|
@ -121,8 +121,8 @@ public:
|
||||||
_history_length = _history_length + 1;
|
_history_length = _history_length + 1;
|
||||||
_get_simulation_status_at[_history_length] = new SchedulableQueue(status);
|
_get_simulation_status_at[_history_length] = new SchedulableQueue(status);
|
||||||
|
|
||||||
if (History::get_instance().get_scheduled_at(_history_length) != memory::smart_ptr<SchedulableStatus>(NULL))
|
if (History::get_instance().get_scheduled_at(_history_length) != memory::smart_ptr<DynamicSchedulable>(NULL))
|
||||||
_get_scheduled_at[_history_length] = new SchedulableStatus(*(status.top()));
|
_get_scheduled_at[_history_length] = new DynamicSchedulable(*(status.top()));
|
||||||
else
|
else
|
||||||
_get_scheduled_at[_history_length] = NULL;
|
_get_scheduled_at[_history_length] = NULL;
|
||||||
return;
|
return;
|
||||||
|
@ -149,7 +149,7 @@ public:
|
||||||
{
|
{
|
||||||
status.get_item_at(i)->give_cpu_time(i%2);
|
status.get_item_at(i)->give_cpu_time(i%2);
|
||||||
status.get_item_at(i)->set_last_scheduled(_history_length%30);
|
status.get_item_at(i)->set_last_scheduled(_history_length%30);
|
||||||
status.get_item_at(i)->set_state(i%2 ? SchedulableStatus::state_running : SchedulableStatus::state_ready);
|
status.get_item_at(i)->set_state(i%2 ? DynamicSchedulable::state_running : DynamicSchedulable::state_ready);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -212,25 +212,25 @@ main(int argc, char** argv)
|
||||||
StaticProcess p19("PK", 10,24,17);
|
StaticProcess p19("PK", 10,24,17);
|
||||||
StaticProcess p20("PK2", 11,34,67); // not used!
|
StaticProcess p20("PK2", 11,34,67); // not used!
|
||||||
|
|
||||||
SchedulableStatus ss1(p1);
|
DynamicSchedulable ss1(p1);
|
||||||
SchedulableStatus ss2(p2);
|
DynamicSchedulable ss2(p2);
|
||||||
SchedulableStatus ss3(p3);
|
DynamicSchedulable ss3(p3);
|
||||||
SchedulableStatus ss4(p4);
|
DynamicSchedulable ss4(p4);
|
||||||
SchedulableStatus ss5(p5);
|
DynamicSchedulable ss5(p5);
|
||||||
SchedulableStatus ss6(p6);
|
DynamicSchedulable ss6(p6);
|
||||||
SchedulableStatus ss7(p7);
|
DynamicSchedulable ss7(p7);
|
||||||
SchedulableStatus ss8(p8);
|
DynamicSchedulable ss8(p8);
|
||||||
SchedulableStatus ss9(p9);
|
DynamicSchedulable ss9(p9);
|
||||||
SchedulableStatus ss10(p10);
|
DynamicSchedulable ss10(p10);
|
||||||
SchedulableStatus ss11(p11);
|
DynamicSchedulable ss11(p11);
|
||||||
SchedulableStatus ss12(p12);
|
DynamicSchedulable ss12(p12);
|
||||||
SchedulableStatus ss13(p13);
|
DynamicSchedulable ss13(p13);
|
||||||
SchedulableStatus ss14(p14);
|
DynamicSchedulable ss14(p14);
|
||||||
SchedulableStatus ss15(p15);
|
DynamicSchedulable ss15(p15);
|
||||||
SchedulableStatus ss16(p16);
|
DynamicSchedulable ss16(p16);
|
||||||
SchedulableStatus ss17(p17);
|
DynamicSchedulable ss17(p17);
|
||||||
SchedulableStatus ss18(p18);
|
DynamicSchedulable ss18(p18);
|
||||||
SchedulableStatus ss19(p19); // not used!
|
DynamicSchedulable ss19(p19); // not used!
|
||||||
|
|
||||||
SchedulableQueue initial;
|
SchedulableQueue initial;
|
||||||
initial.add_at_bottom(ss1);
|
initial.add_at_bottom(ss1);
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
#include "backend/slice.hh"
|
#include "backend/slice.hh"
|
||||||
#include "backend/observed_subject.hh"
|
#include "backend/observed_subject.hh"
|
||||||
#include "backend/schedulable_queue.hh"
|
#include "backend/schedulable_queue.hh"
|
||||||
#include "backend/schedulable_status.hh"
|
#include "backend/dynamic_schedulable.hh"
|
||||||
|
|
||||||
namespace sgpem
|
namespace sgpem
|
||||||
{
|
{
|
||||||
|
@ -51,7 +51,7 @@ namespace sgpem
|
||||||
class TestHistory : public History
|
class TestHistory : public History
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
memory::smart_ptr<sgpem::SchedulableStatus> get_scheduled_at(int time)
|
memory::smart_ptr<sgpem::DynamicSchedulable> get_scheduled_at(int time)
|
||||||
{
|
{
|
||||||
std::cout << "get_scheduled_at" << time;
|
std::cout << "get_scheduled_at" << time;
|
||||||
return History::get_scheduled_at(time);
|
return History::get_scheduled_at(time);
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#include "backend/static_process.hh"
|
#include "backend/static_process.hh"
|
||||||
#include "backend/observed_subject.hh"
|
#include "backend/observed_subject.hh"
|
||||||
#include "backend/schedulable_queue.hh"
|
#include "backend/schedulable_queue.hh"
|
||||||
#include "backend/schedulable_status.hh"
|
#include "backend/dynamic_schedulable.hh"
|
||||||
#include "templates/smartp.hh"
|
#include "templates/smartp.hh"
|
||||||
|
|
||||||
#include "scheduler.hh"
|
#include "scheduler.hh"
|
||||||
|
@ -185,7 +185,7 @@ namespace sgpem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
memory::smart_ptr<sgpem::SchedulableStatus> get_scheduled_at(int time) const {}
|
memory::smart_ptr<sgpem::DynamicSchedulable> get_scheduled_at(int time) const {}
|
||||||
memory::smart_ptr<sgpem::SchedulableQueue> get_simulation_status_at(int time) const;
|
memory::smart_ptr<sgpem::SchedulableQueue> get_simulation_status_at(int time) const;
|
||||||
int get_current_time() const {return _total_time_elapsed;}
|
int get_current_time() const {return _total_time_elapsed;}
|
||||||
void enqueue_slice(const sgpem::SchedulableQueue& status);
|
void enqueue_slice(const sgpem::SchedulableQueue& status);
|
||||||
|
@ -252,25 +252,25 @@ main(int argc, char** argv) {
|
||||||
StaticProcess p19("PK", 10,24,17);
|
StaticProcess p19("PK", 10,24,17);
|
||||||
StaticProcess p20("PK2", 11,34,67); // not used!
|
StaticProcess p20("PK2", 11,34,67); // not used!
|
||||||
|
|
||||||
SchedulableStatus ss1(p1);
|
DynamicSchedulable ss1(p1);
|
||||||
SchedulableStatus ss2(p2);
|
DynamicSchedulable ss2(p2);
|
||||||
SchedulableStatus ss3(p3);
|
DynamicSchedulable ss3(p3);
|
||||||
SchedulableStatus ss4(p4);
|
DynamicSchedulable ss4(p4);
|
||||||
SchedulableStatus ss5(p5);
|
DynamicSchedulable ss5(p5);
|
||||||
SchedulableStatus ss6(p6);
|
DynamicSchedulable ss6(p6);
|
||||||
SchedulableStatus ss7(p7);
|
DynamicSchedulable ss7(p7);
|
||||||
SchedulableStatus ss8(p8);
|
DynamicSchedulable ss8(p8);
|
||||||
SchedulableStatus ss9(p9);
|
DynamicSchedulable ss9(p9);
|
||||||
SchedulableStatus ss10(p10);
|
DynamicSchedulable ss10(p10);
|
||||||
SchedulableStatus ss11(p11);
|
DynamicSchedulable ss11(p11);
|
||||||
SchedulableStatus ss12(p12);
|
DynamicSchedulable ss12(p12);
|
||||||
SchedulableStatus ss13(p13);
|
DynamicSchedulable ss13(p13);
|
||||||
SchedulableStatus ss14(p14);
|
DynamicSchedulable ss14(p14);
|
||||||
SchedulableStatus ss15(p15);
|
DynamicSchedulable ss15(p15);
|
||||||
SchedulableStatus ss16(p16);
|
DynamicSchedulable ss16(p16);
|
||||||
SchedulableStatus ss17(p17);
|
DynamicSchedulable ss17(p17);
|
||||||
SchedulableStatus ss18(p18);
|
DynamicSchedulable ss18(p18);
|
||||||
SchedulableStatus ss19(p19); // not used!
|
DynamicSchedulable ss19(p19); // not used!
|
||||||
|
|
||||||
SchedulableQueue initial;
|
SchedulableQueue initial;
|
||||||
initial.add_at_bottom(ss1);
|
initial.add_at_bottom(ss1);
|
||||||
|
|
|
@ -390,7 +390,7 @@ TextSimulation::update()
|
||||||
_devices[dev]->write_buffer(temp + ") [RUNS]");
|
_devices[dev]->write_buffer(temp + ") [RUNS]");
|
||||||
|
|
||||||
//insert the RUNNING ONE
|
//insert the RUNNING ONE
|
||||||
smart_ptr<SchedulableStatus> running = h.get_scheduled_at(when);
|
smart_ptr<DynamicSchedulable> running = h.get_scheduled_at(when);
|
||||||
if (running)
|
if (running)
|
||||||
{
|
{
|
||||||
arr = running->get_schedulable()->get_arrival_time();
|
arr = running->get_schedulable()->get_arrival_time();
|
||||||
|
@ -401,7 +401,7 @@ TextSimulation::update()
|
||||||
_devices[dev]->write_buffer(" --[READY]");
|
_devices[dev]->write_buffer(" --[READY]");
|
||||||
//insert the READY ones
|
//insert the READY ones
|
||||||
for (uint i = 0; i < ll->size(); i++)
|
for (uint i = 0; i < ll->size(); i++)
|
||||||
if (ll->get_item_at(i)->get_state() == SchedulableStatus::state_ready)
|
if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_ready)
|
||||||
{
|
{
|
||||||
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
||||||
int_to_string(arr, temp);
|
int_to_string(arr, temp);
|
||||||
|
@ -411,7 +411,7 @@ TextSimulation::update()
|
||||||
_devices[dev]->write_buffer(" --[BLOCKED]");
|
_devices[dev]->write_buffer(" --[BLOCKED]");
|
||||||
//insert the BLOCKED ones
|
//insert the BLOCKED ones
|
||||||
for (uint i = 0; i < ll->size(); i++)
|
for (uint i = 0; i < ll->size(); i++)
|
||||||
if (ll->get_item_at(i)->get_state() == SchedulableStatus::state_blocked)
|
if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_blocked)
|
||||||
{
|
{
|
||||||
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
||||||
int_to_string(arr, temp);
|
int_to_string(arr, temp);
|
||||||
|
@ -421,7 +421,7 @@ TextSimulation::update()
|
||||||
_devices[dev]->write_buffer(" --[FUTURE]");
|
_devices[dev]->write_buffer(" --[FUTURE]");
|
||||||
//insert the FUTURE ones
|
//insert the FUTURE ones
|
||||||
for (uint i = 0; i < ll->size(); i++)
|
for (uint i = 0; i < ll->size(); i++)
|
||||||
if (ll->get_item_at(i)->get_state() == SchedulableStatus::state_future)
|
if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_future)
|
||||||
{
|
{
|
||||||
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
||||||
int_to_string(arr, temp);
|
int_to_string(arr, temp);
|
||||||
|
@ -431,7 +431,7 @@ TextSimulation::update()
|
||||||
_devices[dev]->write_buffer(" --[TERM]");
|
_devices[dev]->write_buffer(" --[TERM]");
|
||||||
//insert the TERMINATED ones
|
//insert the TERMINATED ones
|
||||||
for (uint i = 0; i < ll->size(); i++)
|
for (uint i = 0; i < ll->size(); i++)
|
||||||
if (ll->get_item_at(i)->get_state() == SchedulableStatus::state_terminated)
|
if (ll->get_item_at(i)->get_state() == DynamicSchedulable::state_terminated)
|
||||||
{
|
{
|
||||||
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
arr = ll->get_item_at(i)->get_schedulable()->get_arrival_time();
|
||||||
int_to_string(arr, temp);
|
int_to_string(arr, temp);
|
||||||
|
|
Loading…
Reference in New Issue