/* Default shared memory segment size. Each segment is the *
* same size. Maximum size is system-dependent (SHMMAX). */
#define SHM_SEGMENT_SIZE 65536
/* Maximum value of a semaphore. This is system-dependent (SEMVMX). */
#define MAX_SEM 32766
/* Lock constants used internally by us. They happen to be the same *
* as for flock(), but that's purely coincidental */
#ifndef LOCK_SH
#define LOCK_SH 1
#endif
#ifndef LOCK_EX
#define LOCK_EX 2
#endif
#ifndef LOCK_NB
#define LOCK_NB 4
#endif
#ifndef LOCK_UN
#define LOCK_UN 8
#endif
/* Structure at the top of every shared memory segment. *
* next_shmid is used to construct a linked-list of *
* segments. length is unused, except for the first *
* segment. */
typedef
struct
{
key_t next_shmid;
int
length;
unsigned
int
shm_state;
unsigned
int
version;
} Header;
/* Structure for the per-process segment list. This list *
* is similar to the shared memory linked-list, but contains *
* the actual shared memory addresses returned from the *
* shmat() calls. Since the addresses are mapped into each *
* process's data segment, we cannot make them global. *
* This linked-list may be shorter than the shared memory *
* linked-list -- nodes are added on to this list on an *
* as-needed basis */
typedef
struct
node {
int
shmid;
Header *shmaddr;
struct
node *next;
} Node;
/* The primary structure for this library. We pass this back *
* and forth to perl */
typedef
struct
{
key_t key;
key_t next_key;
int
segment_size;
int
data_size;
int
flags;
int
semid;
short
lock;
Node *head;
Node *tail;
unsigned
int
shm_state;
unsigned
int
version;
} Share;
/* prototypes */
Share *new_share( key_t key,
int
segment_size,
int
flags );
int
write_share( Share * share,
char
*data,
int
length );
int
read_share( Share * share,
char
**data );
int
destroy_share( Share * share,
int
rmid );
int
sharelite_lock( Share * share,
int
flags );
int
sharelite_unlock( Share * share );
int
sharelite_num_segments( Share * share );
unsigned
int
sharelite_version( Share * share );