21#include "TBufferFile.h"
26#include "TGo4LockGuard.h"
35 GO4TRACE((14,
"TGo4BufferQueue::TGo4BufferQueue()", __LINE__, __FILE__));
47 GO4TRACE((14,
"TGo4BufferQueue::TGo4BufferQueue(const char *)", __LINE__, __FILE__));
55 GO4TRACE((14,
"TGo4BufferQueue::InitBuffers()", __LINE__, __FILE__));
70 GO4TRACE((14,
"TGo4BufferQueue::~TTGo4BufferQueue()", __LINE__, __FILE__));
74 TCollection::EmptyGarbageCollection();
87 GO4TRACE((19,
"TGo4BufferQueue::WaitBuffer()", __LINE__, __FILE__));
89 return dynamic_cast<TBuffer *
>(ob);
94 GO4TRACE((19,
"TGo4BufferQueue::WaitObjectFromBuffer()", __LINE__, __FILE__));
95 TObject *obj =
nullptr;
101 TDirectory *savdir = gDirectory;
103 buffer->SetReadMode();
109 TClass *cl = buffer->ReadClass();
110 if(cl == (TClass *) -1)
113 std::cout <<
" Could not receive object of unknown class on buffer queue "<<GetName() <<
" !!!" <<std::endl;
117 obj = buffer->ReadObject(cl);
119 if(savdir) savdir->cd();
129 GO4TRACE((19,
"TGo4BufferQueue::AddBuffer(TBuffer *, Bool_t)", __LINE__, __FILE__));
131 TBuffer *entry =
nullptr;
132 Bool_t entryisnew = kFALSE;
155 Int_t srcsize=buffer->BufferSize();
156 Int_t destsize=entry->BufferSize();
157 if (srcsize>destsize)
159 Realloc(entry,destsize,srcsize);
166 char *source = buffer->Buffer();
167 char *destination = entry->Buffer();
168 memcpy(destination,source,srcsize);
169 Int_t messlen = buffer->Length();
170 entry->SetBufferOffset(messlen);
171 entry->SetByteCount(0);
184 std::cout <<
"Buffer queue "<< GetName()<<
" is full, dropping new entry "<< entry <<
" !!!" << std::endl;
196 GO4TRACE((12,
"TGo4BufferQueue::AddBufferFromObject(TObject *)", __LINE__, __FILE__));
199 TBuffer *entry =
new TBufferFile(TBuffer::kWrite);
200 TFile *filsav = gFile;
202 entry->WriteObject(
object);
233 std::cout <<
"Buffer queue "<< GetName()<<
" is full, dropping new entry "<< entry <<
" !!!" << std::endl;
240 GO4TRACE((19,
"TGo4BufferQueue::FreeBuffer(TBuffer *, Bool_t)", __LINE__, __FILE__));
247 Int_t memsize = buffer->BufferSize();
260 while(
auto ob =
Next())
269 buffer->Expand(newsize);
276 TNamed *dummy =
new TNamed(
"This is a default buffer filler",
"GO4 is fun!");
277 TFile *filsav = gFile;
279 buf->WriteObject(dummy);
287 TBuffer *buf =
new TBufferFile(TBuffer::kWrite);
288 char *field= buf->Buffer() +
sizeof(UInt_t);
290 buf->SetBufferOffset(
sizeof(UInt_t)+
sizeof(UInt_t) );
291 buf->SetByteCount(0);
299 UInt_t len = buf->Length();
300 if(len != (
sizeof(UInt_t)+
sizeof(UInt_t)))
return -2;
303 char *field = buf->Buffer();
304 char *temp = field +
sizeof(UInt_t);
static Int_t DecodeValueBuffer(TBuffer *buf)
Extract value from buffer that was created by CreateValueBuffer method.
TList * fxBufferList
List of preallocated buffer TBuffers which are used when TBuffer added to queue should be "cloned".
static TBuffer * CreateValueBuffer(UInt_t val)
Create a root buffer that contains a single value val.
TBuffer * NewEntry()
Create dummy buffer for queue.
void Clear(Option_t *opt="") override
Empty the queue and give free buffers back.
TBuffer * WaitBuffer()
Wait for buffer object from queue.
void InitBuffers()
Initialization of internal queue buffer.
Int_t fiMaxBuffers
Number of preallocated buffer TBuffers (maximum entries in fxBufferList).
void AddBuffer(TBuffer *buffer, Bool_t clone=kFALSE)
Add buffer pointer to queue.
void AddBufferFromObject(TObject *object)
Reconstruct a TObject queue entry from a given TBuffer pointer.
void Realloc(TBuffer *buffer, Int_t oldsize, Int_t newsize)
Reallocate buffer of TBuffer to newsize.
virtual ~TGo4BufferQueue()
TList * fxFreeList
List of buffers which are free for the next add.
TObject * WaitObjectFromBuffer()
Wait for buffer object from queue.
void FreeBuffer(TBuffer *buffer)
Free internal buffer to be re-used by the AddBuffer as clone method.
static void Debug(const char *text,...) GO4_PRINTF_ARGS
User shortcut for message with prio 0.
TGo4Queue(const char *name=nullptr)
static const Int_t fgiBUFINITSIZE
Initial size for object receive buffer (TBuffer)