Gaudi Framework, version v23r0 |
Home | Generated: Mon Jan 30 2012 |
#include <IoComponentMgr.h>
Public Member Functions | |
IoComponentMgr (const std::string &name, ISvcLocator *pSvcLocator) | |
Constructor with parameters: | |
virtual | ~IoComponentMgr () |
Destructor: | |
virtual bool | io_hasitem (IIoComponent *iocomponent) const |
: check if the registry contains a given IIoComponent | |
virtual bool | io_contains (IIoComponent *iocomponent, const std::string &fname) const |
: check if the registry contains a given IIoComponent and that component had | |
virtual StatusCode | io_register (IIoComponent *iocomponent) |
: allow a IIoComponent to register itself with this manager so appropriate actions can be taken when e.g. | |
virtual StatusCode | io_register (IIoComponent *iocomponent, IIoComponentMgr::IoMode::Type iomode, const std::string &fname) |
: allow a IIoComponent to register itself with this manager so appropriate actions can be taken when e.g. | |
virtual StatusCode | io_retrieve (IIoComponent *iocomponent, std::string &fname) |
: retrieve the new filename for a given IIoComponent and | |
virtual StatusCode | io_reinitialize () |
: reinitialize the I/O subsystem. | |
virtual StatusCode | io_finalize () |
: finalize the I/O subsystem. | |
virtual StatusCode | initialize () |
Gaudi Service Implementation. | |
virtual StatusCode | finalize () |
Private Types | |
typedef std::map< std::string, IIoComponent * > | IoRegistry_t |
typedef std::list< IIoComponent * > | IoStack_t |
Private Member Functions | |
IoComponentMgr () | |
Default constructor: | |
Private Attributes | |
MsgStream | m_log |
IoRegistry_t | m_ioregistry |
Registry of IIoComponents . | |
IoStack_t | m_iostack |
Stack of IIoComponents to properly handle order of registration. | |
PyObject * | m_dict |
pointer to a python dictionary holding the associations: { 'iocomp-name' : { 'oldfname' : [ 'iomode', 'newfname' ] } } | |
std::string | m_dict_location |
location of the python dictionary | |
Friends | |
class | SvcFactory< IoComponentMgr > |
Definition at line 29 of file IoComponentMgr.h.
typedef std::map<std::string, IIoComponent*> IoComponentMgr::IoRegistry_t [private] |
Definition at line 127 of file IoComponentMgr.h.
typedef std::list<IIoComponent*> IoComponentMgr::IoStack_t [private] |
Definition at line 131 of file IoComponentMgr.h.
IoComponentMgr::IoComponentMgr | ( | const std::string & | name, |
ISvcLocator * | pSvcLocator | ||
) |
Constructor with parameters:
Definition at line 29 of file IoComponentMgr.cpp.
: base_class(name,svc), m_log(msgSvc(), name ), m_dict ( 0 ) { // // Property declaration // //declareProperty( "Property", m_nProperty ); // declareProperty ("Registry", // m_dict_location = "GaudiMP.IoRegistry.registry", // "Location of the python dictionary holding the " // "associations: \n" // " {component-name:{ 'old-fname' : ['io','new-fname'] }}\n" // "\nSyntax: <python-module>.<python-module>.<fct-name> \n" // " where fct-name is a function returning the wanted " // " dictionary."); }
IoComponentMgr::~IoComponentMgr | ( | ) | [virtual] |
IoComponentMgr::IoComponentMgr | ( | ) | [private] |
Default constructor:
StatusCode IoComponentMgr::finalize | ( | ) | [virtual] |
Reimplemented from Service.
Definition at line 134 of file IoComponentMgr.cpp.
{ m_log << MSG::INFO << "Finalizing " << name() << "..." << endmsg; if (m_log.level() <= MSG::DEBUG) { m_log << MSG::DEBUG << "Listing all monitored entries: " << std::endl; std::string repr = ""; // PyObject_Repr returns a new ref. PyObject* py_repr = PyObject_Repr (m_dict); if ( py_repr && PyString_Check(py_repr) ) { repr = PyString_AsString(py_repr); } Py_XDECREF( py_repr ); m_log << MSG::DEBUG << "content: " << repr << endmsg; } return StatusCode::SUCCESS; }
StatusCode IoComponentMgr::initialize | ( | ) | [virtual] |
Reimplemented from Service.
Definition at line 58 of file IoComponentMgr.cpp.
{ m_log << MSG::INFO << "Initializing " << name() << "..." << endmsg; if ( Service::initialize().isFailure() ) { m_log << MSG::ERROR << "Unable to initialize Service base class" << endmsg; return StatusCode::FAILURE; } m_log.setLevel( m_outputLevel.value() ); if ( ! Py_IsInitialized() ) { if (m_log.level() <= MSG::DEBUG) { m_log << MSG::DEBUG << "Initializing Python" << endmsg; } PyEval_InitThreads(); Py_Initialize(); if ( ! Py_IsInitialized() ) { m_log << MSG::ERROR << "Unable to initialize Python" << endmsg; return StatusCode::FAILURE; } } // retrieve the python dictionary holding the I/O registry const std::string py_module_name = "GaudiMP.IoRegistry"; m_log << MSG::DEBUG << "importing module [" << py_module_name << "]..." << endmsg; PyObject *module = PyImport_ImportModule ((char*)py_module_name.c_str()); if ( !module || !PyModule_Check (module) ) { m_log << MSG::ERROR << "Could not import [" << py_module_name << "] !" << endmsg; Py_XDECREF (module); return StatusCode::FAILURE; } const std::string py_class_name = "IoRegistry"; PyObject *pyclass = PyDict_GetItemString (PyModule_GetDict(module), (char*)py_class_name.c_str()); // borrowed ref. Py_XINCREF (pyclass); if ( !pyclass ) { m_log << MSG::ERROR << "Could not import [" << py_class_name << "] from module [" << py_module_name << "] !" << endmsg ; Py_XDECREF (pyclass); Py_DECREF (module); return StatusCode::FAILURE; } m_dict = PyObject_GetAttrString (pyclass, (char*)"instances"); if ( !m_dict || !PyDict_Check (m_dict) ) { m_log << MSG::ERROR << "could not retrieve attribute [instances] from class [" << py_module_name << "." << py_class_name << "] !" << endmsg; Py_DECREF (pyclass); Py_DECREF (module); return StatusCode::FAILURE; } m_log << MSG::INFO << "python I/O registry retrieved [ok]" << endmsg; if ( m_log.level() <= MSG::DEBUG ) { std::string repr = ""; // PyObject_Repr returns a new ref. PyObject* py_repr = PyObject_Repr (m_dict); if ( py_repr && PyString_Check(py_repr) ) { repr = PyString_AsString(py_repr); } Py_XDECREF( py_repr ); m_log << MSG::DEBUG << "content: " << repr << endmsg; } return StatusCode::SUCCESS; }
bool IoComponentMgr::io_contains | ( | IIoComponent * | iocomponent, |
const std::string & | fname | ||
) | const [virtual] |
: check if the registry contains a given IIoComponent
and that component had
`fname` | as a filename |
Implements IIoComponentMgr.
Definition at line 176 of file IoComponentMgr.cpp.
{ if ( 0 == iocomponent ) { return false; } const std::string& ioname = iocomponent->name(); // m_dict is a python dictionary like so: // { 'iocomp-name' : { 'oldfname' : [ 'iomode', 'newfname' ] } } // -> check there is an 'iocomp-name' entry // -> retrieve that entry PyObject *o = PyDict_GetItemString (m_dict, (char*)ioname.c_str()); Py_XINCREF (o); // -> check it is a dictionary if ( NULL==o || !PyDict_Check (o) ) { Py_XDECREF (o); return false; } // -> check 'oldfname' exists PyObject *item = PyDict_GetItemString (o, (char*)fname.c_str()); const bool contains = (item != 0); if ( contains == false ) { std::string repr = ""; // PyObject_Repr returns a new ref. PyObject* py_repr = PyObject_Repr (o); if ( py_repr && PyString_Check(py_repr) ) { repr = PyString_AsString(py_repr); } Py_XDECREF( py_repr ); m_log << MSG::ERROR << "content: " << repr << endmsg; } Py_DECREF (o); Py_XDECREF(item); return contains; }
StatusCode IoComponentMgr::io_finalize | ( | ) | [virtual] |
: finalize the I/O subsystem.
Hook to allow to e.g. give a chance to I/O subsystems to merge output files. Not sure how to do this correctly though...
Implements IIoComponentMgr.
Definition at line 452 of file IoComponentMgr.cpp.
{ return StatusCode::SUCCESS; }
bool IoComponentMgr::io_hasitem | ( | IIoComponent * | iocomponent ) | const [virtual] |
: check if the registry contains a given IIoComponent
Implements IIoComponentMgr.
Definition at line 162 of file IoComponentMgr.cpp.
{ if ( 0 == iocomponent ) { return false; } const std::string& ioname = iocomponent->name(); IoRegistry_t::const_iterator io = m_ioregistry.find (ioname); return io != m_ioregistry.end(); }
StatusCode IoComponentMgr::io_register | ( | IIoComponent * | iocomponent ) | [virtual] |
: allow a IIoComponent
to register itself with this manager so appropriate actions can be taken when e.g.
a fork(2)
has been issued (this is usually handled by calling IIoComponent::io_reinit
on every registered component)
Implements IIoComponentMgr.
Definition at line 229 of file IoComponentMgr.cpp.
{ if ( 0 == iocomponent ) { m_log << MSG::ERROR << "io_register (component) received a NULL pointer !" << endmsg; return StatusCode::FAILURE; } const std::string& ioname = iocomponent->name(); IoRegistry_t::iterator itr = m_ioregistry.find (ioname); if ( itr == m_ioregistry.end() ) { iocomponent->addRef(); // ownership... m_ioregistry[ioname] = iocomponent; m_iostack.push_back (iocomponent); } else { m_log << MSG::INFO << "IoComponent[" << iocomponent->name() <<"] already registered @" << (void*)itr->second << endmsg; } return StatusCode::SUCCESS; }
StatusCode IoComponentMgr::io_register | ( | IIoComponent * | iocomponent, |
IIoComponentMgr::IoMode::Type | iomode, | ||
const std::string & | fname | ||
) | [virtual] |
: allow a IIoComponent
to register itself with this manager so appropriate actions can be taken when e.g.
a fork(2)
has been issued (this is usually handled by calling IIoComponent::io_reinit
on every registered component)
Implements IIoComponentMgr.
Definition at line 256 of file IoComponentMgr.cpp.
{ if ( 0 == iocomponent ) { return StatusCode::FAILURE; } const std::string& ioname = iocomponent->name(); if ( !io_hasitem (iocomponent) ) { if ( !io_register (iocomponent).isSuccess() ) { m_log << MSG::ERROR << "could not register component [" << iocomponent->name() << "] " << "with the I/O component manager !" << endmsg; return StatusCode::FAILURE; } } // m_dict is a python dictionary like so: // { 'iocomp-name' : { 'oldfname' : [ 'iomode', 'newfname' ] } } // -> check there is an 'iocomp-name' entry // -> retrieve that entry PyObject *o = PyDict_GetItemString (m_dict, (char*)ioname.c_str()); // -> check it is a dictionary if ( NULL==o ) { o = PyDict_New(); if (NULL == o) { m_log << MSG::ERROR << "could not create an I/O entry for [" << ioname << "] " << "in the I/O registry !" << endmsg; return StatusCode::FAILURE; } if ( 0 != PyDict_SetItemString (m_dict, (char*)ioname.c_str(), o) ) { Py_DECREF (o); m_log << MSG::ERROR << "could not create an I/O entry for [" << ioname << "] " << "in the I/O registry !" << endmsg; return StatusCode::FAILURE; } } else if ( !PyDict_Check (o) ) { m_log << MSG::ERROR << "internal consistency error (expected a dictionary !)" << endmsg; return StatusCode::FAILURE; } else { // borrowed ref. Py_INCREF (o); } // -> check if 'fname' has already been registered std::string mode; switch (iomode) { case IIoComponentMgr::IoMode::Input: mode ="<input>"; break; case IIoComponentMgr::IoMode::Output:mode ="<output>";break; default: m_log << MSG::ERROR << "unknown value for iomode: [" << iomode << "] !" << endmsg; Py_DECREF (o); return StatusCode::FAILURE; } PyObject *val = PyDict_GetItemString (o, (char*)fname.c_str()); if ( 0 != val ) { Py_DECREF (o); return StatusCode::SUCCESS; } val = PyList_New(2); if ( 0 == val ) { m_log << MSG::ERROR << "could not allocate a python-list !" << endmsg; Py_DECREF (o); return StatusCode::FAILURE; } int err = PyList_SetItem (val, 0, PyString_FromString ((char*)mode.c_str())); if (err) { Py_DECREF (val); Py_DECREF (o); m_log << MSG::ERROR << "could not set py-iomode !" << endmsg; return StatusCode::FAILURE; } Py_INCREF (Py_None); // PyList_SetItem steals the ref... err = PyList_SetItem (val, 1, Py_None); if (err) { Py_DECREF (val); Py_DECREF (o); m_log << MSG::ERROR << "could not properly fill python-list !" << endmsg; return StatusCode::FAILURE; } err = PyDict_SetItemString (o, (char*)fname.c_str(), val); if (err) { m_log << MSG::ERROR << "could not properly fill registry w/ python-list !" << endmsg; Py_DECREF (val); Py_DECREF (o); return StatusCode::FAILURE; } Py_DECREF (o); return StatusCode::SUCCESS; }
StatusCode IoComponentMgr::io_reinitialize | ( | ) | [virtual] |
: reinitialize the I/O subsystem.
This effectively calls IIoComponent::io_reinit
on all the registered IIoComponent
.
Implements IIoComponentMgr.
Definition at line 419 of file IoComponentMgr.cpp.
{ m_log << MSG::DEBUG << "reinitializing I/O subsystem..." << endmsg; bool allgood = true; for ( IoStack_t::iterator io = m_iostack.begin(), ioEnd = m_iostack.end(); io != ioEnd; ++io ) { m_log << MSG::DEBUG << " [" << (*io)->name() << "]->io_reinit()..." << endmsg; if ( !(*io)->io_reinit().isSuccess() ) { allgood = false; m_log << MSG::ERROR << "problem in [" << (*io)->name() << "]->io_reinit() !" << endmsg; } // we are done with this guy... release it (*io)->release(); } // we are done. // FIXME: shall we allow for multiple io_reinitialize ? m_iostack.clear(); m_ioregistry.clear(); return allgood ? StatusCode::SUCCESS : StatusCode::FAILURE; }
StatusCode IoComponentMgr::io_retrieve | ( | IIoComponent * | iocomponent, |
std::string & | fname | ||
) | [virtual] |
: retrieve the new filename for a given IIoComponent
and
`fname` | filename |
`oldfname` | filename |
Implements IIoComponentMgr.
Definition at line 365 of file IoComponentMgr.cpp.
{ if ( 0 == iocomponent ) { return StatusCode::FAILURE; } const std::string& ioname = iocomponent->name(); // m_dict is a python dictionary like so: // { 'iocomp-name' : { 'oldfname' : [ 'iomode', 'newfname' ] } } // -> check there is an 'iocomp-name' entry // -> retrieve that entry PyObject *o = PyDict_GetItemString (m_dict, (char*)ioname.c_str()); Py_XINCREF (o); // -> check it is a dictionary if ( NULL==o || !PyDict_Check (o) ) { Py_XDECREF (o); return StatusCode::FAILURE; } // -> check 'oldfname' exists PyObject *pylist = PyDict_GetItemString (o, (char*)fname.c_str()); Py_XINCREF (pylist); if ( NULL==pylist || !PyList_Check (pylist) ) { Py_XDECREF(pylist); Py_DECREF (o); return StatusCode::FAILURE; } const std::size_t sz = PyList_Size (pylist); if ( 2 != sz ) { m_log << MSG::ERROR << "[" << ioname << "][" << fname << "] list has size [" << sz << " ! (expected sz==2)" << endmsg; Py_DECREF (o); Py_DECREF (pylist); return StatusCode::FAILURE; } fname = PyString_AsString ( PyList_GetItem (pylist, 1) ); Py_DECREF (o); Py_DECREF (pylist); return StatusCode::SUCCESS; }
friend class SvcFactory< IoComponentMgr > [friend] |
Definition at line 31 of file IoComponentMgr.h.
PyObject* IoComponentMgr::m_dict [private] |
pointer to a python dictionary holding the associations: { 'iocomp-name' : { 'oldfname' : [ 'iomode', 'newfname' ] } }
Definition at line 138 of file IoComponentMgr.h.
std::string IoComponentMgr::m_dict_location [private] |
location of the python dictionary
Definition at line 141 of file IoComponentMgr.h.
IoRegistry_t IoComponentMgr::m_ioregistry [private] |
Registry of IIoComponents
.
Definition at line 129 of file IoComponentMgr.h.
IoStack_t IoComponentMgr::m_iostack [private] |
Stack of IIoComponents
to properly handle order of registration.
Definition at line 133 of file IoComponentMgr.h.
MsgStream IoComponentMgr::m_log [mutable, private] |
Definition at line 125 of file IoComponentMgr.h.