- Fix test to initialize a set of processes and run a simulation

- The test needs to be linked to Gtkmm, even if it doesn't use it. 
This is wrong and a coding anomaly that will need to be resolved.
- Add debug code to fcfs.py. Please remove it when it'll be okay
- Calling dir(SchedulableList.get_item_at(x)) from Python shows
a worringly empty list!


git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@395 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
tchernobog 2006-02-23 11:29:25 +00:00
parent a2a492b5d5
commit 8d6b7c500e
11 changed files with 236 additions and 33 deletions

View File

@ -1,3 +1,67 @@
2006-02-23 10:12 tchernobog
* trunk/src/backend/pyloader/Policy.py,
trunk/src/backend/pyloader/ScriptAdapter.py,
trunk/src/backend/pyloader/python_policy.cc,
trunk/src/backend/schedulable_list.hh, trunk/src/backend/sgpem.i:
- Previous segmentation fault was due to a faulty call (wrong
parameters to ScriptAdapter.__wrap_sort_queue()). Now prints an
error and check for retval before Py_DECREF'ing it. - Fix(?) qsort
implementation in Policy - SWIG doesn't understand "uint". Change
into more verbose (but surely standard) unsigned int
2006-02-23 09:26 tchernobog
* trunk/Makefile.am, trunk/doc/sgpem2uman.texi,
trunk/src/backend/pyloader/python_policy.cc: - Add note that
building with --disable-shared at the moment doesn't work
2006-02-22 23:21 fpaparel
* trunk/src/backend/schedulable_list.hh: - hemm... updated also the
header!!
2006-02-22 23:19 fpaparel
* trunk/src/backend/schedulable_list.cc: - implemented swap in
schedulable_list.cc
2006-02-22 22:57 tchernobog
* trunk/src/backend/policy.hh, trunk/src/backend/pyloader/Policy.py,
trunk/src/backend/pyloader/python_policy_manager.cc,
trunk/src/backend/sgpem.i, trunk/src/builtin-policies/fcfs.py,
trunk/src/testsuite/test-python_loader.cc: - Implement first draft
of quicksort in Python - Extend test to have a set of processes
(now lacks significative output) - Extend FCFS policy to do
something useful - FIXME : segfaults on sortQueue() - FIXME :
needs implementation for SchedulableQueue.swap()
2006-02-22 22:45 fpaparel
* trunk/src/graphical_simulation.hh,
trunk/src/graphical_terminal_io.cc,
trunk/src/graphical_terminal_io.hh, trunk/src/main.cc,
trunk/src/start_gui.cc, trunk/src/start_gui.hh,
trunk/src/text_simulation.cc, trunk/src/text_simulation.hh: - The
grafical interpreter now works
2006-02-22 21:35 tchernobog
* trunk/src/backend/pyloader/Policy.py,
trunk/src/backend/schedulable_list.hh, trunk/src/backend/sgpem.i:
- Add swap() method signature to SchedulableQueue - Export swap()
to SWIG - Add sort function (just its documentation, actually,
implementation will follow) to Policy.py
2006-02-22 20:36 tchernobog
* trunk/ChangeLog, trunk/Makefile.am,
trunk/src/backend/pyloader/python_policy.cc,
trunk/src/backend/pyloader/python_policy_manager.cc: - "Yeehaw!
It's working! I can't believe it! And they said that an imitation
diamond wasn't good enough..." :-)
2006-02-22 15:16 tchernobog 2006-02-22 15:16 tchernobog
* trunk/src/backend/dummy_policy.hh, trunk/src/backend/policy.hh, * trunk/src/backend/dummy_policy.hh, trunk/src/backend/policy.hh,

View File

@ -183,7 +183,8 @@ src_backend_libbackend_la_SOURCES = \
src/backend/schedulable_status.cc \ src/backend/schedulable_status.cc \
src/backend/scheduler.cc \ src/backend/scheduler.cc \
src/backend/slice.cc \ src/backend/slice.cc \
src/backend/string_utils.cc src/backend/string_utils.cc \
src/backend/user_interrupt_exception.cc
noinst_HEADERS += \ noinst_HEADERS += \
src/backend/dummy_policy.hh \ src/backend/dummy_policy.hh \
@ -198,7 +199,8 @@ noinst_HEADERS += \
src/backend/schedulable_status.hh \ src/backend/schedulable_status.hh \
src/backend/scheduler.hh \ src/backend/scheduler.hh \
src/backend/slice.hh \ src/backend/slice.hh \
src/backend/string_utils.hh src/backend/string_utils.hh \
src/backend/user_interrupt_exception.hh
# ############################################################ # ############################################################
# #
@ -315,14 +317,24 @@ pyc_PYTHON = \
noinst_PROGRAMS = test-python_loader noinst_PROGRAMS = test-python_loader
# Shouldn't need Gtkmm! This is a coding anomaly
test_python_loader_CPPFLAGS = \ test_python_loader_CPPFLAGS = \
-I@top_srcdir@/src \ -I@top_srcdir@/src \
-DPYCDIR="\"$(pycdir)\"" \ -DPYCDIR="\"$(pycdir)\"" \
-DMODDIR="\"$(moddir)\"" \ -DMODDIR="\"$(moddir)\"" \
$(PYTHON_CPPFLAGS) \ $(PYTHON_CPPFLAGS) \
$(GLIBMM_CFLAGS) $(GLIBMM_CFLAGS) \
$(GTKMM_CFLAGS) \
$(GTHREAD_CFLAGS)
test_python_loader_LDFLAGS = \ test_python_loader_LDFLAGS = \
src/backend/pyloader/libpyloader.la src/backend/pyloader/libpyloader.la \
$(GTKMM_LIBS) $(GTHREAD_LIBS)
test_python_loader_SOURCES = \ test_python_loader_SOURCES = \
src/testsuite/test-python_loader.cc src/testsuite/test-python_loader.cc \
src/start_gui.cc \
src/standard_io.cc \
src/text_simulation.cc \
src/observer.cc \
src/graphical_terminal_io.cc \
src/simulation.cc

View File

@ -52,14 +52,14 @@ class ScriptAdapter :
self._policy.sort_queue(event, queue) self._policy.sort_queue(event, queue)
_g_mutex.unlock() _g_mutex.unlock()
def async_is_preemptible(self): def async_is_preemptive(self):
_g_mutex.lock(ScriptAdapter._wrap_is_preemptible, self) _g_mutex.lock(ScriptAdapter._wrap_is_preemptive, self)
def _wrap_is_preemptible(self): def _wrap_is_preemptive(self):
thread.start_new_thread(ScriptAdapter._wrap_is_preemptible_callback, (self,)) thread.start_new_thread(ScriptAdapter._wrap_is_preemptive_callback, (self,))
def _wrap_is_preemptible_callback(self): def _wrap_is_preemptive_callback(self):
_ret_val = self._policy.is_preemptible() _ret_val = self._policy.is_preemptive()
_g_mutex.unlock() _g_mutex.unlock()
def async_get_time_slice(self): def async_get_time_slice(self):

View File

@ -1,4 +1,4 @@
// src/backend/python_policy.cc - Copyright 2005, 2006, University // src/backend/pyloader/python_policy.cc - Copyright 2005, 2006, University
// of Padova, dept. of Pure and Applied // of Padova, dept. of Pure and Applied
// Mathematics // Mathematics
// //
@ -90,22 +90,26 @@ PythonPolicy::~PythonPolicy()
void void
PythonPolicy::configure() PythonPolicy::configure() throw(UserInterruptException)
{ {
PyObject* retval = PyObject_CallMethod(_adapter, "async_configure", NULL); PyObject* retval = PyObject_CallMethod(_adapter, "async_configure", NULL);
Py_DECREF(retval); Py_DECREF(retval);
wait_unlock(); wait_unlock();
} }
void void
PythonPolicy::sort_queue(Scheduler::event event) const PythonPolicy::sort_queue(Scheduler::event event) const throw(UserInterruptException)
{ {
PyObject* pEvent = PyInt_FromLong(event); PyObject* pEvent = PyInt_FromLong(event);
PyObject* pMethodName = PyString_FromString("async_sort_queue"); PyObject* pMethodName = PyString_FromString("async_sort_queue");
PyObject* retval = PyObject_CallMethodObjArgs(_adapter, pMethodName, pEvent, NULL); PyObject* retval = PyObject_CallMethodObjArgs(_adapter, pMethodName, pEvent, NULL);
// Do minimal debugging
if(!retval) PyErr_Print(); if(!retval) PyErr_Print();
else Py_DECREF(retval); else Py_DECREF(retval);
Py_DECREF(pMethodName); Py_DECREF(pMethodName);
Py_DECREF(pEvent); Py_DECREF(pEvent);
@ -121,7 +125,8 @@ PythonPolicy::get_description() const
bool bool
PythonPolicy::is_pre_emptive() const { PythonPolicy::is_pre_emptive() const throw(UserInterruptException)
{
PyObject* retval = PyObject_CallMethod(_adapter, "async_is_preemptive", NULL); PyObject* retval = PyObject_CallMethod(_adapter, "async_is_preemptive", NULL);
Py_DECREF(retval); Py_DECREF(retval);
@ -134,7 +139,7 @@ PythonPolicy::is_pre_emptive() const {
int int
PythonPolicy::get_time_slice() const { PythonPolicy::get_time_slice() const throw(UserInterruptException) {
PyObject* retval = PyObject_CallMethod(_adapter, "async_get_time_slice", NULL); PyObject* retval = PyObject_CallMethod(_adapter, "async_get_time_slice", NULL);
Py_DECREF(retval); Py_DECREF(retval);
@ -154,11 +159,21 @@ PythonPolicy::set_time_slice(const int&)
void void
PythonPolicy::wait_unlock() const PythonPolicy::wait_unlock() const throw(UserInterruptException)
{ {
PyThreadState *_save; PyThreadState *_save;
Py_UNBLOCK_THREADS Py_UNBLOCK_THREADS
sleep(2); // hack'a'ton! magggggiccc nummmbeeerrrrrs!! sleep(2); // hack'a'ton! magggggiccc nummmbeeerrrrrs!!
Py_BLOCK_THREADS
// Now check if lock has been released, else
// throw an exception
PyObject* retval = PyObject_CallMethod(_lock, "test", NULL);
bool still_locked = static_cast<bool>(PyInt_AsLong(retval));
Py_DECREF(retval);
if(still_locked)
throw UserInterruptException("User-defined policy is taking too long to terminate.");
// What we should really do here: // What we should really do here:
/* do { /* do {
@ -175,5 +190,4 @@ PythonPolicy::wait_unlock() const
all's went okay, can exit loop all's went okay, can exit loop
} */ } */
Py_BLOCK_THREADS
} }

View File

@ -1,4 +1,4 @@
// src/backend/python_policy.hh - Copyright 2005, 2006, University // src/backend/pyloader/python_policy.hh - Copyright 2005, 2006, University
// of Padova, dept. of Pure and Applied // of Padova, dept. of Pure and Applied
// Mathematics // Mathematics
// //
@ -29,11 +29,13 @@
#include <iostream> #include <iostream>
#include "../policy.hh" #include "../policy.hh"
#include "../user_interrupt_exception.hh"
namespace sgpem namespace sgpem
{ {
class PythonPolicy; class PythonPolicy;
class PythonPolicyManager; class PythonPolicyManager;
class UserInterruptException;
class SG_DLLEXPORT PythonPolicy : public Policy class SG_DLLEXPORT PythonPolicy : public Policy
{ {
@ -43,11 +45,13 @@ namespace sgpem
virtual ~PythonPolicy(); virtual ~PythonPolicy();
void configure(); void configure() throw(UserInterruptException);
void sort_queue(Scheduler::event) const; void sort_queue(Scheduler::event) const throw(UserInterruptException);
Glib::ustring get_description() const; Glib::ustring get_description() const;
bool is_pre_emptive() const; bool is_pre_emptive() const throw(UserInterruptException);
int get_time_slice() const; int get_time_slice() const throw(UserInterruptException);
// Singing with Caipha's voice: "must die, must die, this method must die!"
void set_time_slice(const int&); void set_time_slice(const int&);
private: private:
@ -55,7 +59,7 @@ namespace sgpem
PythonPolicy(const PythonPolicy&); PythonPolicy(const PythonPolicy&);
PythonPolicy& operator=(const PythonPolicy&); PythonPolicy& operator=(const PythonPolicy&);
void wait_unlock() const; void wait_unlock() const throw(UserInterruptException);
PyObject* _adapter; PyObject* _adapter;
PyObject* _adapter_dict; PyObject* _adapter_dict;

View File

@ -1,4 +1,4 @@
// src/backend/python_policy_manager.cc - Copyright 2005, 2006, University // src/backend/pyloader/python_policy_manager.cc - Copyright 2005, 2006, University
// of Padova, dept. of Pure and Applied // of Padova, dept. of Pure and Applied
// Mathematics // Mathematics
// //
@ -56,8 +56,10 @@ PythonPolicyManager::get_policy()
void void
PythonPolicyManager::init() PythonPolicyManager::init()
{ {
if(_initialized) if(_initialized) {
_python_policy = std::auto_ptr<PythonPolicy>(0);
Py_Finalize(); Py_Finalize();
}
Py_Initialize(); Py_Initialize();
_initialized = true; _initialized = true;

View File

@ -1,4 +1,4 @@
// src/backend/python_policy_manager.hh - Copyright 2005, 2006, University // src/backend/pyloader/python_policy_manager.hh - Copyright 2005, 2006, University
// of Padova, dept. of Pure and Applied // of Padova, dept. of Pure and Applied
// Mathematics // Mathematics
// //

View File

@ -0,0 +1,32 @@
// src/backend/user_interrupt_exception.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
// Warning! This exception will be thrown across different libraries.
// It could be necessary to do dynamic type-checking when
// catching it (with typeinfo).
#include "user_interrupt_exception.hh"
using namespace sgpem;
UserInterruptException::UserInterruptException(const char* msg)
: std::runtime_error(msg)
{}
UserInterruptException::~UserInterruptException() throw() {}

View File

@ -0,0 +1,45 @@
// src/backend/user_interrupt_exception.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
// Warning! This exception will be thrown across different libraries.
// It could be necessary to do dynamic type-checking when
// catching it (with typeinfo).
#ifndef USER_INTERRUPT_EXCEPTION
#define USER_INTERRUPT_EXCEPTION 1
#include "config.h"
#include <stdexcept>
namespace sgpem {
class UserInterruptException;
class SG_DLLEXPORT UserInterruptException : public std::runtime_error
{
public:
UserInterruptException(const char* msg = "");
virtual ~UserInterruptException() throw ();
private:
};
} //~ namespace sgpem
#endif

View File

@ -14,7 +14,20 @@ class fcfs(Policy) :
return -1 return -1
def sort_queue(self, event, queue): def sort_queue(self, event, queue):
print 'Entering sort_queue'
print queue.size()
print dir(queue.get_item_at(0))
for i in range(0, queue.size()):
ss = queue.get_item_at(i)
print ss.get_schedulable().get_name()
cmpf = lambda a, b: \ cmpf = lambda a, b: \
a.get_schedulable().get_arrival_time() < \ a.get_schedulable().get_arrival_time() < \
b.get_schedulable().get_arrival_time() b.get_schedulable().get_arrival_time()
try:
self.sort(queue,cmpf) self.sort(queue,cmpf)
except:
print "Unexpected error:", sys.exc_info()[0]
raise
for i in range(0, queue.size()):
ss = queue.get_item_at(i)
print ss.get_schedulable().get_name()

View File

@ -27,12 +27,19 @@
#include "backend/schedulable_status.hh" #include "backend/schedulable_status.hh"
#include "backend/schedulable_list.hh" #include "backend/schedulable_list.hh"
#include "backend/scheduler.hh" #include "backend/scheduler.hh"
#include "standard_io.hh"
#include "start_gui.hh"
#include "text_simulation.hh"
#include "templates/smartp.hh"
#include <cassert> #include <cassert>
int int
main(int, char** ) { main(int argc, char** argv) {
using namespace sgpem; using namespace sgpem;
Glib::thread_init();
// Create an INITIAL STATE // Create an INITIAL STATE
Process p1("P1", 0,5,1); Process p1("P1", 0,5,1);
Process p2("P2", 0,5,2); Process p2("P2", 0,5,2);
@ -60,7 +67,17 @@ main(int, char** ) {
PythonPolicyManager* ppm = PythonPolicyManager::get_instance(); PythonPolicyManager* ppm = PythonPolicyManager::get_instance();
ppm->init(); ppm->init();
Policy& pol = ppm->get_policy(); Policy& pol = ppm->get_policy();
pol.configure(); Scheduler::get_instance().set_policy(&pol);
std::cout << pol.get_time_slice() << std::endl;
pol.sort_queue(Scheduler::event_schedulable_arrival); //the textual simulation
TextSimulation text_sim;
History::get_instance().attach(&text_sim);
//textual IO
memory::smart_ptr<IOManager> io(new StandardIO());
text_sim.add_io_device(io);
text_sim.update();
//grafical IO
start_gui(argc, argv, text_sim);
} }