3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 //* Timm Steinbeck <timm@kip.uni-heidelberg.de> *
9 //* for The ALICE HLT Project. *
11 //* Permission to use, copy, modify and distribute this software and its *
12 //* documentation strictly for non-commercial purposes is hereby granted *
13 //* without fee, provided that the above copyright notice appears in all *
14 //* copies and that both the copyright notice and this permission notice *
15 //* appear in the supporting documentation. The authors make no claims *
16 //* about the suitability of this software for any purpose. It is *
17 //* provided "as is" without express or implied warranty. *
18 //**************************************************************************
20 // @file AliHLT_C_Component_WrapperInterface.cxx
21 // @author Matthias Richter, Timm Steinbeck
23 // @brief Old C interface to the AliRoot HLT component handler
24 // @note This interface is deprecated, the new interface is defined
25 // in HLT/BASE/AliHLTExternalInterface
27 #include "AliHLT_C_Component_WrapperInterface.h"
28 #include "AliHLTComponentHandler.h"
29 #include "AliHLTComponent.h"
30 #include "AliHLTMisc.h"
35 static AliHLTComponentHandler *gComponentHandler_C = NULL;
36 static AliHLTRunDesc gRunDesc=kAliHLTVoidRunDesc;
37 static char* gRunType=NULL;
39 int AliHLT_C_Component_InitSystem( AliHLTComponentEnvironment* comenv )
41 // init the HLT system
42 if ( gComponentHandler_C )
48 // Due to a bug in the SimpleComponentWrapper and AliRootWrapperSubscriber
49 // the fStructSize member was never initialized and we can not use this
50 // method of synchronizing different versions.
51 // This interface is now deprecated, only kept for backward compatibility.
52 // All function pointers are explicitely mapped to the new structure.
54 AliHLTAnalysisEnvironment mappedEnv;
55 memset(&mappedEnv, 0, sizeof(mappedEnv));
56 mappedEnv.fStructSize=sizeof(mappedEnv);
58 mappedEnv.fParam = comenv->fParam;
59 mappedEnv.fAllocMemoryFunc = comenv->fAllocMemoryFunc;
60 mappedEnv.fGetEventDoneDataFunc= comenv->fGetEventDoneDataFunc;
61 mappedEnv.fLoggingFunc = comenv->fLoggingFunc;
64 gComponentHandler_C = new AliHLTComponentHandler(&mappedEnv);
65 if ( !gComponentHandler_C )
67 gComponentHandler_C->InitAliLogTrap(gComponentHandler_C);
68 gComponentHandler_C->AnnounceVersion();
72 int AliHLT_C_Component_DeinitSystem()
74 // De-init the HLT system and clean-up internal memory
75 if ( gComponentHandler_C )
77 delete gComponentHandler_C;
78 gComponentHandler_C = NULL;
83 int AliHLT_C_Component_LoadLibrary( const char* libraryPath )
85 // load a component library
86 if ( !gComponentHandler_C )
88 return gComponentHandler_C->LoadLibrary( libraryPath );
91 int AliHLT_C_Component_UnloadLibrary( const char* /*libraryPath*/ )
93 // unload a component library
94 if ( !gComponentHandler_C )
96 // Matthias 26.10.2007
97 // Unloading of libraries has to be re-worked. It has been commented out here
98 // since the libraries will be unloaded at the destruction of the component
99 // handler instance anyway. So it has no effect to the operation in PubSub.
100 // With the introduction of the dynamic component registration via module
101 // agents we run into trouble when cleaning up the samples managed by the
102 // component handler. Destruction of the sample objects is done AFTER
103 // unloading of the library and thus the destructor is not present any
105 //return gComponentHandler_C->UnloadLibrary( libraryPath );
109 int AliHLT_C_CreateComponent( const char* componentType, void* environParam, int argc, const char** argv, AliHLTComponentHandle* handle )
111 // create a component
112 if ( !gComponentHandler_C )
114 if ( !handle ) return EINVAL;
115 AliHLTComponent* comp=NULL;
116 const char* cdbPath = getenv("ALIHLT_HCDBDIR");
117 if (!cdbPath) cdbPath = getenv("ALICE_ROOT");
118 int ret = gComponentHandler_C->CreateComponent( componentType, comp);
119 if (ret>=0 && comp) {
120 AliHLTMisc::Instance().InitCDB(cdbPath);
121 AliHLTMisc::Instance().SetCDBRunNo(gRunDesc.fRunNo);
122 comp->SetRunDescription(&gRunDesc, gRunType);
123 const AliHLTAnalysisEnvironment* comenv=gComponentHandler_C->GetEnvironment();
124 ret=comp->Init(comenv, environParam, argc, argv);
126 *handle = reinterpret_cast<AliHLTComponentHandle>( comp );
131 void AliHLT_C_DestroyComponent( AliHLTComponentHandle handle )
133 // destroy a component
137 AliHLTComponent* pComp=reinterpret_cast<AliHLTComponent*>( handle );
142 int AliHLT_C_SetRunDescription(const AliHLTRunDesc* desc, const char* runType)
144 // set run description
145 if (!desc) return -EINVAL;
146 if (desc->fStructSize<sizeof(AliHLTUInt32_t)) return -EINVAL;
147 if (!gComponentHandler_C) return ENXIO;
149 memcpy(&gRunDesc, desc, desc->fStructSize<sizeof(gRunDesc)?desc->fStructSize:sizeof(gRunDesc));
150 gRunDesc.fStructSize=sizeof(gRunDesc);
151 if (gRunType) delete [] gRunType;
154 gRunType=new char[strlen(runType)+1];
155 if (gRunType) strcpy(gRunType, runType);
160 int AliHLT_C_ProcessEvent( AliHLTComponentHandle handle, const AliHLTComponentEventData* evtData, const AliHLTComponentBlockData* blocks,
161 AliHLTComponentTriggerData* trigData, AliHLTUInt8_t* outputPtr,
162 AliHLTUInt32_t* size, AliHLTUInt32_t* outputBlockCnt,
163 AliHLTComponentBlockData** outputBlocks,
164 AliHLTComponentEventDoneData** edd )
169 AliHLTComponent* comp = reinterpret_cast<AliHLTComponent*>( handle );
170 return comp->ProcessEvent( *evtData, blocks, *trigData, outputPtr, *size, *outputBlockCnt, *outputBlocks, *edd );
173 int AliHLT_C_GetOutputDataType( AliHLTComponentHandle handle, AliHLTComponentDataType* dataType )
175 // get output data type of a component
178 AliHLTComponent* comp = reinterpret_cast<AliHLTComponent*>( handle );
179 *dataType = comp->GetOutputDataType();
183 int AliHLT_C_GetOutputSize( AliHLTComponentHandle handle, unsigned long* constBase, double* inputMultiplier )
185 // get output data size of a component
188 AliHLTComponent* comp = reinterpret_cast<AliHLTComponent*>( handle );
189 comp->GetOutputDataSize( *constBase, *inputMultiplier );