/*PBM_DEFS.H of 13-Oct-1993 30-May-1991. PAE. Initial version. This is the include file full of useful definitions for the portable buffer manager. NOTE that these are all given store space within a shared memory area and so we cannot use pointers within these 'struct' definitions else things will fail on VMS 31-May-1991. PAE. Add more per_process definitions and storage. Have to include PDSA definition file so that can get smooth way to get back PDSA pointers. 2-Jun-1991. PAE. Also need pointer to THIS stage header in per-process space. PLUS add some error code definitions. 9-OCT-1991. PAE. OK for POSIX/VOS/OS9 - but beware some things HAVE to be different in different environments. 12-Oct-1991. PAE. Remove some conditionals - edits lost once already LATER: define NOEMU and VMSNOSEM in _POSIX_SOURCE case - $CC line wont 13-Oct-1991. PAE. Change signal masking a bit 20-Oct-1991. PAE. For version 6 - changes to permit re-ordering of events. 23-Oct-1991. PAE. Add some definitions for pbm_d_evstat word. 27-Oct-1991. PAE. More changes for FARM and FIELD stages. 28-Oct-1991. PAE. Make sure we use BITS in PBM_TYPE_ definitions 4-Jun-1992. PAE. Add storage for address of users closedown routine 16-Sep-1992. PAE. Remove NOEMU definition 12-Dec-1992. PAE. Use size_t for objects that may contain addresses. 5-Jan-1993. PAE. size_t defined in pdsa_defs, not here 7-Sep-1993. PAE. Include proper function profile definitions. 13-Oct-1993. PAE. Add another int to struct pbm_stage to make it octaword long. Else get unaligned access on AXPOSF */ #include "pdsa_defs.h" #ifdef _POSIX_SOURCE #include #include #endif /*define a structure for the stream header*/ struct pbm_header { int pbm_numstages ; /*number of stages in this stream*/ int pbm_numdescr ; /*number of descriptors*/ int pbm_memsize ; /*size of the memory if this stream*/ int pbm_pool ; /*index to first free descriptor, -1 if none*/ int pbm_streamno ; /*number of this stream*/ int pbm_lockid ; /*OS9 event ID for interlock, VMSNOSEM work space*/ } ; /*now a stage header. PRODUCER stage will be immediately after stream head*/ struct pbm_stage { int pbm_sh_next ; /*index to next stage, -1 if none*/ int pbm_sh_curdescr ; /*index of current descriptor*/ int pbm_sh_queue ; /*queue header for this stage -1 if none*/ int pbm_sh_usage ; /*usage counter this stage*/ int pbm_sh_lastevsn ; /*last event seen by this stage*/ int pbm_sh_sumsize ; /*summed allocated size*/ int pbm_sh_sumlen ; /*summed used length*/ int pbm_sh_type ; /*type of stage*/ #define PBM_TYPE_PROD 1 /*producer stage*/ #define PBM_TYPE_CONS 2 /*normal consumer*/ #define PBM_TYPE_RAND 4 /*random consumer*/ #define PBM_TYPE_FARM 8 /*can farm out */ #define PBM_TYPE_REORDER 16 /*can reorder*/ #define PBM_TYPE_FIELD 32 /*is one of a 'field' [sown by he FARMer !]*/ int pbm_sh_status ; /*status word*/ #define PBM_STAT_ALLOC 1 /*bit values rather than numbers*/ #define PBM_STAT_ATTACH 2 /*set if attached*/ #define PBM_STAT_WAIT 4 /*set while waiting for pool or memory [producer]*/ char pbm_sh_name[12] ; /*name of this stage used for notification*/ int pbm_sh_pid ; /*process id for signals if OS9 or POSIX*/ int pbm_sh_filler ; /*to make the thing octaword align OK*/ } ; /*now define the descriptor contents*/ struct pbm_descr { int pbm_d_next ; /*index to next in queue*/ size_t pbm_d_bufadr ; /*buffer address relative to start of memory*/ int pbm_d_bufsize ; /*size of this buffer in bytes*/ int pbm_d_evlen ; /*actual event length*/ int pbm_d_evsn ; /*event serial number*/ int pbm_d_runno ; /*run number*/ int pbm_d_evstat ; /*status word for this event*/ #define PBM_D_FIRST 1 /*first event of run*/ #define PBM_D_SWEEPER 2 /*sweeper at end run*/ #define PBM_D_CRASH 4 /*this event caused comsumer crash*/ int pbm_d_user1 ; /*word for users to play with*/ int pbm_d_user2 ; /*and another*/ int pbm_d_parity ; /*parity and checksum may get setup for testing*/ int pbm_d_chksum ; int pbm_d_trigw[4] ; /*128bits of trigger word*/ } ; /*After pbm_init and pbm_attach calls a per-process struct can be set up containing POINTERS and thus giving quick access to these areas*/ struct pbm_ptr { struct pbm_header *header ; /*points to start of shared memory*/ struct pbm_stage *stage0 ; /*points to PRODUCER stage*/ struct pbm_stage *spc ; /*points to current stage*/ struct pbm_descr *descr0 ; /*points to start of descriptors*/ int pbm_lock ; /*handle for the interlock semaphore*/ int pbm_notify ; /*handle for listen for notification*/ int user_bits ; /*used for CLOSING bit recognition etc*/ #define CLOSING 4096 /*same as in sk_defs*/ #define EVENT_SIG 2048 /*used to signal presence of event*/ #ifdef _POSIX_SOURCE sigset_t disable_mask ; /*mask to disable signals at critical time */ sigset_t current_mask ; /*used in pbm_waitsig to store what we want*/ struct sigaction pbm_sig ; /*structure for event signal action*/ #endif struct pdsa_ptr pdsa; /*reserve space for PDSA info as well*/ void (*pbm_closedown)(); /*pointer to users closedown routine*/ } ; #define PBM_MAXSTR 4 /*maximum number of streams declarable*/ /*some error return codes [ ZERO means OK ]*/ #define PBM_ER_NOATTACH 1 #define PBM_ER_NOTPROD 2 #define PBM_ER_BADSIZE 3 #define PBM_ER_ISPROD 4 #define PBM_ER_NOTALLUSED 5 #define PBM_ER_ILLBUF 6 #define PBM_ER_GOTONE 7 /*try to get event or buffer when got one!!*/ #define PBM_ER_BADNAME 8 /*detach wrong name*/ /* These profiles should help to reduce illogical calls. Function profiles for the routines within the PBM library In alphabetical order. */ #ifdef __STDC__ extern void pbmq_add(int *header, int descriptor, struct pbm_ptr *uptr) ; extern void pbmq_addo(int *header, int descriptor, struct pbm_ptr *uptr) ; extern int pbmq_rem(int *header, struct pbm_ptr *uptr) ; extern int pbmq_remo(int *header, int evsn, struct pbm_ptr *uptr) ; extern int pbm_attach(char *name, struct pbm_ptr *uptr, void (*closedown)() ) ; extern int pbm_detach(char *name, struct pbm_ptr *uptr) ; extern void pbm_edecode(int code) ; extern int pbm_getbuf(int *size, int *index, struct pbm_ptr *uptr) ; extern int pbm_getevt(int *index, struct pbm_ptr *uptr) ; extern void pbm_getssm(int *result) ; extern void pbm_init( FILE *fp) ; extern void pbm_locase( char *string) ; extern void pbm_lock(struct pbm_ptr *uptr) ; extern void *pbm_mapto(char *name, int size, int *error); extern void pbm_mksem(char *name, int *id); extern void *pbm_mkshm(char *name, int size) ; extern char *pbm_nodename() ; extern void pbm_notify(struct pbm_stage *sp) ; extern int pbm_relevt(int index, struct pbm_ptr *uptr) ; extern int pbm_relmem(int index, struct pbm_ptr *uptr) ; extern void pbm_semclose(int lkid) ; extern void pbm_semopen(char *name, int *ids, int *id) ; extern void pbm_setexit(struct pbm_ptr *uptr) ; extern void pbm_sleep(int milliseconds) ; extern int pbm_start(int lastevsn, struct pbm_ptr *uptr) ; extern void pbm_unlock(struct pbm_ptr *uptr) ; extern void pbm_unmap(void *address, int size) ; extern void pbm_upcase(char *string) ; extern void pbm_waitsig(struct pbm_ptr *uptr) ; #else extern void pbmq_add(); extern void pbmq_addo(); extern int pbmq_rem(); extern int pbmq_remo(); extern int pbm_attach(); extern int pbm_detach(); extern void pbm_edecode(); extern int pbm_getbuf(); extern int pbm_getevt(); extern void pbm_getssm(); extern void pbm_init(); extern void pbm_locase(); extern void pbm_lock(); extern void *pbm_mapto(); extern void pbm_mksem(); extern void *pbm_mkshm(); extern char *pbm_nodename() ; extern void pbm_notify(); extern int pbm_relevt(); extern int pbm_relmem(); extern void pbm_semclose(); extern void pbm_semopen(); extern void pbm_setexit(); extern void pbm_sleep(); extern int pbm_start(); extern void pbm_unlock(); extern void pbm_unmap(); extern void pbm_upcase(); extern void pbm_waitsig(); #endif /*need PDSA profiles as well - in pdsa_defs.h*/ /*end of PBM_DEFS*/