00001 #ifndef PLAYBACKRAWDATAPROVIDER_H 00002 #define PLAYBACKRAWDATAPROVIDER_H 1 00003 00004 #include "FWCore/Framework/interface/EDAnalyzer.h" 00005 #include "FWCore/Framework/interface/Event.h" 00006 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00007 00008 #include <memory> 00009 #include <semaphore.h> 00010 00011 class FEDRawDataCollection; 00012 00013 class PlaybackRawDataProvider : public edm::EDAnalyzer 00014 { 00015 public: 00016 // 00017 // construction/destruction 00018 // 00019 explicit PlaybackRawDataProvider(const edm::ParameterSet&); 00020 virtual ~PlaybackRawDataProvider(); 00021 00022 // EDAnalyzer interface 00023 virtual void beginJob(const edm::EventSetup&); 00024 virtual void analyze(const edm::Event&, const edm::EventSetup&); 00025 virtual void endJob(); 00026 00027 // provide cached fed collection (and run/evt number, if needed!) 00028 virtual FEDRawDataCollection* getFEDRawData(); 00029 virtual FEDRawDataCollection* getFEDRawData(unsigned int& runNumber, 00030 unsigned int& evtNumber); 00031 void setFreeToEof(); 00032 00033 static PlaybackRawDataProvider* instance(); 00034 00035 00036 private: 00037 00038 static PlaybackRawDataProvider* instance_; 00039 // 00040 // private member functions 00041 // 00042 void lock() { sem_wait(&lock_); } 00043 void unlock() { sem_post(&lock_); } 00044 void waitWriteSem() { sem_wait(&writeSem_); } 00045 void postWriteSem() { sem_post(&writeSem_); } 00046 void waitReadSem() { sem_wait(&readSem_);} 00047 void postReadSem() { sem_post(&readSem_); } 00048 00049 00050 void sem_print(); 00051 00052 00053 private: 00054 // 00055 // member data 00056 // 00057 unsigned int queueSize_; 00058 FEDRawDataCollection **eventQueue_; 00059 unsigned int *runNumber_; 00060 unsigned int *evtNumber_; 00061 unsigned int count_; 00062 00063 sem_t lock_; 00064 sem_t writeSem_; 00065 sem_t readSem_; 00066 unsigned int writeIndex_; 00067 unsigned int readIndex_; 00068 bool freeToEof_; 00069 }; 00070 00071 00072 // 00073 // implementation of inline functions 00074 // 00075 00076 //______________________________________________________________________________ 00077 inline 00078 PlaybackRawDataProvider* PlaybackRawDataProvider::instance() 00079 { 00080 return instance_; 00081 } 00082 00083 00084 #endif