sgpemv2/src/backend/dynamic_thread.hh
tchernobog 989f9a27ef - Update license to GPLv3
git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@1322 3ecf2c5c-341e-0410-92b4-d18e462d057c
2007-06-30 13:31:19 +00:00

220 lines
6 KiB
C++

// src/backend/dynamic_thread.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 3 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, see http://www.gnu.org/licenses/.
#ifndef DYNAMIC_THREAD_HH
#define DYNAMIC_THREAD_HH 1
#include "gettext.h"
#include "glibmm/ustring.h"
#include <vector>
#include <sgpemv2/thread.hh>
#include "dynamic_process.hh"
#include "dynamic_schedulable.hh"
#include <sgpemv2/templates/smartp.hh>
namespace sgpem
{
class DynamicThread;
class DynamicProcess;
class StaticThread;
class Request;
class DynamicRequest;
class SG_DLLLOCAL DynamicThread : public DynamicSchedulable, public Thread
{
public:
/**
\brief Constructor.
\param core The static counterpart to this object.
\param parent The parent process that spawned this thread.
*/
DynamicThread(StaticThread* core, DynamicProcess* parent);
/**
\brief Copy constructor.
\param other The dynamic thread to clone.
\param parent The parent process that spawned this thread.
*/
DynamicThread(const DynamicThread &other, DynamicProcess* parent);
/**
\brief Destructor.
*/
virtual ~DynamicThread();
/**
\brief Gets the owning process.
\return A reference to the DynamicProcess that owns this thread.
*/
DynamicProcess& get_process();
/**
\brief Gets this thread's state.
\return The current Schedulable::state of this object.
*/
state get_state() const;
/**
\brief Sets/gets this thread's state.
\param new_state The desired Schedulable::state of this object.
\return The previous state.
*/
state set_state(state new_state);
/**
\brief Gets the last istant this schedulable has
been put in a Running state.
\return Current value of last_acquisition.
*/
int get_last_acquisition() const;
/**
\brief Sets/gets the last istant this schedulable
has been put in a Running state.
\param instant New value for last_acquisition.
\return Previous value of last_acquisition.
*/
void set_last_acquisition(int instant);
/**
\brief Gets the last instant this schedulable has changed its state
from running to something else.
\return Current value of last_release.
*/
int get_last_release() const;
/**
\brief Sets/gets the last instant this schedulable has changed
its state from running to something else.
\param instant New value for last_release.
\return Previous value of last_release.
*/
void set_last_release(int instant);
/**
\brief Gets total running time of this thread.
\return Current value of _run_for.
*/
unsigned int get_elapsed_time() const;
/**
\brief Decreases the schedulable remaining time by one unit.
*/
void decrease_remaining_time();
/**
\brief Serializes this object via the provided visitor.
Calls translator->from_thread(this).
*/
void serialize(SerializeVisitor& translator) const;
/**
\brief Gets a reference to static counterpart of this object.
\return A reference to static counterpart of this object.
*/
virtual StaticThread& get_core();
/**
\brief Gets a const reference to static counterpart of this object.
\return A const reference to static counterpart of this object.
*/
virtual const StaticThread& get_core() const;
/**
\brief Returns ::Requests pointers this ::Thread did to some ::Resource.
Since C++ (unfortunately) doesn't support covariance for return
types when they're contained into std::vector<T>, some black magic
(downcasting) will have to happen inside the backend.
Does also the job of "add_request" and "remove_request"
\return A reference to the DynamicRequests pointers vector.
*/
std::vector<Request*> get_requests();
/**
\brief Returns ::DynamicRequest pointers this ::Thread did to some ::Resource.
Since C++ (unfortunately) doesn't support covariance for return
types when they're contained into std::vector<T>, some black magic
(downcasting) will have to happen inside the backend.
Does also the job of "add_request" and "remove_request"
\return A reference to the DynamicRequests pointers vector.
*/
std::vector<DynamicRequest*>& get_dynamic_requests();
private:
/**
\brief Private copy constructor; avoids public construction of
DynamicThread without owning process.
*/
DynamicThread(const DynamicThread &other);
/**
\brief Pointer to static counterpart of this object.
*/
memory::smart_ptr<StaticThread> _core;
/**
\brief The current state of this thread.
See Scheduler.step_forward() to know how this state changes.
*/
state _state;
/**
\brief Container with this thread's requests.
*/
std::vector<DynamicRequest*> _dynamic_requests;
/**
\brief Pointer to this thread parent.
*/
DynamicProcess* _parent;
/**
\brief Total running time of this thread
*/
unsigned int _ran_for;
/**
\brief The last istant this schedulable has been put in a Running state.
*/
int _last_acquisition;
/**
\brief The last instant this schedulable has changed its state
from running to something else.
*/
int _last_release;
};
}
#endif