--- /dev/null
+// $Id$
+
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project *
+//* 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()
+ :
+ fEvent(kAliHLTVoidDataType),
+ fSpecification(kAliHLTVoidDataSpec),
+ fpData(NULL),
+ fSize(0)
+{
+ // see header file for class documentation
+ // or
+ // refer to README to build package
+ // or
+ // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+}
+
+AliHLTControlTask::~AliHLTControlTask()
+{
+ // see header file for class documentation
+}
+
+int AliHLTControlTask::CreateComponent(AliHLTConfiguration* /*pConf*/, AliHLTComponentHandler* pCH, AliHLTComponent*& pComponent) const
+{
+ // see header file for class documentation
+ int iResult=0;
+ if ((pComponent=new AliHLTControlEventComponent(this))) {
+ const AliHLTAnalysisEnvironment* pEnv=pCH->GetEnvironment();
+ if ((iResult=pComponent->Init(pEnv, NULL, 0, NULL))>=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;
+}
+
+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=sizeof(AliHLTRunDesc);
+ 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;
+ if (size<pParent->fSize) {
+ return -ENOSPC;
+ }
+
+ if (pParent->fpData && pParent->fSize) {
+ memcpy(outputPtr, pParent->fpData, pParent->fSize);
+ }
+
+ // return if no event has been set
+ if (pParent->fEvent==kAliHLTVoidDataType) {
+ HLTInfo("no control event to send");
+ return 0;
+ }
+
+ HLTInfo("publishing control event %s", DataType2Text(pParent->fEvent).c_str());
+ AliHLTComponentBlockData bd;
+ FillBlockData(bd);
+ bd.fOffset=0;
+ bd.fSize=pParent->fSize;
+ bd.fDataType=pParent->fEvent;
+ bd.fSpecification=pParent->fSpecification;
+ outputBlocks.push_back( bd );
+
+ return bd.fSize;
+}
--- /dev/null
+//-*- Mode: C++ -*-
+// $Id$
+#ifndef ALIHLTCONTROLTASK_H
+#define ALIHLTCONTROLTASK_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 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, AliHLTComponentDataType dt, AliHLTUInt32_t spec, AliHLTUInt8_t* pData, AliHLTUInt32_t size) :
+ fTask(me) {
+ if (!fTask) return;
+ fTask->fEvent=dt;
+ fTask->fSpecification=spec;
+ fTask->fpData=pData;
+ fTask->fSize=size;
+ }
+ ~AliHLTControlEventGuard() {
+ if (!fTask) return;
+ fTask->fEvent=kAliHLTVoidDataType;
+ fTask->fSpecification=kAliHLTVoidDataSpec;
+ fTask->fpData=NULL;
+ fTask->fSize=0;
+ }
+
+ 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:
+
+ private:
+ /** copy constructor prohibited */
+ AliHLTControlTask(const AliHLTControlTask&);
+ /** assignment operator prohibited */
+ AliHLTControlTask& operator=(const AliHLTControlTask&);
+
+ /** data type of the control event */
+ AliHLTComponentDataType fEvent; //! transient
+ /** specification of the control evtent */
+ AliHLTUInt32_t fSpecification; //! transient
+ /** payload to be sent with the control event */
+ AliHLTUInt8_t* fpData; //! transient
+ /** payload size */
+ AliHLTUInt32_t fSize; //!transient
+
+ ClassDef(AliHLTControlTask, 0)
+ };
+#endif
AliHLTConfiguration.h \
AliHLTConfigurationHandler.h \
AliHLTTask.h \
+ AliHLTControlTask.h \
AliHLTLogging.h \
AliHLTDataBuffer.h \
AliHLTConsumerDescriptor.h \