]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/BASE/AliHLTDimServer.cxx
Produce tree with reconstruction statistics
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTDimServer.cxx
index 8d9c55d249d2c1e5ae817e10d738a3ca5ac2e6eb..87b20beeb62d2f0bd20585bd750a56e1dfa436d3 100644 (file)
 //* 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"
@@ -90,6 +90,7 @@ AliHLTDimServer::AliHLTDimService* AliHLTDimServer::CreateService(enum AliHLTDim
 
 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;
@@ -100,27 +101,32 @@ TObjArray* AliHLTDimServer::CreateServiceGroup(enum AliHLTDimServer::AliHLTDimSe
       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);
          }
@@ -135,12 +141,22 @@ TObjArray* AliHLTDimServer::CreateServiceGroup(enum AliHLTDimServer::AliHLTDimSe
   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;
@@ -148,6 +164,8 @@ AliHLTDimServer::AliHLTDimInterface* AliHLTDimServer::Interface()
 
 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) {
@@ -163,6 +181,7 @@ int AliHLTDimServer::Init(const char* dimNameServer)
 
 int AliHLTDimServer::Reset()
 {
+  // reset the DIM server, functionality needs to be clarified
   return 0;
 }
 
@@ -244,29 +263,27 @@ void* AliHLTDimServer::ServerLoop()
   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);
       }
@@ -274,8 +291,8 @@ void* AliHLTDimServer::ServerLoop()
   }
 
   SetState(kStateRunning);
+  Interface()->DisStartServing(GetName());
   while (GetState()==kStateRunning) {
-    cout << "test" << endl;
     gSystem->Sleep(fUpdatePeriod);
   }
 
@@ -302,6 +319,9 @@ AliHLTDimServer::AliHLTDimService::AliHLTDimService()
   : TNamed()
   , fData()
   , fType(kDataTypeUnknown)
+  , fTypeString()
+  , fDataBuffer(NULL)
+  , fDataSize(0)
   , fId(-1)
 {
   // see header file for class documentation
@@ -311,13 +331,27 @@ AliHLTDimServer::AliHLTDimService::AliHLTDimService(enum AliHLTDimServiceDataTyp
   : 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;
@@ -326,12 +360,43 @@ AliHLTDimServer::AliHLTDimService::AliHLTDimService(enum AliHLTDimServiceDataTyp
   };
 }
 
-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:
@@ -342,6 +407,8 @@ void AliHLTDimServer::AliHLTDimService::Update(AliHLTDimServicePoint_t& sp)
     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()