//-*- Mode: C++ -*- // @(#) $Id$ #ifndef ALIHLTCOMPONENTHANDLER_H #define ALIHLTCOMPONENTHANDLER_H /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * See cxx source for full Copyright notice */ /** @file AliHLTComponentHandler.h @author Matthias Richter, Timm Steinbeck @date @brief Global handling of HLT processing components @note The handler is part of the interface and both used in the Online (PubSub) and Offline (AliRoot) context. */ // see below for class documentation // or // refer to README to build package // or // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt #include //#include "TObject.h" #include "AliHLTDataTypes.h" #include "AliHLTLogging.h" class AliHLTComponent; class AliHLTModuleAgent; struct AliHLTComponentEnvironment; struct AliHLTComponentDataType; /** * @class AliHLTComponentHandler * The component handler controls all the processing components available in * the system. It also controls the component shared libraries. * @ingroup alihlt_component */ class AliHLTComponentHandler : public AliHLTLogging { public: /** standard constructor */ AliHLTComponentHandler(); /** constructor */ AliHLTComponentHandler(AliHLTComponentEnvironment* pEnv); /** destructor */ virtual ~AliHLTComponentHandler(); /** * Library mode. * - kDynamic: library can be unloaded (unload forced at termination of the * handler * - kStatic: library persistent, once loaded it stays */ enum TLibraryMode {kDynamic, kStatic}; /** * Set the environment for the HLT framework. * The environment mainly consists of function pointers for the integration * of the HLT framework into a system like the PubSub online system or * AliRoot offline system. * @param pEnv pointer to @ref AliHLTComponentEnvironment structure * @return none */ void SetEnvironment(AliHLTComponentEnvironment* pEnv); /** * Set library mode. * The mode effects all loaded libraries until another mode is set. * @param mode persistent library or not * @return previous mode */ TLibraryMode SetLibraryMode(TLibraryMode mode); /** * Load a component shared library. * The component library needs to be loaded from the ComponentHanler in order * to automatically register all components in the library. * Registration is done by passing a sample object of the component to the * handler. The object has to be valid during the whole runtime and should * thus be a global object which is ONLY used for the purpose of registration. * This also ensures automatically registration at library load time. * @param libraryPath const char string containing the library name/path * @param bActivateAgents activate agents after loading (@ref ActivateAgents) * @return 0 if succeeded, neg. error code if failed */ int LoadLibrary( const char* libraryPath, int bActivateAgents=1); /** * Find a symbol in a dynamically loaded library. * @param library library * @param symbol the symbol to find * @return void pointer to function */ void* FindSymbol(const char* library, const char* symbol); /** * Unload a component shared library. * All components will be de-registered when the last instance of the * library was unloaded. * @param libraryPath library name as specified to @ref LoadLibrary * @return 0 if succeeded, neg. error code if failed */ int UnloadLibrary( const char* libraryPath ); /** * Schedule a component for registration. * Full registration will be done after successfull loading of the shared * library. * @param pSample a sample object of the component * @return neg. error code if failed */ int ScheduleRegister(AliHLTComponent* pSample ); /** * Register a component. * Registration is done by passing a sample object of the component to the * handler. The object has to be valid during the whole runtime and should * thus be a global object which is ONLY used for the purpose of registration. * @param pSample a sample object of the component * @return neg. error code if failed */ int RegisterComponent(AliHLTComponent* pSample); /** * Add a component and leave control of the sample object to the handler. * Exactly the same functionality as @ref RegisterComponent but deletes * the sample object at clean-up of the handler. * @param pSample a sample object of the component * @return neg. error code if failed */ int AddComponent(AliHLTComponent* pSample); /** * Registers all scheduled components. */ int RegisterScheduledComponents(); /** * Deregister a component. * @param componentID ID of the component * @return neg. error code if failed */ int DeregisterComponent( const char* componentID ); /** * Add standard components * The standard components are part of the libHLTbase library and * need therefore a special handling. */ int AddStandardComponents(); /** */ int DeleteOwnedComponents(); /** * Find the ID of a component with the given output data. * @param dtype data type descriptor * @param prevType can be used to iterate if there are multiple components * with the same output data type. * @return component id */ //const char* FindComponentType( AliHLTComponentDataType dtype, // const char* prevType = NULL ) // { return NULL;} /** * Create a component of the given name (ID). * The method tries to find a registerd component of id \em componentID and * calls the \em Spawn method of the template component. After successful * creation of a new object, the Init method is called in order to initialize * the environment and the component arguments.
* The environment is the same for all components, but each component can * have an additional private parameter \em pEnvParam.
* The component arguments consist of an array of strings and the array size * in the usual manner of the main() function. * @param componentID ID of the component to create * @param pEnvParam environment parameter for the component * @param argc number of arguments in argv * @param argv argument array like in main() * @param component reference to receive the create component instance * @return component pointer in component, neg. error code if failed */ int CreateComponent( const char* componentID, void* pEnvParam, int argc, const char** argv, AliHLTComponent*& component ); /** * Create a component of the given name (ID). * Introduced for backward compatibility. * @param componentID ID of the component to create * @param pEnvParam environment parameter for the component * @param component reference to receive the create component instance * @return component pointer in component, neg. error code if failed */ int CreateComponent( const char* componentID, void* pEnvParam, AliHLTComponent*& component ) { return CreateComponent( componentID, pEnvParam, 0, NULL, component ); } /** * Check if a registered component has output data, e.g. is of type * kSource or kProcessor (see @ref AliHLTComponent::TComponentType). * @param componentID ID of the component to create * @return 1 if component has output data, 0 if not
* -ENOENT if component does not exist */ int HasOutputData( const char* componentID); /** * Print registered components to stdout. * @return none */ void List(); /** * Announce version and compilation info of the base library. */ int AnnounceVersion(); /** * Find a component. * @param componentID ID of the component to find * @return index, neg. error code if failed */ int FindComponentIndex(const char* componentID); protected: private: /** copy constructor prohibited */ AliHLTComponentHandler(const AliHLTComponentHandler&); /** assignment operator prohibited */ AliHLTComponentHandler& operator=(const AliHLTComponentHandler&); /** * Find a component. * @param componentID ID of the component to find * @return descriptor */ AliHLTComponent* FindComponent(const char* componentID); /** * Insert component to the list * @param pSample sample object of the component * @return neg. error code if failed */ int InsertComponent(AliHLTComponent* pSample); /** * Close all libraries. * @return neg. error code if failed */ int UnloadLibraries(); /** * Activate all module agents with this component handler. * The function loops over all available module agents and activates * each agent with this component handler. During activation, the * dynamic component registration is carried out by the agents version * of @ref AliHLTModuleAgent::RegisterComponents * @param blackList array of agents which should be excluded * @param size array size */ int ActivateAgents(const AliHLTModuleAgent** blackList=NULL, int size=0); /** * Compound descriptor for component libraries */ struct AliHLTLibHandle { AliHLTLibHandle() : fHandle(NULL), fName(NULL) {} /** dlopen handle */ void* fHandle; //! transient /** name of the library, casted to TString* before use */ void* fName; //! transient /** library mode: kStatic means never unloaded */ TLibraryMode fMode; //! transient }; /** * Find a specific library among the loaded libraries. * @param library library name/path * @return pointer to AliHLTLibHandle */ AliHLTLibHandle* FindLibrary(const char* library); /** * Unload a component shared library. * All components will be de-registered when the last instance of the * library was unloaded. * @param handle handle to the library to unload * @return 0 if succeeded, neg. error code if failed */ int UnloadLibrary(AliHLTComponentHandler::AliHLTLibHandle &handle); /** list of registered components */ vector fComponentList; // see above /** list of scheduled components */ vector fScheduleList; // see above /** list of libraries */ vector fLibraryList; // see above /** running environment for the component */ AliHLTComponentEnvironment fEnvironment; // see above /** list of owned components, deleted at termination of the handler */ vector fOwnedComponents; // see above /** library mode effects all loaded libraries until a new mode is set */ TLibraryMode fLibraryMode; // see above ClassDef(AliHLTComponentHandler, 0); }; #endif