ROOT logo
// $Id$

//**************************************************************************
//* This file is property of and copyright by the                          * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//*                                                                        *
//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
//*                  for The ALICE HLT Project.                            *
//*                                                                        *
//* Permission to use, copy, modify and distribute this software and its   *
//* documentation strictly for non-commercial purposes is hereby granted   *
//* without fee, provided that the above copyright notice appears in all   *
//* copies and that both the copyright notice and this permission notice   *
//* appear in the supporting documentation. The authors make no claims     *
//* about the suitability of this software for any purpose. It is          *
//* provided "as is" without express or implied warranty.                  *
//**************************************************************************

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

#include "AliHLTControlTask.h"
#include "AliHLTComponentHandler.h"
#include <cassert>

/** ROOT macro for the implementation of ROOT specific class methods */
ClassImp(AliHLTControlTask)

AliHLTControlTask::AliHLTControlTask()
  : AliHLTTask()
  , fBlocks()
  , fpData(NULL)
  , fSize(0)
{
  // constructor
  //
  // 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.
}

AliHLTControlTask::~AliHLTControlTask()
{
  // destructor
  ResetBlocks();
}

int AliHLTControlTask::CreateComponent(AliHLTConfiguration* /*pConf*/, AliHLTComponentHandler* pCH, AliHLTComponent*& pComponent) const
{
  // create component
  int iResult=0;
  if ((pComponent=new AliHLTControlEventComponent(this))) {
    const AliHLTAnalysisEnvironment* pEnv=pCH->GetEnvironment();
    const char* argv[]={
      "-disable-component-stat"
    };
    int argc=sizeof(argv)/sizeof(const char*);
    if ((iResult=pComponent->Init(pEnv, NULL, argc, argv))>=0) {
      //HLTDebug("component %s (%p) created", pComponent->GetComponentID(), pComponent); 
    } else {
      HLTError("Initialization of component \"%s\" failed with error %d", pComponent->GetComponentID(), iResult);
    }
    return iResult;
  }
  return -ENOMEM;
}

void AliHLTControlTask::SetBlocks(const AliHLTComponentBlockDataList& list)
{
  // see header file for class documentation
  fBlocks.assign(list.begin(), list.end());
  AliHLTComponentBlockDataList::iterator element=fBlocks.begin();
  for (;element!=fBlocks.end(); element++) fSize+=element->fSize;

  // allocate buffer for the payload of all blocks
  fpData=new AliHLTUInt8_t[fSize];
  AliHLTUInt8_t offset=0;

  // copy and redirect
  for (element=fBlocks.begin();element!=fBlocks.end(); element++) {
    memcpy(fpData+offset, element->fPtr, element->fSize);
    element->fPtr=fpData+offset;
    offset+=element->fSize;
  }
}

void AliHLTControlTask::ResetBlocks()
{
  // see header file for class documentation
  fBlocks.clear();
  if (fpData) delete [] fpData;
  fpData=NULL;
  fSize=0;
}

AliHLTControlTask::AliHLTControlEventComponent::AliHLTControlEventComponent(const AliHLTControlTask* pParent)
  :
  fpParent(pParent)
{
  // see header file for class documentation
  assert(pParent);
}

AliHLTControlTask::AliHLTControlEventComponent::~AliHLTControlEventComponent()
{
  // see header file for class documentation
}

AliHLTComponentDataType AliHLTControlTask::AliHLTControlEventComponent::GetOutputDataType()
{
  // see header file for class documentation
  return kAliHLTMultipleDataType;
}

int AliHLTControlTask::AliHLTControlEventComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
{
  // see header file for class documentation
  tgtList.clear();
  tgtList.push_back(kAliHLTDataTypeSOR);
  tgtList.push_back(kAliHLTDataTypeEOR);
  return tgtList.size();
}

void AliHLTControlTask::AliHLTControlEventComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
{
  // see header file for class documentation
  if (fpParent && fpParent->fSize>0) constBase=fpParent->fSize;
  else constBase=0;
  inputMultiplier=0;
}

int AliHLTControlTask::AliHLTControlEventComponent::GetEvent(const AliHLTComponentEventData& /*evtData*/,
							     AliHLTComponentTriggerData& /*trigData*/,
							     AliHLTUInt8_t* outputPtr, 
							     AliHLTUInt32_t& size,
							     vector<AliHLTComponentBlockData>& outputBlocks )
{
  // see header file for class documentation
  if (!fpParent) return -ENODEV;
  const AliHLTControlTask* pParent=fpParent;

  AliHLTUInt32_t capacity=size;
  size=0;
  if (capacity<pParent->fSize) {
    return -ENOSPC;
  }

  // return if no event has been set
  if (pParent->fpData==NULL ||
      pParent->fBlocks.size()==0) {
    //HLTInfo("no control event to send");
    return 0;
  }

  for (unsigned int i=0; i<pParent->fBlocks.size(); i++) {
    HLTDebug("publishing control block %s", DataType2Text(pParent->fBlocks[i].fDataType).c_str());
    memcpy(outputPtr+size, pParent->fBlocks[i].fPtr, pParent->fBlocks[i].fSize);
    AliHLTComponentBlockData bd;
    FillBlockData(bd);
    bd.fOffset=size;
    bd.fSize=pParent->fBlocks[i].fSize;
    bd.fDataType=pParent->fBlocks[i].fDataType;
    bd.fSpecification=pParent->fBlocks[i].fSpecification;
    outputBlocks.push_back( bd );
    size+=bd.fSize;
  }

  return size;
}
 AliHLTControlTask.cxx:1
 AliHLTControlTask.cxx:2
 AliHLTControlTask.cxx:3
 AliHLTControlTask.cxx:4
 AliHLTControlTask.cxx:5
 AliHLTControlTask.cxx:6
 AliHLTControlTask.cxx:7
 AliHLTControlTask.cxx:8
 AliHLTControlTask.cxx:9
 AliHLTControlTask.cxx:10
 AliHLTControlTask.cxx:11
 AliHLTControlTask.cxx:12
 AliHLTControlTask.cxx:13
 AliHLTControlTask.cxx:14
 AliHLTControlTask.cxx:15
 AliHLTControlTask.cxx:16
 AliHLTControlTask.cxx:17
 AliHLTControlTask.cxx:18
 AliHLTControlTask.cxx:19
 AliHLTControlTask.cxx:20
 AliHLTControlTask.cxx:21
 AliHLTControlTask.cxx:22
 AliHLTControlTask.cxx:23
 AliHLTControlTask.cxx:24
 AliHLTControlTask.cxx:25
 AliHLTControlTask.cxx:26
 AliHLTControlTask.cxx:27
 AliHLTControlTask.cxx:28
 AliHLTControlTask.cxx:29
 AliHLTControlTask.cxx:30
 AliHLTControlTask.cxx:31
 AliHLTControlTask.cxx:32
 AliHLTControlTask.cxx:33
 AliHLTControlTask.cxx:34
 AliHLTControlTask.cxx:35
 AliHLTControlTask.cxx:36
 AliHLTControlTask.cxx:37
 AliHLTControlTask.cxx:38
 AliHLTControlTask.cxx:39
 AliHLTControlTask.cxx:40
 AliHLTControlTask.cxx:41
 AliHLTControlTask.cxx:42
 AliHLTControlTask.cxx:43
 AliHLTControlTask.cxx:44
 AliHLTControlTask.cxx:45
 AliHLTControlTask.cxx:46
 AliHLTControlTask.cxx:47
 AliHLTControlTask.cxx:48
 AliHLTControlTask.cxx:49
 AliHLTControlTask.cxx:50
 AliHLTControlTask.cxx:51
 AliHLTControlTask.cxx:52
 AliHLTControlTask.cxx:53
 AliHLTControlTask.cxx:54
 AliHLTControlTask.cxx:55
 AliHLTControlTask.cxx:56
 AliHLTControlTask.cxx:57
 AliHLTControlTask.cxx:58
 AliHLTControlTask.cxx:59
 AliHLTControlTask.cxx:60
 AliHLTControlTask.cxx:61
 AliHLTControlTask.cxx:62
 AliHLTControlTask.cxx:63
 AliHLTControlTask.cxx:64
 AliHLTControlTask.cxx:65
 AliHLTControlTask.cxx:66
 AliHLTControlTask.cxx:67
 AliHLTControlTask.cxx:68
 AliHLTControlTask.cxx:69
 AliHLTControlTask.cxx:70
 AliHLTControlTask.cxx:71
 AliHLTControlTask.cxx:72
 AliHLTControlTask.cxx:73
 AliHLTControlTask.cxx:74
 AliHLTControlTask.cxx:75
 AliHLTControlTask.cxx:76
 AliHLTControlTask.cxx:77
 AliHLTControlTask.cxx:78
 AliHLTControlTask.cxx:79
 AliHLTControlTask.cxx:80
 AliHLTControlTask.cxx:81
 AliHLTControlTask.cxx:82
 AliHLTControlTask.cxx:83
 AliHLTControlTask.cxx:84
 AliHLTControlTask.cxx:85
 AliHLTControlTask.cxx:86
 AliHLTControlTask.cxx:87
 AliHLTControlTask.cxx:88
 AliHLTControlTask.cxx:89
 AliHLTControlTask.cxx:90
 AliHLTControlTask.cxx:91
 AliHLTControlTask.cxx:92
 AliHLTControlTask.cxx:93
 AliHLTControlTask.cxx:94
 AliHLTControlTask.cxx:95
 AliHLTControlTask.cxx:96
 AliHLTControlTask.cxx:97
 AliHLTControlTask.cxx:98
 AliHLTControlTask.cxx:99
 AliHLTControlTask.cxx:100
 AliHLTControlTask.cxx:101
 AliHLTControlTask.cxx:102
 AliHLTControlTask.cxx:103
 AliHLTControlTask.cxx:104
 AliHLTControlTask.cxx:105
 AliHLTControlTask.cxx:106
 AliHLTControlTask.cxx:107
 AliHLTControlTask.cxx:108
 AliHLTControlTask.cxx:109
 AliHLTControlTask.cxx:110
 AliHLTControlTask.cxx:111
 AliHLTControlTask.cxx:112
 AliHLTControlTask.cxx:113
 AliHLTControlTask.cxx:114
 AliHLTControlTask.cxx:115
 AliHLTControlTask.cxx:116
 AliHLTControlTask.cxx:117
 AliHLTControlTask.cxx:118
 AliHLTControlTask.cxx:119
 AliHLTControlTask.cxx:120
 AliHLTControlTask.cxx:121
 AliHLTControlTask.cxx:122
 AliHLTControlTask.cxx:123
 AliHLTControlTask.cxx:124
 AliHLTControlTask.cxx:125
 AliHLTControlTask.cxx:126
 AliHLTControlTask.cxx:127
 AliHLTControlTask.cxx:128
 AliHLTControlTask.cxx:129
 AliHLTControlTask.cxx:130
 AliHLTControlTask.cxx:131
 AliHLTControlTask.cxx:132
 AliHLTControlTask.cxx:133
 AliHLTControlTask.cxx:134
 AliHLTControlTask.cxx:135
 AliHLTControlTask.cxx:136
 AliHLTControlTask.cxx:137
 AliHLTControlTask.cxx:138
 AliHLTControlTask.cxx:139
 AliHLTControlTask.cxx:140
 AliHLTControlTask.cxx:141
 AliHLTControlTask.cxx:142
 AliHLTControlTask.cxx:143
 AliHLTControlTask.cxx:144
 AliHLTControlTask.cxx:145
 AliHLTControlTask.cxx:146
 AliHLTControlTask.cxx:147
 AliHLTControlTask.cxx:148
 AliHLTControlTask.cxx:149
 AliHLTControlTask.cxx:150
 AliHLTControlTask.cxx:151
 AliHLTControlTask.cxx:152
 AliHLTControlTask.cxx:153
 AliHLTControlTask.cxx:154
 AliHLTControlTask.cxx:155
 AliHLTControlTask.cxx:156
 AliHLTControlTask.cxx:157
 AliHLTControlTask.cxx:158
 AliHLTControlTask.cxx:159
 AliHLTControlTask.cxx:160
 AliHLTControlTask.cxx:161
 AliHLTControlTask.cxx:162
 AliHLTControlTask.cxx:163
 AliHLTControlTask.cxx:164
 AliHLTControlTask.cxx:165
 AliHLTControlTask.cxx:166
 AliHLTControlTask.cxx:167
 AliHLTControlTask.cxx:168
 AliHLTControlTask.cxx:169
 AliHLTControlTask.cxx:170
 AliHLTControlTask.cxx:171
 AliHLTControlTask.cxx:172