ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTCONTROLTASK_H
#define ALIHLTCONTROLTASK_H
//* This file is property of and copyright by the                          * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//* See cxx source for full Copyright notice                               *

/// @file   AliHLTControlTask.h
/// @author Matthias Richter
/// @date   
/// @brief  Special task to produce the control events.
///

#include "AliHLTTask.h"
#include "AliHLTDataSource.h"

class AliHLTComponentHandler;
class AliHLTConfiguration;

/**
 * @class AliHLTControlTask
 * This task is automatically added to the beginning of each chain and
 * produces the special steering events. The first component in every
 * branch get the special events from the task.
 *
 * This task gets initialized with data type, specification and payload
 * of the control event to be sent. It produces the data block if data
 * type differs from fAliHLTVoidDataType. The guard class can be used to
 * set the parameters.
 * <pre>
 * AliHLTControlEventGuard(task, kAliHLTDataTypeSOR, 0, payload, size);
 * </pre>
 *
 * @ingroup alihlt_system
 */
class AliHLTControlTask : public AliHLTTask {
 public:
  /** constructor */
  AliHLTControlTask();
  /** standard destructor */
  virtual ~AliHLTControlTask();

  // AliHLTTask interface function
  int CreateComponent(AliHLTConfiguration* pConf, AliHLTComponentHandler* pCH, AliHLTComponent*& pComponent) const;

  class AliHLTControlEventGuard {
  public:
    AliHLTControlEventGuard(AliHLTControlTask* me, AliHLTComponentBlockDataList& list) :
      fTask(me) {
      if (!fTask) return;
      fTask->SetBlocks(list); 
    }
    ~AliHLTControlEventGuard() {
      if (!fTask) return;
      fTask->ResetBlocks();
    }

  private:
      /** standard constructor prohibited */
      AliHLTControlEventGuard();
      /** copy constructor prohibited */
      AliHLTControlEventGuard(const AliHLTControlEventGuard&);
      /** assignment operator prohibited */
      AliHLTControlEventGuard& operator=(const AliHLTControlEventGuard&);

      /** by the guard controlled task */
      AliHLTControlTask* fTask; //! transient
  };

  /**
   * Source component producing the data blocks
   */
  class AliHLTControlEventComponent : public AliHLTDataSource {
  public:
    AliHLTControlEventComponent(const AliHLTControlTask* pParent);
    ~AliHLTControlEventComponent();

    // AliHLTComponent interface functions
    const char* GetComponentID() {return "__priv_AliHLTControlTask";}
    AliHLTComponentDataType GetOutputDataType();
    int GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList);
    void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
    AliHLTComponent* Spawn() {return NULL;}

  private:
    /** standard constructor prohibited */
    AliHLTControlEventComponent();
    /** copy constructor prohibited */
    AliHLTControlEventComponent(const AliHLTControlEventComponent&);
    /** assignment operator prohibited */
    AliHLTControlEventComponent& operator=(const AliHLTControlEventComponent&);

    // AliHLTDataSource interface function
    int GetEvent(const AliHLTComponentEventData& evtData,
		 AliHLTComponentTriggerData& trigData,
		 AliHLTUInt8_t* outputPtr, 
		 AliHLTUInt32_t& size,
		 vector<AliHLTComponentBlockData>& outputBlocks );

    const AliHLTControlTask* fpParent; //! transient
  };

 protected:
  /// to be used from the guard
  void SetBlocks(const AliHLTComponentBlockDataList& list);
  /// to be used from the guard
  void ResetBlocks();

 private:
  /** copy constructor prohibited */
  AliHLTControlTask(const AliHLTControlTask&);
  /** assignment operator prohibited */
  AliHLTControlTask& operator=(const AliHLTControlTask&);

  /** list of control blocks */
  AliHLTComponentBlockDataList fBlocks; //! transient
  /** payload buffer for all control blocks */
  AliHLTUInt8_t* fpData; //! transient
  /** payload size */
  AliHLTUInt32_t fSize; //!transient

  ClassDef(AliHLTControlTask, 0)
};
#endif
 AliHLTControlTask.h:1
 AliHLTControlTask.h:2
 AliHLTControlTask.h:3
 AliHLTControlTask.h:4
 AliHLTControlTask.h:5
 AliHLTControlTask.h:6
 AliHLTControlTask.h:7
 AliHLTControlTask.h:8
 AliHLTControlTask.h:9
 AliHLTControlTask.h:10
 AliHLTControlTask.h:11
 AliHLTControlTask.h:12
 AliHLTControlTask.h:13
 AliHLTControlTask.h:14
 AliHLTControlTask.h:15
 AliHLTControlTask.h:16
 AliHLTControlTask.h:17
 AliHLTControlTask.h:18
 AliHLTControlTask.h:19
 AliHLTControlTask.h:20
 AliHLTControlTask.h:21
 AliHLTControlTask.h:22
 AliHLTControlTask.h:23
 AliHLTControlTask.h:24
 AliHLTControlTask.h:25
 AliHLTControlTask.h:26
 AliHLTControlTask.h:27
 AliHLTControlTask.h:28
 AliHLTControlTask.h:29
 AliHLTControlTask.h:30
 AliHLTControlTask.h:31
 AliHLTControlTask.h:32
 AliHLTControlTask.h:33
 AliHLTControlTask.h:34
 AliHLTControlTask.h:35
 AliHLTControlTask.h:36
 AliHLTControlTask.h:37
 AliHLTControlTask.h:38
 AliHLTControlTask.h:39
 AliHLTControlTask.h:40
 AliHLTControlTask.h:41
 AliHLTControlTask.h:42
 AliHLTControlTask.h:43
 AliHLTControlTask.h:44
 AliHLTControlTask.h:45
 AliHLTControlTask.h:46
 AliHLTControlTask.h:47
 AliHLTControlTask.h:48
 AliHLTControlTask.h:49
 AliHLTControlTask.h:50
 AliHLTControlTask.h:51
 AliHLTControlTask.h:52
 AliHLTControlTask.h:53
 AliHLTControlTask.h:54
 AliHLTControlTask.h:55
 AliHLTControlTask.h:56
 AliHLTControlTask.h:57
 AliHLTControlTask.h:58
 AliHLTControlTask.h:59
 AliHLTControlTask.h:60
 AliHLTControlTask.h:61
 AliHLTControlTask.h:62
 AliHLTControlTask.h:63
 AliHLTControlTask.h:64
 AliHLTControlTask.h:65
 AliHLTControlTask.h:66
 AliHLTControlTask.h:67
 AliHLTControlTask.h:68
 AliHLTControlTask.h:69
 AliHLTControlTask.h:70
 AliHLTControlTask.h:71
 AliHLTControlTask.h:72
 AliHLTControlTask.h:73
 AliHLTControlTask.h:74
 AliHLTControlTask.h:75
 AliHLTControlTask.h:76
 AliHLTControlTask.h:77
 AliHLTControlTask.h:78
 AliHLTControlTask.h:79
 AliHLTControlTask.h:80
 AliHLTControlTask.h:81
 AliHLTControlTask.h:82
 AliHLTControlTask.h:83
 AliHLTControlTask.h:84
 AliHLTControlTask.h:85
 AliHLTControlTask.h:86
 AliHLTControlTask.h:87
 AliHLTControlTask.h:88
 AliHLTControlTask.h:89
 AliHLTControlTask.h:90
 AliHLTControlTask.h:91
 AliHLTControlTask.h:92
 AliHLTControlTask.h:93
 AliHLTControlTask.h:94
 AliHLTControlTask.h:95
 AliHLTControlTask.h:96
 AliHLTControlTask.h:97
 AliHLTControlTask.h:98
 AliHLTControlTask.h:99
 AliHLTControlTask.h:100
 AliHLTControlTask.h:101
 AliHLTControlTask.h:102
 AliHLTControlTask.h:103
 AliHLTControlTask.h:104
 AliHLTControlTask.h:105
 AliHLTControlTask.h:106
 AliHLTControlTask.h:107
 AliHLTControlTask.h:108
 AliHLTControlTask.h:109
 AliHLTControlTask.h:110
 AliHLTControlTask.h:111
 AliHLTControlTask.h:112
 AliHLTControlTask.h:113
 AliHLTControlTask.h:114
 AliHLTControlTask.h:115
 AliHLTControlTask.h:116
 AliHLTControlTask.h:117
 AliHLTControlTask.h:118
 AliHLTControlTask.h:119
 AliHLTControlTask.h:120
 AliHLTControlTask.h:121
 AliHLTControlTask.h:122
 AliHLTControlTask.h:123
 AliHLTControlTask.h:124
 AliHLTControlTask.h:125