Record changes.
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTDataBuffer.h
CommitLineData
3f2a1b1c 1// @(#) $Id$
2
3#ifndef ALIHLTDATABUFFER_H
4#define ALIHLTDATABUFFER_H
5/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6 * See cxx source for full Copyright notice */
7
8/* AliHLTDataBuffer
9 handling of data buffers for the HLT
10 */
11
12#include <cerrno>
13#include "AliHLTLogging.h"
14#include "AliHLTDataTypes.h"
15#include "AliHLTDefinitions.h"
16#include "AliHLTComponent.h"
17#include "TObject.h"
18#include "TList.h"
19
20/* internal data structure
21 */
22struct AliHLTDataSegment {
23 AliHLTComponent_DataType fDataType; // the data type of this buffer
24 Int_t fSegmentOffset; // offset in byte within the data buffer
25 Int_t fSegmentSize; // size of the actual content
26 AliHLTUInt32_t fSpecification; // data specification
27};
28
29/* internal data structure
30 */
31struct AliHLTRawBuffer {
32 AliHLTUInt32_t fSize; // size of the buffer
33 AliHLTUInt32_t fTotalSize; // total size of the buffer, including safety margin
34 void* fPtr; // the buffer
35};
36
37/* internal data structure
38 * there is unfortunately no unique determination of the data type from the component
39 * itself possible, thats way both component and data type have to be initialized
40 * and are stored in a compound
41 */
42class AliHLTConsumerDescriptor : public TObject, public AliHLTLogging {
43 private:
44 AliHLTComponent* fpConsumer;
45 AliHLTComponent_DataType fDataType;
46 AliHLTDataSegment* fpSegment;
47
48 public:
49 AliHLTConsumerDescriptor();
50 AliHLTConsumerDescriptor(AliHLTComponent* pConsumer, AliHLTComponent_DataType datatype);
51 ~AliHLTConsumerDescriptor();
52
53 AliHLTComponent* GetComponent() {return fpConsumer;}
54 AliHLTComponent_DataType GetDataType() {return fDataType;}
55
56 int SetActiveDataSegment(AliHLTDataSegment* pSegment);
57 int CheckActiveDataSegment(AliHLTUInt32_t offset, AliHLTUInt32_t size);
58 int ReleaseActiveDataSegment();
59};
60
61class AliHLTDataBuffer : public AliHLTLogging, public TObject {
62 public:
63 AliHLTDataBuffer();
64 virtual ~AliHLTDataBuffer();
65
66 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
67 // initialization
68
69 /* add component to the list of consumers
70 * parameter:
71 * pConsumer - a consumer of type AliHLTComponent
72 * datatype - data type of the segement, the consumer is registered for
73 */
74 int SetConsumer(AliHLTComponent* pConsumer, AliHLTComponent_DataType datatype);
75
76 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
77 // component to component communication
78
79 /* subscribe to a segment of the data buffer
80 * the function prepares the block descriptor for subsequent use with the AliHLTComponent::ProcessEvent
81 * method
82 * parameter:
83 * datatype - type of the data segment
84 * pConsumer - the component which subscribes to the buffer
85 * pBlockDesc - pointer to receive the prepared block descriptor
86 * return: >0 if success, negative error code if failed
87 */
88 int Subscribe(AliHLTComponent_DataType datatype, const AliHLTComponent* pConsumer, AliHLTComponent_BlockData* pBlockDesc);
89
90 /* release an instance of the data buffer
91 * resets the variables of the block descriptor
92 * parameter:
93 * pBlockDesc - descriptor of the data segment
94 * pConsumer - the component which subscribes to the buffer
95 * return: >0 if success, negative error code if failed
96 */
97 int Release(AliHLTComponent_BlockData* pBlockDesc, const AliHLTComponent* pConsumer);
98
99 /* get a target buffer if minimum size iMinSize
100 */
101 AliHLTUInt8_t* GetTargetBuffer(int iMinSize);
102
103 /* set the segments for the data buffer
104 * this is usually done after the component has written the data to the buffer
105 * parameter:
106 * pTgt - the target buffer the segments refer to
107 * arraySegments - the output block descriptors of the component
108 * iSize - size of the array
109 */
110 int SetSegments(AliHLTUInt8_t* pTgt, AliHLTComponent_BlockData* arraySegments, int iSize);
111
112 /* check if the data buffer is empty
113 */
114 int IsEmpty();
115
116 /* get the total and maximum size of the buffer
117 * lets see if this is needed later
118 */
119 //int GetTotalSize();
120
121 /* get the number of segments
122 */
123 int GetNofSegments();
124
125 /* get the number of consumers
126 */
127 int GetNofConsumers();
128
129 /* get the number of consumers
130 */
131 int GetNofActiveConsumers();
132
133 private:
134 AliHLTDataSegment* FindDataSegment(AliHLTComponent_DataType datatype);
135
136 /* reset the data buffer
137 * removes all condumers back to the fConsumers list
138 */
139 int ResetDataBuffer();
140
141
142 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
143 // the data description
144 vector<AliHLTDataSegment> fSegments;// the data segments within this buffer
145
146 vector<AliHLTConsumerDescriptor*> fConsumers; // the list of all consumers which are going to subscribe to the buffer
147 vector<AliHLTConsumerDescriptor*> fActiveConsumers; // the list of all consumers which are currently subscribed to the buffer
148 vector<AliHLTConsumerDescriptor*> fReleasedConsumers; // the list of all consumers which are already released for the current event
149
150 AliHLTRawBuffer* fpBuffer; // the buffer instance
151
152 AliHLTUInt32_t fFlags; // flags indicating the state of the buffer
153
154 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
155 // global buffer handling
156
157 /* create a raw buffer of a certain size
158 * the function tries to find a buffer of the given size (or a little bit bigger) from the list of free buffers
159 * if no buffer is available, a new one is created
160 */
161 static AliHLTRawBuffer* CreateRawBuffer(AliHLTUInt32_t size);
162
163 /* mark a buffer as free
164 */
165 static int ReleaseRawBuffer(AliHLTRawBuffer* pBuffer);
166
167 /* deletes all the raw buffers
168 */
169 static int DeleteRawBuffers();
170
171 static int fNofInstances;
172 static vector<AliHLTRawBuffer*> fFreeBuffers;
173 static vector<AliHLTRawBuffer*> fActiveBuffers;
174 static AliHLTUInt32_t fMargin;
175
176 /*
177 */
178 AliHLTConsumerDescriptor* FindConsumer(const AliHLTComponent* pConsumer, AliHLTComponent_DataType datatype, vector<AliHLTConsumerDescriptor*> &pList);
179
180 int ChangeConsumerState(AliHLTConsumerDescriptor* pDesc, vector<AliHLTConsumerDescriptor*> &srcList, vector<AliHLTConsumerDescriptor*> &tgtList);
181
182 int CleanupConsumerList();
183
184 ClassDef(AliHLTDataBuffer, 0)
185};
186#endif // ALIHLTDATABUFFER_H