// src/backend/python_policy_manager.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 "python_policy_manager.hh" #include #include #include using namespace sgpem; //static object PythonPolicyManager* PythonPolicyManager::_instance = NULL; PythonPolicyManager::PythonPolicyManager() : _initialized(false) { } PythonPolicyManager& PythonPolicyManager::get_instance() { if(!_instance) _instance = new PythonPolicyManager(); return *_instance; } Policy& PythonPolicyManager::get_policy() { // FIXME : assumes that _python_policy is always != NULL! return *_python_policy; } void PythonPolicyManager::init() { if(_initialized) Py_Finalize(); Py_Initialize(); _initialized = true; // The following line is ugly, but necessary if we use // non-standard installation directories. Theoretically, // it should be up to the user to set correct // environment variables. // FIXME: find better way to achieve this. PyRun_SimpleString("import sys\n" "sys.path[:0] = [ '" MODDIR "', '" PYCDIR "' ]\n"); // Okay, here we go. // Black magic at work. // FIXME : Hardcoded policy char* policy_name = "fcfs_policy"; PyObject* pLoadmeStr = PyString_FromString(policy_name); PyObject *pModule = PyImport_Import(pLoadmeStr); Py_DECREF(pLoadmeStr); if( !pModule ) { PyErr_Print(); // Error in import // FIXME : don't exit abruptly, but fall back gracefully exit(-1); } // Dictionary with defined ``symbols'' for .pyc file PyObject* pDict = PyModule_GetDict(pModule); assert(pDict); // Build up UserPythonScriptAdapter { std::string py_adapter = std::string("class UserPythonScriptAdapter(") + policy_name + "):\n" " def __init__(self):\n" " pass;\n" " def async_configure():\n" " pass;\n" " def async_sort_queue():\n" " pass;\n" " def async_is_preemptible():\n" " pass;\n" " def async_is_timesliced():\n" " pass;\n" "\n"; PyRun_SimpleString(py_adapter.c_str()); } //build SWIG proxy object inside the interpreter PyRun_SimpleString("py_ad = UserPythonScriptAdapter"); /* const char *buildPyProcess = "import proto_process\n" "p = proto_process.Process(19, 'param')\n" "#set ownership to C++ code\n" "p.thisown = 0\n"; PyRun_SimpleString(buildPyProcess); */ Py_DECREF(pModule); pModule = PyImport_AddModule("__main__"); pDict = PyModule_GetDict(pModule); // PyObject *pPyProcess = PyMapping_GetItemString(pDict, "p"); // assert(pPyProcess); // Matteo: PyTuple_SetItem steals the reference, so // we don't DECREF pPyProcess. // See http://www.python.org/doc/2.4.2/api/refcountDetails.html#l2h-13 // PyTuple_SetItem(pArgs, 0, pPyProcess); // assert(pFunc); /* if(PyCallable_Check(pFunc)) { PyObject* ret = PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); if(!ret) PyErr_Print(); else Py_DECREF(ret); } */ }