//* provided "as is" without express or implied warranty. *
//**************************************************************************
-/** @file AliHLTDimServer.cxx
- @author Matthias Richter
- @date 2010-03-10
- @brief HLT DIM server implementation
-*/
+// @file AliHLTDimServer.cxx
+// @author Matthias Richter
+// @date 2010-03-10
+// @brief HLT DIM server implementation and dynamic access
+// to DIM library
#include "AliHLTDimServer.h"
#include "TObjArray.h"
TObjArray* AliHLTDimServer::CreateServiceGroup(enum AliHLTDimServer::AliHLTDimServiceDataType type, const char* basename, int count)
{
+ // see header file for class documentation
int iResult=0;
TObjArray* pServices=new TObjArray;
AliHLTLogging log;
while ((i/=10)>0) digits++;
if (digits<9) {
log.LoggingVarargs(kHLTLogDebug, "AliHLTDimServer", "CreateServiceGroup" , __FILE__ , __LINE__ , "basename=%s count=%d digits=%d\n", basename, count, digits);
- int namelen=strlen(basename)+2+digits;
+ // length of name is at max strlen(basename) + 1 '_' + digits + 1 terminating zero
+ // length of format is independent of number of digits
+ // at max we need strlen(basename) + 5 chars + 1 terminating zero
+ int namelen=strlen(basename)+5+digits;
char* name=(char*)malloc(namelen);
- char* format=(char*)malloc(namelen); // this has actually only indirect to do with namelen but its appropriate
+ char* format=(char*)malloc(namelen);
if (name && format) {
+ memset(name, 0, namelen);
+ memset(format, 0, namelen);
const char* key=strchr(basename, '%');
- strcpy(format, basename);
- if (key) {
+ strncpy(format, basename, namelen-1);
+ if (key && key[1]!=0) {
int iPos=(key-basename)+1;
if (key[1]=='d') {
- sprintf(format+iPos, "0*d");
+ snprintf(format+iPos, namelen-iPos, "0*d"); // additional 3 chars
iPos+=3;
} else {
*(format+iPos++)='%';
*(format+iPos++)=key[1];
}
- strcpy(format+iPos, &key[2]);
+ strncpy(format+iPos, &key[2], namelen-1-iPos);
} else {
- sprintf(format+strlen(basename), "_%%0*d");
+ snprintf(format+strlen(basename), namelen-strlen(basename), "_%%0*d"); // additional 5 chars
}
for (i=0; i<count && iResult>=0; i++) {
- sprintf(name, format, digits, i);
+ snprintf(name, namelen, format, digits, i);
AliHLTDimService* service=new AliHLTDimService(type, name);
iResult=RegisterService(service);
}
return pServices;
}
+int AliHLTDimServer::UpdateServices()
+{
+ /// Update all services via the Dim channel
+ return 0;
+}
+
AliHLTDimServer::AliHLTDimInterface* AliHLTDimServer::Interface()
{
+ // get instance of the interface
if (!fgpInterface) {
fgpInterface=new AliHLTDimInterface;
if (fgpInterface) {
- fgpInterface->Init();
+ if (fgpInterface->Init() != 0) {
+ delete fgpInterface;
+ fgpInterface = NULL;
+ }
}
}
return fgpInterface;
int AliHLTDimServer::Init(const char* dimNameServer)
{
+ // init the dim server, check if the interface is available and set the
+ // DIM DNS node name
AliHLTLogging log;
const char* myname=GetName();
if (myname==NULL || myname[0]==0) {
int AliHLTDimServer::Reset()
{
+ // reset the DIM server, functionality needs to be clarified
return 0;
}
while ((obj=next())!=NULL) {
AliHLTDimService* pService=dynamic_cast<AliHLTDimService*>(obj);
if (!pService) continue;
- const char* name=pService->GetName();
+ TString name=GetName(); name+="_"; name+=pService->GetName();
const char* type="";
void* buffer=pService->GetLocation();
int size=0;
switch (pService->GetType()) {
+ case kDataTypeCustom:
case kDataTypeInt:
- type="I";
- size=sizeof(int);
- break;
case kDataTypeFloat:
- type="F";
- size=sizeof(float);
+ type=pService->GetTypeString();
+ size=pService->GetDataSize();
break;
case kDataTypeString:
- log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "ServerLoop" , __FILE__ , __LINE__ , "ignoring dim service %s: type 'string' not yet implemented", name);
+ log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "ServerLoop" , __FILE__ , __LINE__ , "ignoring dim service %s: type 'string' not yet implemented", name.Data());
break;
default:
- log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "ServerLoop" , __FILE__ , __LINE__ , "ignoring dim service %s: unknown type %d", name, pService->GetType());
+ log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "ServerLoop" , __FILE__ , __LINE__ , "ignoring dim service %s: unknown type %d", name.Data(), pService->GetType());
}
if (type[0]!=0) {
- int id=Interface()->DisAddService(name, type, buffer, size);
+ int id=Interface()->DisAddService(name.Data(), type, buffer, size);
if (id<0) {
- log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "ServerLoop" , __FILE__ , __LINE__ , "failed to add dim service %s: error %d", name, id);
+ log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "ServerLoop" , __FILE__ , __LINE__ , "failed to add dim service %s: error %d", name.Data(), id);
} else {
pService->SetId(id);
}
}
SetState(kStateRunning);
+ Interface()->DisStartServing(GetName());
while (GetState()==kStateRunning) {
- cout << "test" << endl;
gSystem->Sleep(fUpdatePeriod);
}
: TNamed()
, fData()
, fType(kDataTypeUnknown)
+ , fTypeString()
+ , fDataBuffer(NULL)
+ , fDataSize(0)
, fId(-1)
{
// see header file for class documentation
: TNamed(servicename, "AliHLTDimService")
, fData()
, fType(type)
+ , fTypeString()
+ , fDataBuffer(NULL)
+ , fDataSize(0)
, fId(-1)
{
// see header file for class documentation
AliHLTLogging log;
switch (fType) {
- case kDataTypeInt: break;
- case kDataTypeFloat: break;
+ case kDataTypeCustom:
+ log.LoggingVarargs(kHLTLogError, "AliHLTDimServer", "AliHLTDimService" , __FILE__ , __LINE__ , "cannot use the kDataTypeCustom type with this method");
+ break;
+ case kDataTypeInt:
+ fTypeString="I";
+ fDataBuffer=&fData.iVal;
+ fDataSize=sizeof(int);
+ break;
+ case kDataTypeFloat:
+ fTypeString="F";
+ fDataBuffer=&fData.fVal;
+ fDataSize=sizeof(float);
+ break;
case kDataTypeString:
log.LoggingVarargs(kHLTLogError, "AliHLTDimServer", "AliHLTDimService" , __FILE__ , __LINE__ , "dim service type 'string' not yet implemented");
break;
};
}
-void AliHLTDimServer::AliHLTDimService::Update(AliHLTDimServicePoint_t& sp)
+AliHLTDimServer::AliHLTDimService::AliHLTDimService(const char* type, void* data, int size, const char* servicename)
+ : TNamed(servicename, "AliHLTDimService")
+ , fData()
+ , fType(kDataTypeCustom)
+ , fTypeString(type)
+ , fDataBuffer(data)
+ , fDataSize(size)
+ , fId(-1)
+{
+ // see header file for class documentation
+}
+
+void AliHLTDimServer::AliHLTDimService::Update()
+{
+ // see header file for class documentation
+ static bool bWarning=true;
+ AliHLTLogging log;
+ switch (fType) {
+ case kDataTypeCustom: break;
+ default:
+ if (bWarning) log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "Update" , __FILE__ , __LINE__ , "The service %s must be a custom type (kDataTypeCustom) to use this form of Update", GetName());
+ bWarning=false;
+ };
+
+ AliHLTDimServer::Interface()->DisUpdateService(fId);
+}
+
+void AliHLTDimServer::AliHLTDimService::Update(const AliHLTDimServicePoint_t& sp)
{
// see header file for class documentation
static bool bWarning=true;
AliHLTLogging log;
switch (fType) {
+ case kDataTypeCustom:
+ if (bWarning) log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "Update" , __FILE__ , __LINE__ , "Should not call this form of Update for custom type (kDataTypeCustom) service %s", GetName());
+ bWarning=false;
+ return;
case kDataTypeInt: fData.iVal=sp.iVal; break;
case kDataTypeFloat: fData.fVal=sp.fVal; break;
case kDataTypeString:
if (bWarning) log.LoggingVarargs(kHLTLogError, "AliHLTDimServer::AliHLTDimService", "Update" , __FILE__ , __LINE__ , "Failed to update dim service %s: unknown type %d", GetName(), fType);
bWarning=false;
};
+
+ AliHLTDimServer::Interface()->DisUpdateService(fId);
}
AliHLTDimServer::AliHLTDimInterface::AliHLTDimInterface()