lsmp/lsmp_int.hh

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

Generated on Sun Mar 8 19:20:51 2009 for dmt by  doxygen 1.5.4