- 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 git-svn-id: svn://svn.gna.org/svn/sgpemv2/trunk@394 3ecf2c5c-341e-0410-92b4-d18e462d057c
This commit is contained in:
parent
075e12d14d
commit
a2a492b5d5
|
@ -1,4 +1,4 @@
|
||||||
from Abstract import *
|
from Abstract import *
|
||||||
|
|
||||||
## @brief This is the abstract class a user-defined policy
|
## @brief This is the abstract class a user-defined policy
|
||||||
# should inherit from
|
# should inherit from
|
||||||
|
@ -28,8 +28,8 @@ class Policy:
|
||||||
# @param queue The SchedulableQueue to be sorted in place
|
# @param queue The SchedulableQueue to be sorted in place
|
||||||
# @param cmpf The binary function to use to compare elements
|
# @param cmpf The binary function to use to compare elements
|
||||||
# @returns None
|
# @returns None
|
||||||
def sort(queue, cmpf):
|
def sort(self, queue, cmpf):
|
||||||
__recursive_qsort_(queue, 0, queue.size()-1, cmpf)
|
self.__recursive_qsort(queue, 0, queue.size()-1, cmpf)
|
||||||
|
|
||||||
## @brief Recursive (private) call to perform quicksort on a
|
## @brief Recursive (private) call to perform quicksort on a
|
||||||
# queue
|
# queue
|
||||||
|
@ -39,12 +39,12 @@ class Policy:
|
||||||
# @param b The final element position of the slice
|
# @param b The final element position of the slice
|
||||||
# @param cmpf The user-defined compare function to employ
|
# @param cmpf The user-defined compare function to employ
|
||||||
# @returns None
|
# @returns None
|
||||||
def __recursive_qsort_(queue, a, b, cmpf):
|
def __recursive_qsort(self, queue, a, b, cmpf):
|
||||||
if(b>a):
|
if(b>a):
|
||||||
pivot = __partition_(queue, a, b, cmpf)
|
pivot = self.__partition(queue, a, b, cmpf)
|
||||||
__recursive_qsort_(queue, a, pivot-1, cmpf)
|
self.__recursive_qsort(queue, a, pivot-1, cmpf)
|
||||||
__recursive_qsort_(queue, pivot+1, b, cmpf)
|
self.__recursive_qsort(queue, pivot+1, b, cmpf)
|
||||||
|
|
||||||
## @brief Recursive (private) call to partition a slice of the queue
|
## @brief Recursive (private) call to partition a slice of the queue
|
||||||
#
|
#
|
||||||
# This private function (the name mangling should work)
|
# This private function (the name mangling should work)
|
||||||
|
@ -58,11 +58,11 @@ class Policy:
|
||||||
# @param b The partition ending element position in the queue
|
# @param b The partition ending element position in the queue
|
||||||
# @param cmpf The binary function to use for comparing two elements
|
# @param cmpf The binary function to use for comparing two elements
|
||||||
# @return The new pivot index
|
# @return The new pivot index
|
||||||
def __partition_(queue, a, b, cmpf):
|
def __partition_(self, queue, a, b, cmpf):
|
||||||
# takes pivot element:
|
# takes pivot element:
|
||||||
right = queue.get_item_at(b)
|
right = queue.get_item_at(b)
|
||||||
i = a
|
i = a
|
||||||
for j in range(a,b-1):
|
for j in range(a,b): # goes from a to b-1
|
||||||
if cmpf(queue.get_item_at(j), right):
|
if cmpf(queue.get_item_at(j), right):
|
||||||
# the C++ code should do nothing if i == j:
|
# the C++ code should do nothing if i == j:
|
||||||
queue.swap(i,j)
|
queue.swap(i,j)
|
||||||
|
|
|
@ -21,15 +21,14 @@ _ret_val = None
|
||||||
# @endcode
|
# @endcode
|
||||||
class ScriptAdapter :
|
class ScriptAdapter :
|
||||||
_policy = None
|
_policy = None
|
||||||
|
_event = None
|
||||||
|
|
||||||
def __init__(self, policy):
|
def __init__(self, policy):
|
||||||
self._policy = policy()
|
self._policy = policy()
|
||||||
print 'ScriptAdapter for policy ', policy, ' loaded'
|
print 'ScriptAdapter for policy ', policy, ' loaded'
|
||||||
|
|
||||||
def async_configure(self):
|
def async_configure(self):
|
||||||
print 'Calling ', self._policy, ' configure() method.'
|
|
||||||
_g_mutex.lock(ScriptAdapter._wrap_configure, self )
|
_g_mutex.lock(ScriptAdapter._wrap_configure, self )
|
||||||
print 'Returning from configure() method'
|
|
||||||
|
|
||||||
def _wrap_configure(self):
|
def _wrap_configure(self):
|
||||||
thread.start_new_thread(ScriptAdapter._wrap_configure_callback, (self,))
|
thread.start_new_thread(ScriptAdapter._wrap_configure_callback, (self,))
|
||||||
|
@ -40,10 +39,12 @@ class ScriptAdapter :
|
||||||
_g_mutex.unlock()
|
_g_mutex.unlock()
|
||||||
|
|
||||||
def async_sort_queue(self, event):
|
def async_sort_queue(self, event):
|
||||||
_g_mutex.lock(ScriptAdapter._wrap_sort_queue, (self, event))
|
self._event = event
|
||||||
|
_g_mutex.lock(ScriptAdapter._wrap_sort_queue, self)
|
||||||
|
|
||||||
def _wrap_sort_queue(self, event):
|
def _wrap_sort_queue(self):
|
||||||
thread.start_new_thread(ScriptAdapter._wrap_sort_queue_callback, (self, event))
|
thread.start_new_thread(ScriptAdapter._wrap_sort_queue_callback,
|
||||||
|
(self,self._event))
|
||||||
|
|
||||||
def _wrap_sort_queue_callback(self, event):
|
def _wrap_sort_queue_callback(self, event):
|
||||||
# here we retrieve and pass the ready queue
|
# here we retrieve and pass the ready queue
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
#include "python_policy.hh"
|
#include "python_policy.hh"
|
||||||
|
#include <iostream>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
using namespace sgpem;
|
using namespace sgpem;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -103,8 +104,8 @@ PythonPolicy::sort_queue(Scheduler::event event) const
|
||||||
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);
|
||||||
// Why we haven't to decref this?
|
if(!retval) PyErr_Print();
|
||||||
// Py_DECREF(retval);
|
else Py_DECREF(retval);
|
||||||
Py_DECREF(pMethodName);
|
Py_DECREF(pMethodName);
|
||||||
Py_DECREF(pEvent);
|
Py_DECREF(pEvent);
|
||||||
|
|
||||||
|
|
|
@ -40,13 +40,13 @@ namespace sgpem
|
||||||
bool operator==(const SchedulableList&) const;
|
bool operator==(const SchedulableList&) const;
|
||||||
bool has_same_objects(const SchedulableList& dx) const;
|
bool has_same_objects(const SchedulableList& dx) const;
|
||||||
|
|
||||||
sgpem::SchedulableStatus* top();
|
SchedulableStatus* top();
|
||||||
sgpem::SchedulableStatus* bottom();
|
SchedulableStatus* bottom();
|
||||||
void add_at_bottom(const sgpem::SchedulableStatus&);
|
void add_at_bottom(const SchedulableStatus&);
|
||||||
void add_at_top(const sgpem::SchedulableStatus&);
|
void add_at_top(const SchedulableStatus&);
|
||||||
memory::smart_ptr<sgpem::SchedulableStatus> remove(const uint& position);
|
memory::smart_ptr<sgpem::SchedulableStatus> remove(const unsigned int& position);
|
||||||
bool insert_at(const uint&, const uint&);
|
bool insert_at(const unsigned int&, const unsigned int&);
|
||||||
uint size() const;
|
unsigned int size() const;
|
||||||
SchedulableStatus* get_item_at(const uint&);
|
SchedulableStatus* get_item_at(const uint&);
|
||||||
const SchedulableStatus* get_item_at(const uint&) const;
|
const SchedulableStatus* get_item_at(const uint&) const;
|
||||||
void clear();
|
void clear();
|
||||||
|
|
|
@ -126,8 +126,8 @@ namespace sgpem {
|
||||||
class SchedulableList
|
class SchedulableList
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint size() const;
|
unsigned int size() const;
|
||||||
const SchedulableStatus* get_item_at(const uint&) const;
|
const SchedulableStatus* 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:
|
||||||
|
|
Loading…
Reference in New Issue