]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveHLT/AliEveEventBuffer.cxx
Create only one instance of the buffer thread
[u/mrichter/AliRoot.git] / EVE / EveHLT / AliEveEventBuffer.cxx
index 53aabbc2b8164a235cea1bcc0df3656221095aec..61afb25dbadb7971a9078929580229001983051d 100644 (file)
@@ -23,7 +23,8 @@ AliEveEventBuffer::AliEveEventBuffer() :
   fBIndex(),
   fTimer(NULL),
   fEventId(),
-  fBufferMonStarted(kFALSE)
+  fBufferMonStarted(kFALSE),
+  fThread(NULL)
  {
   // see header file for class documentation
   fEventBuffer = new TObjArray(fBufferSize, 0);
@@ -36,8 +37,14 @@ AliEveEventBuffer::AliEveEventBuffer() :
   fTimer = new TTimer();
   fTimer->Connect("Timeout()", "AliEveEventBuffer", this, "CreateBufferThread()");
 
-  fEventId = new Int_t[fBufferSize];
+  fEventId = new ULong64_t[fBufferSize];
+  for(Int_t id = 0; id < fBufferSize; id++ ) {
+    fEventId[id] = -2;
+  }
+
+  fThread = new TThread(AliEveEventBuffer::BufferThread, (void*) this);
 
+  
 
 }
 
@@ -59,23 +66,29 @@ AliEveEventBuffer::~AliEveEventBuffer() {
 
 }
 
+///___________________________________________________________________________
 void AliEveEventBuffer::CreateBufferThread() {
-  //  cout << "hereherehere"<<endl;
-  TThread * fThread = new TThread(AliEveEventBuffer::BufferThread, (void*) this);
-  fThread->Run();
-
+  cout << "Threadexists: " << fThread->Exists() << endl;
+  if(GetBusy()) {
+    cout << "Buffer is busy, no thread created"<< endl;
+    
+  } else {
+    if ( (CalculateDifference(fBIndex[kTop],fBIndex[kLast]) < fPreBuffer) ) {
+      SetBusy(kTRUE);
+      cout << "StartBufferThread()"<<endl;
+      fThread->Run();
+      cout << "Started BufferThread"<<endl;
+    } else { 
+      cout << "Buffer is full already"<<endl;
+    }
+  }
 }
 
 ///___________________________________________________________________________
 void * AliEveEventBuffer::BufferThread(void * buffer) {
   cout <<"BufferThread : " <<endl;
   if(buffer) {
-    if (!reinterpret_cast<AliEveEventBuffer*>(buffer)->GetBusy()) {
       reinterpret_cast<AliEveEventBuffer*>(buffer)->MonitorBuffer();
-    } else {
-      cout << "busy"<<endl;
-    }
-    
   } else {
     cout << "no buffer"<<endl;
   }
@@ -84,37 +97,19 @@ void * AliEveEventBuffer::BufferThread(void * buffer) {
 
 ///_____________________________________________________________________________
 void AliEveEventBuffer::MonitorBuffer() {
-  cout << "Monitorbuffer: " << endl;
-  if ( (CalculateDifference(fBIndex[kTop],fBIndex[kLast]) < fPreBuffer) ) {
-    if(GetBusy()) {
-      cout << "Already called FetchEvent()" << endl;
-      return;
-    } else {
-      fBusy = kTRUE;
-      FetchEvent();
-      fBusy = kFALSE;
-    }
-  } else {
-    //StopBufferMonitor();
-    
-    fBusy = kFALSE;
-  }
+  cout << "Monitorbuffer() ";
+  SetBusy(kTRUE);
+  FetchEvent();
+  SetBusy(kFALSE);
+  cout << "done " << endl;
 }
 
 
 ///_______________________________________________________________________________
 TObject * AliEveEventBuffer::NextEvent() {
   //See header file for documentation
-  cout << "In enxtevent"<<endl;
-
-
-  // if(fBusy) {
-  //   cout << "Event Buffer busy"<<endl;
-  //   return NULL;
-  // }
-  //  else SetBusy(kTRUE);
+  cout << "NextEvent()"<<endl;
   TObject * nextEvent = GetNextUnSeen();
-  //SetBusy(kFALSE);
   return nextEvent;
 }
 
@@ -134,6 +129,8 @@ TObject * AliEveEventBuffer::Back() {
   }
 }
 
+
+
 ///______________________________________________________________________________
 TObject * AliEveEventBuffer::Fwd() {
   PrintIndeces();
@@ -184,7 +181,12 @@ void AliEveEventBuffer::PrintBuffer() {
 void AliEveEventBuffer::FetchEvent() {
   cout << "FetchEvent " << endl;
   TObject * event = GetEventFromSource();
-  if(event) AddToBuffer(event);
+  ULong64_t eventId = GetEventIdFromSource();
+  if(event) {
+    AddToBuffer(event);
+    fEventId[fBIndex[kTop]] = eventId;  
+  }
+  
   PrintIndeces();
   cout << "FetchedEvent " << endl;
   
@@ -201,9 +203,8 @@ void AliEveEventBuffer::AddToBuffer(TObject * event) {
   fEventBuffer->RemoveAt(fBIndex[kTop]);
   //if (object) delete object;
   fEventBuffer->AddAt(event, fBIndex[kTop]);
-}
-
 
+}
 
 ///_____________________________________________________________________________________
 Int_t AliEveEventBuffer::CalculateNext(Int_t current) {
@@ -243,9 +244,15 @@ Int_t AliEveEventBuffer::CalculateDifference(Int_t top, Int_t low) {
 void AliEveEventBuffer::StartBufferMonitor() {
   //cout << "NOT !!! starting buffer mon"<<endl;
   cout << "starting buffer mon"<<endl;
-  CreateBufferThread();
-  SetBufferMonStarted(kTRUE);
-  fTimer->Start(10000);
+  if(!GetBufferMonStarted()) {
+    CreateBufferThread();
+    SetBufferMonStarted(kTRUE);
+    fTimer->Start(3000);
+  } else {
+    cout << "Stopping buffer monitor"<<endl;
+    fTimer->Stop();
+    SetBufferMonStarted(kFALSE);
+  }
 }
 ///___________________________________________________________________________________
 void AliEveEventBuffer::StopBufferMonitor() {