#ifndef ALIHLTDIMSERVER_H
#define ALIHLTDIMSERVER_H
#include "AliHLTLogging.h"
#include "TNamed.h"
#include "TObjArray.h"
class TThread;
class AliHLTDimServer : public TNamed {
public:
AliHLTDimServer();
AliHLTDimServer(const char* servername);
~AliHLTDimServer();
enum AliHLTDimServiceDataType{
kDataTypeUnknown = 0,
kDataTypeCustom,
kDataTypeInt,
kDataTypeFloat,
kDataTypeString,
};
struct AliHLTDimServicePoint_t {
union {
int iVal;
float fVal;
void* strVal;
};
};
class AliHLTDimService : public TNamed {
public:
AliHLTDimService();
AliHLTDimService(AliHLTDimServiceDataType type, const char* servicename);
AliHLTDimService(const char* type, void* data, int size, const char* servicename);
void Update();
void Update(const AliHLTDimServicePoint_t& sp);
AliHLTDimServiceDataType GetType() const {return fType;}
const char* GetTypeString() const { return fTypeString.Data(); }
void* GetLocation() {return fDataBuffer;}
int GetId() const {return fId;}
int SetId(int id) {fId=id;return id;}
void* GetDataBuffer() const { return fDataBuffer; }
int GetDataSize() const { return fDataSize; }
private:
AliHLTDimService(const AliHLTDimService&);
AliHLTDimService& operator = (const AliHLTDimService&);
AliHLTDimServicePoint_t fData;
AliHLTDimServiceDataType fType;
TString fTypeString;
void* fDataBuffer;
int fDataSize;
int fId;
};
class AliHLTDimServiceFloat : public AliHLTDimService {
public:
AliHLTDimServiceFloat();
~AliHLTDimServiceFloat();
void Update(float f) {
AliHLTDimServicePoint_t sp; sp.fVal=f; AliHLTDimService::Update(sp);
}
};
class AliHLTDimServiceInt : public AliHLTDimService {
public:
AliHLTDimServiceInt();
~AliHLTDimServiceInt();
void Update(int i) {
AliHLTDimServicePoint_t sp; sp.iVal=i; AliHLTDimService::Update(sp);
}
};
int RegisterService(AliHLTDimService* pService);
AliHLTDimService* CreateService(AliHLTDimServiceDataType type, const char* name);
TObjArray* CreateServiceGroup(AliHLTDimServiceDataType type, const char* basename, int count);
int UpdateServices();
int Init(const char* dimNameServer);
int Reset();
int Start();
int Stop();
protected:
enum AliHLTDimServerState_t {
kStateOff = 0,
kStateStarting,
kStateRunning,
kStateStopping,
kStateError
};
int SetState(int state) {fState=state; return fState;}
int GetState() const {return fState;}
typedef void (*fctVoid)();
typedef int (*fctDisServiceCallback)( const char*);
typedef int (*fctDisAddService) ( const char* service,
const char* type,
void* buffer,
int size,
fctDisServiceCallback cb,
long int tag);
typedef int (*fctDisRemoveService) ( unsigned int id);
typedef int (*fctDisUpdateService) ( unsigned int id);
typedef int (*fctDisCharArg) ( const char*);
typedef int (*fctDisNoArg) ( );
class AliHLTDimInterface : public AliHLTLogging {
public:
AliHLTDimInterface();
~AliHLTDimInterface();
int Init();
int DisAddService(const char* service, const char* type, void* buffer,
int size, fctDisServiceCallback cb, long int tag) const {
if (fpDisAddService) return (*fpDisAddService)(service, type, buffer, size, cb, tag);
return -ENODEV;
}
int DisAddService(const char* service, const char* type, void* buffer, int size) const {
if (fpDisAddService) return (*fpDisAddService)(service, type, buffer, size, NULL, 0);
return -ENODEV;
}
int DisRemoveService(unsigned int id) const {
if (fpDisRemoveService) return (*fpDisRemoveService)(id);
return -ENODEV;
}
int DisUpdateService(unsigned int id) const {
if (fpDisUpdateService) return (*fpDisUpdateService)(id);
return -ENODEV;
}
int DisStartServing(const char *server) const {
if (fpDisStartServing) return (*fpDisStartServing)(server);
return -ENODEV;
}
int DisStopServing() const {
if (fpDisStopServing) return (*fpDisStopServing)();
return -ENODEV;
}
int DisSetDnsNode(const char *server) const {
if (fpDisSetDnsNode) return (*fpDisSetDnsNode)(server);
return -ENODEV;
}
private:
fctVoid FindSymbol(const char* library, const char* symbol) const;
fctDisAddService fpDisAddService;
fctDisRemoveService fpDisRemoveService;
fctDisUpdateService fpDisUpdateService;
fctDisCharArg fpDisStartServing;
fctDisNoArg fpDisStopServing;
fctDisCharArg fpDisSetDnsNode;
static const char* fgkDimLibraryName ;
static const char* fgkDisAddServiceSymbol;
static const char* fgkDisRemoveServiceSymbol;
static const char* fgkDisUpdateServiceSymbol;
static const char* fgkDisStartServingSymbol;
static const char* fgkDisStopServingSymbol;
static const char* fgkDisSetDnsNodeSymbol;
};
static AliHLTDimInterface* Interface();
private:
AliHLTDimServer(const AliHLTDimServer&);
AliHLTDimServer& operator=(const AliHLTDimServer&);
static void* ServerLoop(void* param);
void* ServerLoop();
TObjArray fServices;
int fState;
TThread* fpServerThread;
int fUpdatePeriod;
static AliHLTDimInterface* fgpInterface;
ClassDef(AliHLTDimServer, 0)
};
#endif