00001 /* -*- mode: c++ -*- */ 00002 #ifndef __DAQpp_Fifo_h__ 00003 #define __DAQpp_Fifo_h__ 00004 #include <DAQ++/Thread.h> 00005 00006 namespace DAQpp 00007 { 00016 class FIFO : public Mutex 00017 { 00018 private: 00020 class DataCondition : public Condition 00021 { 00022 private: 00024 FIFO *fifo; 00025 public: 00029 DataCondition(FIFO *f) : fifo(f) 00030 {} 00031 00033 bool condition() 00034 { 00035 return !fifo->empty(); 00036 } 00037 }; 00039 DataCondition condition; 00040 00042 int bfsiz; 00043 00045 char *buff; 00046 00048 char *rdptr; 00049 00051 char *wrptr; 00052 00054 char *end; 00055 00056 public: 00058 FIFO(int size); 00059 00061 ~FIFO(); 00062 00064 int size() const 00065 { 00066 return bfsiz; 00067 } 00068 00070 bool empty() 00071 { 00072 return rdptr == wrptr; 00073 } 00074 00076 int read(char *buf, int); 00082 int write(char *buf, int, bool force = false); 00084 void reset() 00085 { 00086 rdptr = wrptr = buff; 00087 } 00089 int space_left() 00090 { 00091 int left; 00092 if ( rdptr == wrptr ) 00093 left = bfsiz - 1; 00094 else 00095 { 00096 left = ((rdptr + bfsiz - wrptr) % bfsiz) - 1; 00097 } 00098 return left; 00099 } 00100 00102 int data_available() 00103 { 00104 int left; 00105 if ( wrptr > rdptr ) // no wrap yet 00106 left = wrptr - rdptr; 00107 else 00108 { 00109 left = (end - rdptr) + (wrptr - buff); 00110 } 00111 return left; 00112 } 00113 }; 00114 } 00115 #endif