#include "TObjArray.h"
#include "TTimer.h"
#include "TThread.h"
+#include "TMutex.h"
#include "AliEveEventBuffer.h"
AliEveEventBuffer::AliEveEventBuffer() :
fBufferSize(10),
fPreBuffer(4),
- fBusy(kFALSE),
fEventBuffer(NULL),
fCurrentEvent(NULL),
fBIndex(),
fTimer(NULL),
fEventId(),
- fBufferMonStarted(kFALSE)
+ fBufferMonStarted(kFALSE),
+ fThread(NULL),
+ fMutex(NULL)
{
// see header file for class documentation
fEventBuffer = new TObjArray(fBufferSize, 0);
for(Int_t id = 0; id < fBufferSize; id++ ) {
fEventId[id] = -2;
}
+
+ fThread = new TThread(AliEveEventBuffer::BufferThread, (void*) this);
+ fMutex = new TMutex();
}
///___________________________________________________________________________
void AliEveEventBuffer::CreateBufferThread() {
- if(GetBusy()) {
+ // see header file for class documentation
+
+ 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) ) {
- SetBusy(kTRUE);
- cout << "CreateBufferThread()"<<endl;
- TThread * fThread = new TThread(AliEveEventBuffer::BufferThread, (void*) this);
+ cout << "StartBufferThread()"<<endl;
fThread->Run();
cout << "Started BufferThread"<<endl;
} else {
cout << "Buffer is full already"<<endl;
+ fMutex->UnLock();
}
}
}
+
///___________________________________________________________________________
void * AliEveEventBuffer::BufferThread(void * buffer) {
+ // see header file for class documentation
cout <<"BufferThread : " <<endl;
if(buffer) {
reinterpret_cast<AliEveEventBuffer*>(buffer)->MonitorBuffer();
///_____________________________________________________________________________
void AliEveEventBuffer::MonitorBuffer() {
+ // see header file for class documentation
cout << "Monitorbuffer() ";
- SetBusy(kTRUE);
FetchEvent();
- SetBusy(kFALSE);
+ fMutex->UnLock();
+
cout << "done " << endl;
}
///______________________________________________________________________________
TObject * AliEveEventBuffer::Back() {
+ // see header file for class documentation
cout << "go back"<<endl;
PrintIndeces();
Int_t prevId = CalculatePrevious(fBIndex[kCurrent]);
///______________________________________________________________________________
TObject * AliEveEventBuffer::Fwd() {
+ // see header file for class documentation
PrintIndeces();
if (fBIndex[kCurrent] == fBIndex[kLast]) {
cout<< "returning NULL"<<endl;
}
///_________________________________________________________________________________
void AliEveEventBuffer::PrintIndeces() {
+ // see header file for class documentation
for(Int_t i = 0; i < kSize; i++) {
cout << i << ": " << fBIndex[i] << endl;
}
}
///_________________________________________________________________________________
void AliEveEventBuffer::PrintBuffer() {
+ // see header file for class documentation
for(Int_t i = 0; i < 10; i++) {
AliESDEvent * event = dynamic_cast<AliESDEvent*>(fEventBuffer->At(i));
if(event) {
///____________________________________________________________________________________
void AliEveEventBuffer::FetchEvent() {
+ // see header file for class documentation
cout << "FetchEvent " << endl;
TObject * event = GetEventFromSource();
ULong64_t eventId = GetEventIdFromSource();
///_________________________________________________________________________________
void AliEveEventBuffer::AddToBuffer(TObject * event) {
+ // see header file for class documentation
cout << "Add to buffer"<<endl;
if(!event) return;
}
///_____________________________________________________________________________________
-Int_t AliEveEventBuffer::CalculateNext(Int_t current) {
+Int_t AliEveEventBuffer::CalculateNext(Int_t current) const {
//See header file for documentation
current++;
if(current == fBufferSize) current = 0;
///_____________________________________________________________________________________
-Int_t AliEveEventBuffer::CalculatePrevious(Int_t current) {
+Int_t AliEveEventBuffer::CalculatePrevious(Int_t current) const {
//See header file for documentation
cout << "CalculatePrev: " << current;
current--;
}
///__________________________________________________________________________________
-Int_t AliEveEventBuffer::CalculateDifference(Int_t top, Int_t low) {
+Int_t AliEveEventBuffer::CalculateDifference(Int_t top, Int_t low) const {
//See header file for documentation
if (top > low) {
// cout << "top > low"<<endl;
if(!GetBufferMonStarted()) {
CreateBufferThread();
SetBufferMonStarted(kTRUE);
- fTimer->Start(3000);
+ fTimer->Start(15000);
} else {
cout << "Stopping buffer monitor"<<endl;
fTimer->Stop();
}
///___________________________________________________________________________________
void AliEveEventBuffer::StopBufferMonitor() {
+ // see header file for class documentation
cout << "Stopping buffer mon"<<endl;
SetBufferMonStarted(kFALSE);
fTimer->Stop();