ROOT logo
//-*- Mode: C++ -*-
// $Id$

#ifndef ALIHLTDIMSERVER_H
#define ALIHLTDIMSERVER_H

//* This file is property of and copyright by the ALICE HLT Project        * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//* See cxx source for full Copyright notice                               *

//  @file   AliHLTDimServer.h
//  @author Matthias Richter
//  @date   20010-03-10
//  @brief  HLT DIM server implementation and dynamic access
//          to DIM library

#include "AliHLTLogging.h"
#include "TNamed.h"
#include "TObjArray.h"

class TThread;

/**
 * @class AliHLTDimServer
 * Implementation of a DIM server for HLT and the dynamic access to the
 * DIM  library.
 */
class AliHLTDimServer : public TNamed {
public:
  AliHLTDimServer();
  AliHLTDimServer(const char* servername);
  ~AliHLTDimServer();

  /// Data type identifiers for services.
  enum AliHLTDimServiceDataType{
    kDataTypeUnknown = 0, /// initializer
    kDataTypeCustom,      /// Custom format maintained by the user.
    kDataTypeInt,         /// Integer type
    kDataTypeFloat,       /// Float type
    kDataTypeString,      /// String type
  };

  /// The service data field.
  struct AliHLTDimServicePoint_t {
    union {
      int iVal;     /// integer value
      float fVal;   /// float value
      void* strVal; /// string value, casted to string* before use
    };
  };

  /** @class AliHLTDimService
   * Base class for DIM services
   */
  class AliHLTDimService : public TNamed {
  public:
    AliHLTDimService();
    
    /**
     * Create a new service with a particular predefined type and name.
     * \param type  The type of the service
     * \param servicename  The name of the service.
     */
    AliHLTDimService(AliHLTDimServiceDataType type, const char* servicename);
    
    /**
     * Create a new service with a particular custom type.
     * \param type  The type of the service as a string.
     *      The format parameter specifies the contents of the structure in the
     *      form T:N[;T:N]*[;T] where T is the item type: (I)nteger, (C)arachter,
     *      (L)ong, (S)hort, (F)loat, (D)ouble, X(tra long) and N is the number
     *      of such items. The type alone at the end means all following items
     *      are of the same type. Example: "I:3;F:2;C" means 3 Integers, 2 Floats
     *      and Characters until the end. The format parameter is used for
     *      communicating between different platforms.
     * \param data  Points to a buffer maintained by the user which stores the
     *      data to publish. This buffer must exist as long as the DIM service
     *      is registered and active.
     * \param size  The size of the data structure pointed to by data.
     * \param servicename  The name of the service.
     */
    AliHLTDimService(const char* type, void* data, int size, const char* servicename);
    
    /**
     * Updates the DIM data point for custom data structures.
     * i.e. This method should be used if the service was created with:
     * AliHLTDimService(const char* type, void* data, int size, const char* servicename)
     */
    void Update();
    
    /**
     * Updates the DIM data point.
     * This method should be used if the service was created with:
     * AliHLTDimService(AliHLTDimServiceDataType type, const char* servicename)
     * \param sp  The new data point to publish via DIM.
     */
    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:
          
    // Do not allow copying of this class
    AliHLTDimService(const AliHLTDimService&);
    AliHLTDimService& operator = (const AliHLTDimService&);
          
    AliHLTDimServicePoint_t fData; /// the data point
    AliHLTDimServiceDataType fType; /// type of this service
    TString fTypeString;  /// The string representing the service type.
    void* fDataBuffer;  /// Pointer to the data buffer.
    int fDataSize;  /// The size of the data buffer.
    int fId; /// id of the service
  };

  /** @class AliHLTDimServiceFloat
   * DIM service for a float value
   */
  class AliHLTDimServiceFloat : public AliHLTDimService {
  public:
    AliHLTDimServiceFloat();
    ~AliHLTDimServiceFloat();

    void Update(float f) {
      AliHLTDimServicePoint_t sp; sp.fVal=f; AliHLTDimService::Update(sp);
    }
  };

  /** @class AliHLTDimServiceInt
   * DIM service for a int value
   */
  class AliHLTDimServiceInt : public AliHLTDimService {
  public:
    AliHLTDimServiceInt();
    ~AliHLTDimServiceInt();

    void Update(int i) {
      AliHLTDimServicePoint_t sp; sp.iVal=i; AliHLTDimService::Update(sp);
    }
  };

  /**
   * Register a service.
   * @param pService    the service to be registered
   */
  int RegisterService(AliHLTDimService* pService);

  /**
   * Create a service.
   * @param type        type of the channel, see @ref ceServiceDataType
   * @param name        unique name of the service
   * @return dim service object, needs to be cleaned by the caller
   */
  AliHLTDimService* CreateService(AliHLTDimServiceDataType type, const char* name);

  /**
   * Create a group of services.
   * The names are built from the basename and the number of services.
   * @param type        type of the channel
   * @param basename    base name of the services, the name might contain a '%d' sequence which is then
   *                    replaced by the number, number is appended if no '%d' provided
   * @param count       number of services in this group, passed to the <i>update</i> and <i>set</i> function as parameter major
   * @return            TObjArray of AliHLTDimService objects, the array needs to be cleaned by the caller
   */
  TObjArray* CreateServiceGroup(AliHLTDimServiceDataType type, const char* basename, int count);

  /// Update all services via the Dim channel
  int UpdateServices();

  /// init the server
  /// load the dim library and function pointers
  /// init dim (DNS and server name)
  int Init(const char* dimNameServer);

  /// Reset
  int Reset();

  /// start the server
  int Start();

  /// stop the server
  int Stop();

protected:
  enum AliHLTDimServerState_t {
    // server is not started
    kStateOff = 0,
    // starting, will be changed by the server thread to kStateRunning
    kStateStarting,
    // server running
    kStateRunning,
    // set by the main thread and changed by the server thread before it terminates
    kStateStopping,
    // error
    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
   * Interface to the dim library
   */
  class AliHLTDimInterface : public AliHLTLogging {
  public:
    AliHLTDimInterface();
    ~AliHLTDimInterface();

    /// load the dim library and function pointers
    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;      //! transient
    fctDisRemoveService   fpDisRemoveService;   //! transient
    fctDisUpdateService   fpDisUpdateService;   //! transient
    fctDisCharArg         fpDisStartServing;    //! transient
    fctDisNoArg           fpDisStopServing;     //! transient
    fctDisCharArg         fpDisSetDnsNode;      //! transient
    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:
  /// copy constructor not permitted
  AliHLTDimServer(const AliHLTDimServer&);
  /// assignment operator not permitted
  AliHLTDimServer& operator=(const AliHLTDimServer&);

  /// entry point for the thread, param is pointer to object
  static void* ServerLoop(void* param);

  /// the server loop
  void* ServerLoop();

  TObjArray fServices; //! list of services
  int fState; //! state of the server
  TThread* fpServerThread; //! thread
  int fUpdatePeriod; //! update period for the DIM loop in ms

  static AliHLTDimInterface* fgpInterface; //! the dim interface

  ClassDef(AliHLTDimServer, 0)
};
#endif
 AliHLTDimServer.h:1
 AliHLTDimServer.h:2
 AliHLTDimServer.h:3
 AliHLTDimServer.h:4
 AliHLTDimServer.h:5
 AliHLTDimServer.h:6
 AliHLTDimServer.h:7
 AliHLTDimServer.h:8
 AliHLTDimServer.h:9
 AliHLTDimServer.h:10
 AliHLTDimServer.h:11
 AliHLTDimServer.h:12
 AliHLTDimServer.h:13
 AliHLTDimServer.h:14
 AliHLTDimServer.h:15
 AliHLTDimServer.h:16
 AliHLTDimServer.h:17
 AliHLTDimServer.h:18
 AliHLTDimServer.h:19
 AliHLTDimServer.h:20
 AliHLTDimServer.h:21
 AliHLTDimServer.h:22
 AliHLTDimServer.h:23
 AliHLTDimServer.h:24
 AliHLTDimServer.h:25
 AliHLTDimServer.h:26
 AliHLTDimServer.h:27
 AliHLTDimServer.h:28
 AliHLTDimServer.h:29
 AliHLTDimServer.h:30
 AliHLTDimServer.h:31
 AliHLTDimServer.h:32
 AliHLTDimServer.h:33
 AliHLTDimServer.h:34
 AliHLTDimServer.h:35
 AliHLTDimServer.h:36
 AliHLTDimServer.h:37
 AliHLTDimServer.h:38
 AliHLTDimServer.h:39
 AliHLTDimServer.h:40
 AliHLTDimServer.h:41
 AliHLTDimServer.h:42
 AliHLTDimServer.h:43
 AliHLTDimServer.h:44
 AliHLTDimServer.h:45
 AliHLTDimServer.h:46
 AliHLTDimServer.h:47
 AliHLTDimServer.h:48
 AliHLTDimServer.h:49
 AliHLTDimServer.h:50
 AliHLTDimServer.h:51
 AliHLTDimServer.h:52
 AliHLTDimServer.h:53
 AliHLTDimServer.h:54
 AliHLTDimServer.h:55
 AliHLTDimServer.h:56
 AliHLTDimServer.h:57
 AliHLTDimServer.h:58
 AliHLTDimServer.h:59
 AliHLTDimServer.h:60
 AliHLTDimServer.h:61
 AliHLTDimServer.h:62
 AliHLTDimServer.h:63
 AliHLTDimServer.h:64
 AliHLTDimServer.h:65
 AliHLTDimServer.h:66
 AliHLTDimServer.h:67
 AliHLTDimServer.h:68
 AliHLTDimServer.h:69
 AliHLTDimServer.h:70
 AliHLTDimServer.h:71
 AliHLTDimServer.h:72
 AliHLTDimServer.h:73
 AliHLTDimServer.h:74
 AliHLTDimServer.h:75
 AliHLTDimServer.h:76
 AliHLTDimServer.h:77
 AliHLTDimServer.h:78
 AliHLTDimServer.h:79
 AliHLTDimServer.h:80
 AliHLTDimServer.h:81
 AliHLTDimServer.h:82
 AliHLTDimServer.h:83
 AliHLTDimServer.h:84
 AliHLTDimServer.h:85
 AliHLTDimServer.h:86
 AliHLTDimServer.h:87
 AliHLTDimServer.h:88
 AliHLTDimServer.h:89
 AliHLTDimServer.h:90
 AliHLTDimServer.h:91
 AliHLTDimServer.h:92
 AliHLTDimServer.h:93
 AliHLTDimServer.h:94
 AliHLTDimServer.h:95
 AliHLTDimServer.h:96
 AliHLTDimServer.h:97
 AliHLTDimServer.h:98
 AliHLTDimServer.h:99
 AliHLTDimServer.h:100
 AliHLTDimServer.h:101
 AliHLTDimServer.h:102
 AliHLTDimServer.h:103
 AliHLTDimServer.h:104
 AliHLTDimServer.h:105
 AliHLTDimServer.h:106
 AliHLTDimServer.h:107
 AliHLTDimServer.h:108
 AliHLTDimServer.h:109
 AliHLTDimServer.h:110
 AliHLTDimServer.h:111
 AliHLTDimServer.h:112
 AliHLTDimServer.h:113
 AliHLTDimServer.h:114
 AliHLTDimServer.h:115
 AliHLTDimServer.h:116
 AliHLTDimServer.h:117
 AliHLTDimServer.h:118
 AliHLTDimServer.h:119
 AliHLTDimServer.h:120
 AliHLTDimServer.h:121
 AliHLTDimServer.h:122
 AliHLTDimServer.h:123
 AliHLTDimServer.h:124
 AliHLTDimServer.h:125
 AliHLTDimServer.h:126
 AliHLTDimServer.h:127
 AliHLTDimServer.h:128
 AliHLTDimServer.h:129
 AliHLTDimServer.h:130
 AliHLTDimServer.h:131
 AliHLTDimServer.h:132
 AliHLTDimServer.h:133
 AliHLTDimServer.h:134
 AliHLTDimServer.h:135
 AliHLTDimServer.h:136
 AliHLTDimServer.h:137
 AliHLTDimServer.h:138
 AliHLTDimServer.h:139
 AliHLTDimServer.h:140
 AliHLTDimServer.h:141
 AliHLTDimServer.h:142
 AliHLTDimServer.h:143
 AliHLTDimServer.h:144
 AliHLTDimServer.h:145
 AliHLTDimServer.h:146
 AliHLTDimServer.h:147
 AliHLTDimServer.h:148
 AliHLTDimServer.h:149
 AliHLTDimServer.h:150
 AliHLTDimServer.h:151
 AliHLTDimServer.h:152
 AliHLTDimServer.h:153
 AliHLTDimServer.h:154
 AliHLTDimServer.h:155
 AliHLTDimServer.h:156
 AliHLTDimServer.h:157
 AliHLTDimServer.h:158
 AliHLTDimServer.h:159
 AliHLTDimServer.h:160
 AliHLTDimServer.h:161
 AliHLTDimServer.h:162
 AliHLTDimServer.h:163
 AliHLTDimServer.h:164
 AliHLTDimServer.h:165
 AliHLTDimServer.h:166
 AliHLTDimServer.h:167
 AliHLTDimServer.h:168
 AliHLTDimServer.h:169
 AliHLTDimServer.h:170
 AliHLTDimServer.h:171
 AliHLTDimServer.h:172
 AliHLTDimServer.h:173
 AliHLTDimServer.h:174
 AliHLTDimServer.h:175
 AliHLTDimServer.h:176
 AliHLTDimServer.h:177
 AliHLTDimServer.h:178
 AliHLTDimServer.h:179
 AliHLTDimServer.h:180
 AliHLTDimServer.h:181
 AliHLTDimServer.h:182
 AliHLTDimServer.h:183
 AliHLTDimServer.h:184
 AliHLTDimServer.h:185
 AliHLTDimServer.h:186
 AliHLTDimServer.h:187
 AliHLTDimServer.h:188
 AliHLTDimServer.h:189
 AliHLTDimServer.h:190
 AliHLTDimServer.h:191
 AliHLTDimServer.h:192
 AliHLTDimServer.h:193
 AliHLTDimServer.h:194
 AliHLTDimServer.h:195
 AliHLTDimServer.h:196
 AliHLTDimServer.h:197
 AliHLTDimServer.h:198
 AliHLTDimServer.h:199
 AliHLTDimServer.h:200
 AliHLTDimServer.h:201
 AliHLTDimServer.h:202
 AliHLTDimServer.h:203
 AliHLTDimServer.h:204
 AliHLTDimServer.h:205
 AliHLTDimServer.h:206
 AliHLTDimServer.h:207
 AliHLTDimServer.h:208
 AliHLTDimServer.h:209
 AliHLTDimServer.h:210
 AliHLTDimServer.h:211
 AliHLTDimServer.h:212
 AliHLTDimServer.h:213
 AliHLTDimServer.h:214
 AliHLTDimServer.h:215
 AliHLTDimServer.h:216
 AliHLTDimServer.h:217
 AliHLTDimServer.h:218
 AliHLTDimServer.h:219
 AliHLTDimServer.h:220
 AliHLTDimServer.h:221
 AliHLTDimServer.h:222
 AliHLTDimServer.h:223
 AliHLTDimServer.h:224
 AliHLTDimServer.h:225
 AliHLTDimServer.h:226
 AliHLTDimServer.h:227
 AliHLTDimServer.h:228
 AliHLTDimServer.h:229
 AliHLTDimServer.h:230
 AliHLTDimServer.h:231
 AliHLTDimServer.h:232
 AliHLTDimServer.h:233
 AliHLTDimServer.h:234
 AliHLTDimServer.h:235
 AliHLTDimServer.h:236
 AliHLTDimServer.h:237
 AliHLTDimServer.h:238
 AliHLTDimServer.h:239
 AliHLTDimServer.h:240
 AliHLTDimServer.h:241
 AliHLTDimServer.h:242
 AliHLTDimServer.h:243
 AliHLTDimServer.h:244
 AliHLTDimServer.h:245
 AliHLTDimServer.h:246
 AliHLTDimServer.h:247
 AliHLTDimServer.h:248
 AliHLTDimServer.h:249
 AliHLTDimServer.h:250
 AliHLTDimServer.h:251
 AliHLTDimServer.h:252
 AliHLTDimServer.h:253
 AliHLTDimServer.h:254
 AliHLTDimServer.h:255
 AliHLTDimServer.h:256
 AliHLTDimServer.h:257
 AliHLTDimServer.h:258
 AliHLTDimServer.h:259
 AliHLTDimServer.h:260
 AliHLTDimServer.h:261
 AliHLTDimServer.h:262
 AliHLTDimServer.h:263
 AliHLTDimServer.h:264
 AliHLTDimServer.h:265
 AliHLTDimServer.h:266
 AliHLTDimServer.h:267
 AliHLTDimServer.h:268
 AliHLTDimServer.h:269
 AliHLTDimServer.h:270
 AliHLTDimServer.h:271
 AliHLTDimServer.h:272
 AliHLTDimServer.h:273
 AliHLTDimServer.h:274
 AliHLTDimServer.h:275
 AliHLTDimServer.h:276
 AliHLTDimServer.h:277
 AliHLTDimServer.h:278
 AliHLTDimServer.h:279
 AliHLTDimServer.h:280
 AliHLTDimServer.h:281
 AliHLTDimServer.h:282
 AliHLTDimServer.h:283
 AliHLTDimServer.h:284
 AliHLTDimServer.h:285
 AliHLTDimServer.h:286
 AliHLTDimServer.h:287
 AliHLTDimServer.h:288
 AliHLTDimServer.h:289
 AliHLTDimServer.h:290
 AliHLTDimServer.h:291
 AliHLTDimServer.h:292
 AliHLTDimServer.h:293
 AliHLTDimServer.h:294
 AliHLTDimServer.h:295
 AliHLTDimServer.h:296
 AliHLTDimServer.h:297
 AliHLTDimServer.h:298
 AliHLTDimServer.h:299
 AliHLTDimServer.h:300
 AliHLTDimServer.h:301
 AliHLTDimServer.h:302
 AliHLTDimServer.h:303
 AliHLTDimServer.h:304
 AliHLTDimServer.h:305
 AliHLTDimServer.h:306
 AliHLTDimServer.h:307
 AliHLTDimServer.h:308
 AliHLTDimServer.h:309