00001 /* -*- mode: c++; c-basic-offset: 4; -*- */ 00002 #ifndef LSMP_INT_HH 00003 #define LSMP_INT_HH 00004 // 00005 // Ligo Shared Memory Partition internal structures. 00006 // 00007 #include <sys/types.h> 00008 #include "ManyFlags.hh" 00009 #include "lsmp.hh" 00010 00011 #define LSMP_VERSION 101 // Package version number 00012 #define LSMP_SHMBASE 32 // shm base id 00013 #define LSMP_MAXSHM 8 // maximum # of shm partitions 00014 #define LSMP_MAXCONS 32 // maximum number of consumers 00015 #define LSMP_CONSPWD 8 // consumers per mask word 00016 #define LSMP_LMASK ((LSMP_MAXCONS-1)/LSMP_CONSPWD+1) // consumer mask length 00017 #define CON_BIT(i) (i%LSMP_CONSPWD) 00018 #define CON_MASK(i) (1 << (i%LSMP_CONSPWD)) 00019 #define CON_WORD(i) (i/LSMP_CONSPWD) 00020 00021 //-------------------------------------- Consumer flag class 00022 #define LSMP_CONSPWD 8 00023 #define LSMP_LMASK ((LSMP_MAXCONS-1)/LSMP_CONSPWD+1) 00024 #define CON_BIT(i) (i%LSMP_CONSPWD) 00025 #define CON_MASK(i) (1 << (i%LSMP_CONSPWD)) 00026 #define CON_WORD(i) (i/LSMP_CONSPWD) 00027 00028 typedef ManyFlags<LSMP_LMASK,LSMP_CONSPWD> ConFlags; 00029 00030 //--------------------------------------- Buffer header structure 00031 #define SEG_QUEUED 0x0001 00032 00039 struct LSMP_buffer { 00042 unsigned int status; 00043 00046 long boff; 00047 00052 ConFlags reserve_mask; 00053 00062 ConFlags seen_mask; 00063 00072 int use_count; 00073 00075 int ldata; 00076 00078 int trig; 00079 00081 time_t fill_time; 00082 00084 LSMP::eventid_type data_ID; 00085 00087 pid_t owner_pid; 00088 00090 int link; 00091 00093 int evt_count; 00094 00097 bool inUse(void) const {return use_count || reserve_mask.any();} 00098 00101 bool seen(void) const {return seen_mask.any();} 00102 00105 bool queued(void) const {return (status & SEG_QUEUED) != 0;} 00106 }; 00107 00108 //--------------------------------------- Buffer queue structure 00109 00115 class LSMP_BufferQ { 00116 public: 00118 int head; 00120 int tail; 00121 00124 LSMP_BufferQ() { 00125 init(); 00126 } 00127 00130 void init() { 00131 head = -1; 00132 tail = -1; 00133 } 00134 00137 bool empty() { 00138 return (head < 0);} 00139 00142 int length(LSMP_buffer *buf) const { 00143 int N = 0; 00144 for (int i=head ; i>=0 ;i=buf[i].link) N++; 00145 return N; 00146 } 00147 00150 void link(LSMP_buffer *buf, int ib) { 00151 buf[ib].status |= SEG_QUEUED; 00152 buf[ib].link = -1; 00153 if (head<0) head = ib; 00154 else buf[tail].link = ib; 00155 tail = ib;} 00156 00159 int remove(LSMP_buffer *buf) { 00160 int i = head; 00161 if (i >= 0) { 00162 head = buf[i].link; 00163 if (head<0) tail = -1; 00164 buf[i].link = -1; 00165 buf[i].status &= ~SEG_QUEUED;} 00166 return i;} 00167 00170 int remove(LSMP_buffer *buf, int ib) { 00171 if (ib < 0) { 00172 return ib; 00173 } else if (head == ib) { 00174 return remove(buf); 00175 } else { 00176 for (int i=head ; i>=0 ; i=buf[i].link) { 00177 if (buf[i].link == ib) { 00178 buf[i].link = buf[ib].link; 00179 if (buf[i].link < 0) tail = i; 00180 buf[ib].link = -1; 00181 buf[ib].status &= ~SEG_QUEUED; 00182 return ib; 00183 } 00184 } 00185 } 00186 return -1; 00187 } 00188 }; 00189 00190 //-------------------------------------- Shared memory structure. 00191 #define RELBUF 0x0001 // release unrequired buffers 00192 #define SCAVAGE 0x0002 // search for unused buffers 00193 #define RQSYNCH 0x0004 // synchronize on requests 00194 #define KEEP 0x0008 // Keep an unaccessed partition 00195 #define EXPOSE 0x0010 // Expose data to all consumers 00196 00204 struct LSMP_global { 00226 int status; // Status flags 00228 int version; // LSMP version number 00230 int gbl_count; // Number of accesses 00232 int gbl_semid; // global semaphore ID 00234 int nbuf; // Number of buffers 00236 int lbuf; // Buffer length 00238 LSMP_BufferQ full; // Full buffer queue 00240 LSMP_BufferQ free; // Free buffer queue 00242 char name[LSMP_LNAME]; // Partition name 00244 int ncons; // Number of active consumers 00246 int con_semid[LSMP_LMASK]; // Consumer semaphore IDs 00248 ConFlags conmask; // Consumer use mask 00249 }; 00250 00254 enum gblsem { 00255 gbl_gate, 00256 gbl_empty, 00257 gbl_full, 00258 gbl_synch, 00259 gbl_nsems 00260 }; 00261 00266 struct LSMP_consbk { 00268 int mxbuf; 00270 int trig_mask; 00272 int min_time; 00274 int min_sep; 00276 int time_ctr; 00278 int skip_ctr; 00279 00287 int seg_ctr; 00289 int seg_tot; 00291 int flags; 00293 pid_t pid; 00294 00299 bool isReadAll(void) const {return (flags & READALL) != 0;} 00300 00304 void clrWait(void) {flags &= ~EVWAIT;} 00305 00309 void setWait(void) {flags |= EVWAIT;} 00310 }; 00311 00312 //-------------------------------------- Define the semctl union 00313 // Note: This is now necessary on most systems in use by LIGO: sun, linux 00314 // and hpux. Other systems (e.g. AIX and Irix) may choke on this, 00315 // but for now it's easier to leave it in unconditionally. 00318 union semun { 00320 int val; 00322 struct semid_ds *buf; 00324 unsigned short *array; 00325 }; 00326 00327 #endif
1.5.4