#define BUCKSIZE 524288
#define MAXQ 512
#define MAXFDS 64
#define MAXHOLD 2048
#define SMBUF 256
#define HUBNUM 32
/* A Hub is an abstraction that is like a pipe with multiple attachments on each end */
/* in general all clients receive all messages and writes are first-come first served */
typedef struct Hub Hub;
struct Hub{
char name[SMBUF]; /* name */
char bucket[BUCKSIZE]; /* data buffer */
int hubstate; /* control switch */
int sleeptime; /* heuristic sleep timer */
int infds[MAXFDS]; /* input file descriptors */
int outfds[MAXFDS]; /* output file descriptors */
int infdcount; /* total number of inclients */
int outfdcount; /* total number of outclients */
int infdpids[MAXFDS]; /* input listener process IDs */
int outfdpids[MAXFDS]; /* output writer process IDs */
int infdstat[MAXFDS]; /* status of reading processes */
int outfdstat[MAXFDS]; /* status of writing processes */
char *inbuckp; /* location to store next message */
int inqsize[MAXQ]; /* incoming message length index */
char *msgptr[MAXQ]; /* message starting location index */
int inqcount; /* total number of messages received */
int outq[MAXFDS]; /* message index queue for output writers */
QLock iblck; /* locks for the inputbucket and queues */
QLock wroblck[MAXFDS]; /* individual lock for each writer proc */
QLock entwrlck; /* lock for releasing subwriter locks */
};
enum flags{
GO = 1,
STOP = 2,
UP = 3,
DOWN = 4,
};
char *srvname; /* name posted in /srv */
char dirname[SMBUF]; /* tmp directory name */
int masterswitch; /* one flag to rule them all */
int verbosity; /* debugging output toggle */
int fdctl; /* fd for control server input */
int sleepdefault; /* default sleep timer milliseconds */
int fdcounter; /* extrafd array counter for pipe fds */
int hubmon[HUBNUM]; /* external hub status monitor flag array */
char nohold; /* determines if fds will be held for safety */
int extrafds[MAXHOLD]; /* holds pipe (3) fds so they dont vanish */
int paranoia; /* locks reader speed to writer speed */
int ketchup; /* monitors paranoia justification */
/* An array of pointers to Hubs is the outer layer of the data structures */
/* As it is allocated, each Hub uses BUCKSIZE memory */
/* The HUBNUM limit is a pragmatic limit on maximum possible memory consumption */
Hub *Hubs[HUBNUM];
|