ROOT logo
// $Id$

/* This file is property of and copyright by the ALICE HLT Project        * 
 * ALICE Experiment at CERN, All rights reserved.                         *
 * See cxx source for full Copyright notice     
 */

/** @file   AliEveEventBuffer.h
    @author Svein Lindal
    @date
    @brief  Event buffer for HOMER
*/


#ifndef ALIEVEEVENTBUFFER_H
#define ALIEVEEVENTBUFFER_H



#include "TObject.h"
#include "TMutex.h"

class TObjArray;
class TTimer;
class TThread;
class TTimer;


class AliEveEventBuffer : public TObject{

public:
  
  /** default constructor */
  AliEveEventBuffer();

  /** destructor */
  virtual ~AliEveEventBuffer();

  void SetBufferSize(Int_t bs) { fBufferSize = bs;}
    
  TObject * NextEvent();
  TObject * Back();
  TObject * Fwd();
  
  void StartBufferMonitor();
  void StopBufferMonitor();
  //Needed for Homer buffer
  virtual void ConnectToSource() = 0;
  //Check if more events are needed in buffer
  void MonitorBuffer();

  static void * BufferThread(void * buffer);
  virtual void WriteToFile(Int_t runnumber) = 0; 

  void CreateBufferThread();

  ULong64_t GetEventId() const { return fEventId[fBIndex[kCurrent]]; }
  void SetEventId(ULong64_t eventId) { fEventId[fBIndex[kCurrent]] = eventId;}

  Int_t LockMutex() { return fMutex->TryLock();}
  Int_t UnLockMutex() { return fMutex->UnLock();}


protected:
  
  enum fBufferIndex {
    kCurrent,
    kLast, 
    kTop,
    kSize
  };

  
  Int_t fBufferSize;//Size of event buffer
  Int_t fPreBuffer;//How many events should be prefetched
  TObjArray * fEventBuffer;   //TClonesArray containing the stored events
  TObject * fCurrentEvent;   //Pointer to current event
  Int_t fBIndex[kSize];   //Event buffer indexes

  
  
  //Add event to buffer
  virtual void AddToBuffer(TObject * event);
  virtual TObject * GetEventFromSource() = 0;
  virtual ULong64_t GetEventIdFromSource() { return 0;}


  void FetchEvent();
  

  //Calculate buffer index stuff
  Int_t CalculateDifference(Int_t top, Int_t low) const;
  Int_t CalculatePrevious(Int_t current) const;
  Int_t CalculateNext(Int_t current) const;

  
  void SetBufferMonStarted(Bool_t started) {fBufferMonStarted = started;}
  Bool_t GetBufferMonStarted () const { return fBufferMonStarted;}

private:

  /** copy constructor prohibited */
  AliEveEventBuffer(const AliEveEventBuffer&);

  /** assignment operator prohibited */
  AliEveEventBuffer& operator=(const AliEveEventBuffer&);

  

  TObject *  GetNextUnSeen();

  void PrintIndeces();
  void PrintBuffer();

  TTimer * fTimer;//Timer to loop over buffer monitor

  //Current event id
  ULong64_t * fEventId;//Event id
  
  Bool_t fBufferMonStarted;//Has buffer monitor loop started?

  TThread * fThread; //Thread pointer
  TMutex * fMutex;//Mutex

  ClassDef(AliEveEventBuffer, 0); // Manage connections to HLT data-sources.
};

#endif
 AliEveEventBuffer.h:1
 AliEveEventBuffer.h:2
 AliEveEventBuffer.h:3
 AliEveEventBuffer.h:4
 AliEveEventBuffer.h:5
 AliEveEventBuffer.h:6
 AliEveEventBuffer.h:7
 AliEveEventBuffer.h:8
 AliEveEventBuffer.h:9
 AliEveEventBuffer.h:10
 AliEveEventBuffer.h:11
 AliEveEventBuffer.h:12
 AliEveEventBuffer.h:13
 AliEveEventBuffer.h:14
 AliEveEventBuffer.h:15
 AliEveEventBuffer.h:16
 AliEveEventBuffer.h:17
 AliEveEventBuffer.h:18
 AliEveEventBuffer.h:19
 AliEveEventBuffer.h:20
 AliEveEventBuffer.h:21
 AliEveEventBuffer.h:22
 AliEveEventBuffer.h:23
 AliEveEventBuffer.h:24
 AliEveEventBuffer.h:25
 AliEveEventBuffer.h:26
 AliEveEventBuffer.h:27
 AliEveEventBuffer.h:28
 AliEveEventBuffer.h:29
 AliEveEventBuffer.h:30
 AliEveEventBuffer.h:31
 AliEveEventBuffer.h:32
 AliEveEventBuffer.h:33
 AliEveEventBuffer.h:34
 AliEveEventBuffer.h:35
 AliEveEventBuffer.h:36
 AliEveEventBuffer.h:37
 AliEveEventBuffer.h:38
 AliEveEventBuffer.h:39
 AliEveEventBuffer.h:40
 AliEveEventBuffer.h:41
 AliEveEventBuffer.h:42
 AliEveEventBuffer.h:43
 AliEveEventBuffer.h:44
 AliEveEventBuffer.h:45
 AliEveEventBuffer.h:46
 AliEveEventBuffer.h:47
 AliEveEventBuffer.h:48
 AliEveEventBuffer.h:49
 AliEveEventBuffer.h:50
 AliEveEventBuffer.h:51
 AliEveEventBuffer.h:52
 AliEveEventBuffer.h:53
 AliEveEventBuffer.h:54
 AliEveEventBuffer.h:55
 AliEveEventBuffer.h:56
 AliEveEventBuffer.h:57
 AliEveEventBuffer.h:58
 AliEveEventBuffer.h:59
 AliEveEventBuffer.h:60
 AliEveEventBuffer.h:61
 AliEveEventBuffer.h:62
 AliEveEventBuffer.h:63
 AliEveEventBuffer.h:64
 AliEveEventBuffer.h:65
 AliEveEventBuffer.h:66
 AliEveEventBuffer.h:67
 AliEveEventBuffer.h:68
 AliEveEventBuffer.h:69
 AliEveEventBuffer.h:70
 AliEveEventBuffer.h:71
 AliEveEventBuffer.h:72
 AliEveEventBuffer.h:73
 AliEveEventBuffer.h:74
 AliEveEventBuffer.h:75
 AliEveEventBuffer.h:76
 AliEveEventBuffer.h:77
 AliEveEventBuffer.h:78
 AliEveEventBuffer.h:79
 AliEveEventBuffer.h:80
 AliEveEventBuffer.h:81
 AliEveEventBuffer.h:82
 AliEveEventBuffer.h:83
 AliEveEventBuffer.h:84
 AliEveEventBuffer.h:85
 AliEveEventBuffer.h:86
 AliEveEventBuffer.h:87
 AliEveEventBuffer.h:88
 AliEveEventBuffer.h:89
 AliEveEventBuffer.h:90
 AliEveEventBuffer.h:91
 AliEveEventBuffer.h:92
 AliEveEventBuffer.h:93
 AliEveEventBuffer.h:94
 AliEveEventBuffer.h:95
 AliEveEventBuffer.h:96
 AliEveEventBuffer.h:97
 AliEveEventBuffer.h:98
 AliEveEventBuffer.h:99
 AliEveEventBuffer.h:100
 AliEveEventBuffer.h:101
 AliEveEventBuffer.h:102
 AliEveEventBuffer.h:103
 AliEveEventBuffer.h:104
 AliEveEventBuffer.h:105
 AliEveEventBuffer.h:106
 AliEveEventBuffer.h:107
 AliEveEventBuffer.h:108
 AliEveEventBuffer.h:109
 AliEveEventBuffer.h:110
 AliEveEventBuffer.h:111
 AliEveEventBuffer.h:112
 AliEveEventBuffer.h:113
 AliEveEventBuffer.h:114
 AliEveEventBuffer.h:115
 AliEveEventBuffer.h:116
 AliEveEventBuffer.h:117
 AliEveEventBuffer.h:118
 AliEveEventBuffer.h:119
 AliEveEventBuffer.h:120
 AliEveEventBuffer.h:121
 AliEveEventBuffer.h:122
 AliEveEventBuffer.h:123
 AliEveEventBuffer.h:124
 AliEveEventBuffer.h:125
 AliEveEventBuffer.h:126
 AliEveEventBuffer.h:127
 AliEveEventBuffer.h:128