#include <iostream>
#include "TObjArray.h"
#include "TTimer.h"
#include "TThread.h"
#include "TMutex.h"
#include "AliEveEventBuffer.h"
#include "AliESDEvent.h"
using namespace std;
ClassImp(AliEveEventBuffer)
AliEveEventBuffer::AliEveEventBuffer() :
fBufferSize(10),
fPreBuffer(4),
fEventBuffer(NULL),
fCurrentEvent(NULL),
fBIndex(),
fTimer(NULL),
fEventId(),
fBufferMonStarted(kFALSE),
fThread(NULL),
fMutex(NULL)
{
fEventBuffer = new TObjArray(fBufferSize, 0);
fEventBuffer->SetOwner(kFALSE);
for(int id = 0; id < kSize; id++) {
fBIndex[id] = -1;
}
fTimer = new TTimer();
fTimer->Connect("Timeout()", "AliEveEventBuffer", this, "CreateBufferThread()");
fEventId = new ULong64_t[fBufferSize];
for(Int_t id = 0; id < fBufferSize; id++ ) {
fEventId[id] = -2;
}
fThread = new TThread(AliEveEventBuffer::BufferThread, (void*) this);
fMutex = new TMutex();
}
AliEveEventBuffer::~AliEveEventBuffer() {
if ( fEventBuffer ) {
fEventBuffer->Clear();
delete fEventBuffer;
}
fEventBuffer = NULL;
if(fCurrentEvent)
delete fCurrentEvent;
fCurrentEvent = NULL;
}
void AliEveEventBuffer::CreateBufferThread() {
cout << "Threadexists: " << fThread->Exists() << endl;
if( fMutex->TryLock() ) {
cout << "Buffer is busy, no thread created"<< endl;
return;
} else {
if ( (CalculateDifference(fBIndex[kTop],fBIndex[kLast]) < fPreBuffer) ) {
cout << "StartBufferThread()"<<endl;
fThread->Run();
cout << "Started BufferThread"<<endl;
} else {
cout << "Buffer is full already"<<endl;
fMutex->UnLock();
}
}
}
void * AliEveEventBuffer::BufferThread(void * buffer) {
cout <<"BufferThread : " <<endl;
if(buffer) {
reinterpret_cast<AliEveEventBuffer*>(buffer)->MonitorBuffer();
} else {
cout << "no buffer"<<endl;
}
return (void*)0;
}
void AliEveEventBuffer::MonitorBuffer() {
cout << "Monitorbuffer() ";
FetchEvent();
fMutex->UnLock();
cout << "done " << endl;
}
TObject * AliEveEventBuffer::NextEvent() {
cout << "NextEvent()"<<endl;
TObject * nextEvent = GetNextUnSeen();
return nextEvent;
}
TObject * AliEveEventBuffer::Back() {
cout << "go back"<<endl;
PrintIndeces();
Int_t prevId = CalculatePrevious(fBIndex[kCurrent]);
if(prevId == fBIndex[kTop]) {
cout << "returning NULL" << endl;
return NULL;
} else {
fBIndex[kCurrent] = prevId;
PrintIndeces();
cout <<"returning: "<< fBIndex[kCurrent] << " " << fEventBuffer->At(fBIndex[kCurrent]);
return fEventBuffer->At(fBIndex[kCurrent]);
}
}
TObject * AliEveEventBuffer::Fwd() {
PrintIndeces();
if (fBIndex[kCurrent] == fBIndex[kLast]) {
cout<< "returning NULL"<<endl;
return NULL;
}
fBIndex[kCurrent] = CalculateNext(fBIndex[kCurrent]);
TObject * event = fEventBuffer->At(fBIndex[kCurrent]);
return event;
}
TObject * AliEveEventBuffer::GetNextUnSeen() {
cout << "GetNextUnSeen"<<endl;
PrintIndeces();
if(CalculateDifference(fBIndex[kTop], fBIndex[kLast])) {
fBIndex[kLast] = CalculateNext(fBIndex[kLast]);
fBIndex[kCurrent] = fBIndex[kLast];
PrintIndeces();
return fEventBuffer->At(fBIndex[kCurrent]);
} else {
cout << "No new event available, only events in buffer available!"<<endl;
return NULL;
}
}
void AliEveEventBuffer::PrintIndeces() {
for(Int_t i = 0; i < kSize; i++) {
cout << i << ": " << fBIndex[i] << endl;
}
}
void AliEveEventBuffer::PrintBuffer() {
for(Int_t i = 0; i < 10; i++) {
AliESDEvent * event = dynamic_cast<AliESDEvent*>(fEventBuffer->At(i));
if(event) {
cout << i << ": " <<event << " " << event->GetEventNumberInFile() << endl;;
}
}
}
void AliEveEventBuffer::FetchEvent() {
cout << "FetchEvent " << endl;
TObject * event = GetEventFromSource();
ULong64_t eventId = GetEventIdFromSource();
if(event) {
AddToBuffer(event);
fEventId[fBIndex[kTop]] = eventId;
}
PrintIndeces();
cout << "FetchedEvent " << endl;
}
void AliEveEventBuffer::AddToBuffer(TObject * event) {
cout << "Add to buffer"<<endl;
if(!event) return;
fBIndex[kTop] = CalculateNext(fBIndex[kTop]);
fEventBuffer->RemoveAt(fBIndex[kTop]);
fEventBuffer->AddAt(event, fBIndex[kTop]);
}
Int_t AliEveEventBuffer::CalculateNext(Int_t current) const {
current++;
if(current == fBufferSize) current = 0;
return current;
}
Int_t AliEveEventBuffer::CalculatePrevious(Int_t current) const {
cout << "CalculatePrev: " << current;
current--;
if(current == -1) current += fBufferSize;
cout << "... " << current << endl;
return current;
}
Int_t AliEveEventBuffer::CalculateDifference(Int_t top, Int_t low) const {
if (top > low) {
return (top - low);
} else if (top < low) {
return (fBufferSize - low + top);
} else {
return 0;
}
}
void AliEveEventBuffer::StartBufferMonitor() {
cout << "starting buffer mon"<<endl;
if(!GetBufferMonStarted()) {
CreateBufferThread();
SetBufferMonStarted(kTRUE);
fTimer->Start(15000);
} else {
cout << "Stopping buffer monitor"<<endl;
fTimer->Stop();
SetBufferMonStarted(kFALSE);
}
}
void AliEveEventBuffer::StopBufferMonitor() {
cout << "Stopping buffer mon"<<endl;
SetBufferMonStarted(kFALSE);
fTimer->Stop();
}
AliEveEventBuffer.cxx:100 AliEveEventBuffer.cxx:101 AliEveEventBuffer.cxx:102 AliEveEventBuffer.cxx:103 AliEveEventBuffer.cxx:104 AliEveEventBuffer.cxx:105 AliEveEventBuffer.cxx:106 AliEveEventBuffer.cxx:107 AliEveEventBuffer.cxx:108 AliEveEventBuffer.cxx:109 AliEveEventBuffer.cxx:110 AliEveEventBuffer.cxx:111 AliEveEventBuffer.cxx:112 AliEveEventBuffer.cxx:113 AliEveEventBuffer.cxx:114 AliEveEventBuffer.cxx:115 AliEveEventBuffer.cxx:116 AliEveEventBuffer.cxx:117 AliEveEventBuffer.cxx:118 AliEveEventBuffer.cxx:119 AliEveEventBuffer.cxx:120 AliEveEventBuffer.cxx:121 AliEveEventBuffer.cxx:122 AliEveEventBuffer.cxx:123 AliEveEventBuffer.cxx:124 AliEveEventBuffer.cxx:125 AliEveEventBuffer.cxx:126 AliEveEventBuffer.cxx:127 AliEveEventBuffer.cxx:128 AliEveEventBuffer.cxx:129 AliEveEventBuffer.cxx:130 AliEveEventBuffer.cxx:131 AliEveEventBuffer.cxx:132 AliEveEventBuffer.cxx:133 AliEveEventBuffer.cxx:134 AliEveEventBuffer.cxx:135 AliEveEventBuffer.cxx:136 AliEveEventBuffer.cxx:137 AliEveEventBuffer.cxx:138 AliEveEventBuffer.cxx:139 AliEveEventBuffer.cxx:140 AliEveEventBuffer.cxx:141 AliEveEventBuffer.cxx:142 AliEveEventBuffer.cxx:143 AliEveEventBuffer.cxx:144 AliEveEventBuffer.cxx:145 AliEveEventBuffer.cxx:146 AliEveEventBuffer.cxx:147 AliEveEventBuffer.cxx:148 AliEveEventBuffer.cxx:149 AliEveEventBuffer.cxx:150 AliEveEventBuffer.cxx:151 AliEveEventBuffer.cxx:152 AliEveEventBuffer.cxx:153 AliEveEventBuffer.cxx:154 AliEveEventBuffer.cxx:155 AliEveEventBuffer.cxx:156 AliEveEventBuffer.cxx:157 AliEveEventBuffer.cxx:158 AliEveEventBuffer.cxx:159 AliEveEventBuffer.cxx:160 AliEveEventBuffer.cxx:161 AliEveEventBuffer.cxx:162 AliEveEventBuffer.cxx:163 AliEveEventBuffer.cxx:164 AliEveEventBuffer.cxx:165 AliEveEventBuffer.cxx:166 AliEveEventBuffer.cxx:167 AliEveEventBuffer.cxx:168 AliEveEventBuffer.cxx:169 AliEveEventBuffer.cxx:170 AliEveEventBuffer.cxx:171 AliEveEventBuffer.cxx:172 AliEveEventBuffer.cxx:173 AliEveEventBuffer.cxx:174 AliEveEventBuffer.cxx:175 AliEveEventBuffer.cxx:176 AliEveEventBuffer.cxx:177 AliEveEventBuffer.cxx:178 AliEveEventBuffer.cxx:179 AliEveEventBuffer.cxx:180 AliEveEventBuffer.cxx:181 AliEveEventBuffer.cxx:182 AliEveEventBuffer.cxx:183 AliEveEventBuffer.cxx:184 AliEveEventBuffer.cxx:185 AliEveEventBuffer.cxx:186 AliEveEventBuffer.cxx:187 AliEveEventBuffer.cxx:188 AliEveEventBuffer.cxx:189 AliEveEventBuffer.cxx:190 AliEveEventBuffer.cxx:191 AliEveEventBuffer.cxx:192 AliEveEventBuffer.cxx:193 AliEveEventBuffer.cxx:194 AliEveEventBuffer.cxx:195 AliEveEventBuffer.cxx:196 AliEveEventBuffer.cxx:197 AliEveEventBuffer.cxx:198 AliEveEventBuffer.cxx:199 AliEveEventBuffer.cxx:200 AliEveEventBuffer.cxx:201 AliEveEventBuffer.cxx:202 AliEveEventBuffer.cxx:203 AliEveEventBuffer.cxx:204 AliEveEventBuffer.cxx:205 AliEveEventBuffer.cxx:206 AliEveEventBuffer.cxx:207 AliEveEventBuffer.cxx:208 AliEveEventBuffer.cxx:209 AliEveEventBuffer.cxx:210 AliEveEventBuffer.cxx:211 AliEveEventBuffer.cxx:212 AliEveEventBuffer.cxx:213 AliEveEventBuffer.cxx:214 AliEveEventBuffer.cxx:215 AliEveEventBuffer.cxx:216 AliEveEventBuffer.cxx:217 AliEveEventBuffer.cxx:218 AliEveEventBuffer.cxx:219 AliEveEventBuffer.cxx:220 AliEveEventBuffer.cxx:221 AliEveEventBuffer.cxx:222 AliEveEventBuffer.cxx:223 AliEveEventBuffer.cxx:224 AliEveEventBuffer.cxx:225 AliEveEventBuffer.cxx:226 AliEveEventBuffer.cxx:227 AliEveEventBuffer.cxx:228 AliEveEventBuffer.cxx:229 AliEveEventBuffer.cxx:230 AliEveEventBuffer.cxx:231 AliEveEventBuffer.cxx:232 AliEveEventBuffer.cxx:233 AliEveEventBuffer.cxx:234 AliEveEventBuffer.cxx:235 AliEveEventBuffer.cxx:236 AliEveEventBuffer.cxx:237 AliEveEventBuffer.cxx:238 AliEveEventBuffer.cxx:239 AliEveEventBuffer.cxx:240 AliEveEventBuffer.cxx:241 AliEveEventBuffer.cxx:242 AliEveEventBuffer.cxx:243 AliEveEventBuffer.cxx:244 AliEveEventBuffer.cxx:245 AliEveEventBuffer.cxx:246 AliEveEventBuffer.cxx:247 AliEveEventBuffer.cxx:248 AliEveEventBuffer.cxx:249 AliEveEventBuffer.cxx:250 AliEveEventBuffer.cxx:251 AliEveEventBuffer.cxx:252 AliEveEventBuffer.cxx:253 AliEveEventBuffer.cxx:254 AliEveEventBuffer.cxx:255 AliEveEventBuffer.cxx:256 AliEveEventBuffer.cxx:257 AliEveEventBuffer.cxx:258 AliEveEventBuffer.cxx:259 AliEveEventBuffer.cxx:260 AliEveEventBuffer.cxx:261 AliEveEventBuffer.cxx:262 AliEveEventBuffer.cxx:263 AliEveEventBuffer.cxx:264 AliEveEventBuffer.cxx:265 AliEveEventBuffer.cxx:266 AliEveEventBuffer.cxx:267 AliEveEventBuffer.cxx:268 AliEveEventBuffer.cxx:269 AliEveEventBuffer.cxx:270 AliEveEventBuffer.cxx:271 AliEveEventBuffer.cxx:272 AliEveEventBuffer.cxx:273 AliEveEventBuffer.cxx:274 AliEveEventBuffer.cxx:275 AliEveEventBuffer.cxx:276 AliEveEventBuffer.cxx:277 AliEveEventBuffer.cxx:278 AliEveEventBuffer.cxx:279 AliEveEventBuffer.cxx:280 AliEveEventBuffer.cxx:281 AliEveEventBuffer.cxx:282 AliEveEventBuffer.cxx:283 AliEveEventBuffer.cxx:284 AliEveEventBuffer.cxx:285 AliEveEventBuffer.cxx:286 AliEveEventBuffer.cxx:287 AliEveEventBuffer.cxx:288 AliEveEventBuffer.cxx:289 AliEveEventBuffer.cxx:290 AliEveEventBuffer.cxx:291 AliEveEventBuffer.cxx:292 AliEveEventBuffer.cxx:293 AliEveEventBuffer.cxx:294 AliEveEventBuffer.cxx:295 AliEveEventBuffer.cxx:296 AliEveEventBuffer.cxx:297 AliEveEventBuffer.cxx:298 AliEveEventBuffer.cxx:299 AliEveEventBuffer.cxx:300 AliEveEventBuffer.cxx:301 AliEveEventBuffer.cxx:302 AliEveEventBuffer.cxx:303 AliEveEventBuffer.cxx:304 AliEveEventBuffer.cxx:305 AliEveEventBuffer.cxx:306 AliEveEventBuffer.cxx:307 AliEveEventBuffer.cxx:308 AliEveEventBuffer.cxx:309 AliEveEventBuffer.cxx:310 AliEveEventBuffer.cxx:311 AliEveEventBuffer.cxx:312 AliEveEventBuffer.cxx:313 AliEveEventBuffer.cxx:314 AliEveEventBuffer.cxx:315 AliEveEventBuffer.cxx:316 AliEveEventBuffer.cxx:317 AliEveEventBuffer.cxx:318 AliEveEventBuffer.cxx:319 AliEveEventBuffer.cxx:320 AliEveEventBuffer.cxx:321 AliEveEventBuffer.cxx:322 AliEveEventBuffer.cxx:323 AliEveEventBuffer.cxx:324 AliEveEventBuffer.cxx:325 AliEveEventBuffer.cxx:326 AliEveEventBuffer.cxx:327 AliEveEventBuffer.cxx:328 AliEveEventBuffer.cxx:329 AliEveEventBuffer.cxx:330 AliEveEventBuffer.cxx:331 AliEveEventBuffer.cxx:332 AliEveEventBuffer.cxx:333 AliEveEventBuffer.cxx:334 AliEveEventBuffer.cxx:335 AliEveEventBuffer.cxx:336 AliEveEventBuffer.cxx:337 AliEveEventBuffer.cxx:338 AliEveEventBuffer.cxx:339 AliEveEventBuffer.cxx:340 AliEveEventBuffer.cxx:341 AliEveEventBuffer.cxx:342 AliEveEventBuffer.cxx:343 AliEveEventBuffer.cxx:344 AliEveEventBuffer.cxx:345 AliEveEventBuffer.cxx:346 AliEveEventBuffer.cxx:347 AliEveEventBuffer.cxx:348 AliEveEventBuffer.cxx:349