// 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 #include #include #include using namespace sgpem; //static object PythonPolicyManager* PythonPolicyManager::_instance = NULL; PythonPolicyManager::PythonPolicyManager() : _initialized(false) { PyEval_InitThreads(); } PythonPolicyManager* const 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 name char* policy_name = "fcfs"; PyObject* pLoadmeStr = PyString_FromString(policy_name); PyObject* pUserPolicyModule = PyImport_Import(pLoadmeStr); Py_DECREF(pLoadmeStr); if( !pUserPolicyModule ) { PyErr_Print(); // Error in import // FIXME : don't exit abruptly, but fall back gracefully exit(-1); } // Dictionary with defined ``symbols'' for .pyc file PyObject* pUserPolicyDict = PyModule_GetDict(pUserPolicyModule); assert(pUserPolicyDict); // Loads ScriptAdapter module and get its dictionary pLoadmeStr = PyString_FromString("ScriptAdapter"); PyObject* pScriptAdapterModule = PyImport_Import(pLoadmeStr); Py_DECREF(pLoadmeStr); assert(pScriptAdapterModule); PyObject* pScriptAdapterDict = PyModule_GetDict(pScriptAdapterModule); assert(pScriptAdapterDict); // Now takes the user-defined policy class from pUserPolicyDict PyObject* pPolicyClass = PyDict_GetItemString(pUserPolicyDict, policy_name); assert(pPolicyClass); // FIXME needs stricter checking and exception throwing // Creates a new object of type ScriptAdapter : // takes init function from ScriptAdapter class PyObject* pAdapterClass = PyDict_GetItemString(pScriptAdapterDict, "ScriptAdapter"); PyObject* pAdapterCtorParam = PyTuple_New(1); Py_INCREF(pPolicyClass); // PyTuple_SetItem steals a reference PyTuple_SetItem(pAdapterCtorParam, 0, pPolicyClass); PyObject* pAdapterObject = PyInstance_New(pAdapterClass, pAdapterCtorParam, NULL); // try code PyObject_CallMethod(pAdapterObject, "async_configure", NULL); PyThreadState *_save; Py_UNBLOCK_THREADS sleep(5); // hack'a'ton! magggggiccc nummmbeeerrrrrs!! Py_BLOCK_THREADS // And now, who's your daddy, huh? }