©2004 by Marc J. Rochkind. All rights reserved. Portions marked "Open Source" may be copied under license.

 

Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

c7/uem.h

Go to the documentation of this file.
00001 /*
00002     Copyright 2003 by Marc J. Rochkind. All rights reserved. (Will be released for free public use upon publication of a forthcoming book. For now, released only for review purposes.)
00003 */
00004 #ifndef _UEM_H_
00005 #define _UEM_H_
00006 
00007 #ifdef SOLARIS // must be changed
00008 #define POSIX_IPC
00009 #endif
00010 
00011 #include <pthread.h>
00012 #include <sys/select.h>
00013 #ifdef POSIX_IPC
00014 #include <mqueue.h>
00015 #include <semaphore.h>
00016 #endif
00017 /*[UEM_TYPE]*/
00018 enum UEM_TYPE {
00019     UEM_SVMSG,      /* System V message */
00020     UEM_PXMSG,      /* POSIX message */
00021     UEM_SVSEM,      /* System V semaphore */
00022     UEM_PXSEM,      /* POSIX semaphore */
00023     UEM_FD_READ,    /* file-descriptor set - read */
00024     UEM_FD_WRITE,   /* file-descriptor set - write */
00025     UEM_FD_ERROR,   /* file-descriptor set  - error */
00026     UEM_SIG,        /* signal */
00027     UEM_PROCESS,    /* process */
00028     UEM_HEARTBEAT,  /* heartbeat */
00029     UEM_NONE        /* none */
00030 };
00031 /*[uem_reg]*/
00032 struct uem_reg {
00033     enum UEM_TYPE ur_type;          /* type of registration */
00034     pthread_t ur_tid;               /* thread ID */
00035     union {
00036         int ur_mqid;                /* System V message-queue ID */
00037         struct {
00038             int s_semid;            /* System V semaphore-set ID */
00039             struct sembuf *s_sops;  /* semaphore operations */
00040         } ur_svsem;
00041 #ifdef POSIX_IPC
00042         mqd_t ur_mqd;               /* POSIX message-queue descriptor */
00043         sem_t *ur_sem;              /* POSIX semaphore */
00044 #endif
00045         int ur_signum;              /* signal number */
00046         pid_t ur_pid;               /* process ID */
00047         long ur_usecs;              /* microseconds (for heartbeat) */
00048         fd_set ur_fdset;            /* file-descriptor set */
00049     } ur_resource;
00050     void *ur_data;                  /* data to be queued with event */
00051     size_t ur_size;                 /* size (used for various purposes) */
00052 };
00053 /*[uem_event]*/
00054 struct uem_event {
00055     struct uem_reg *ue_reg;
00056     void *ue_buf;
00057     ssize_t ue_result;
00058     int ue_errno;
00059     struct uem_event *ue_next;
00060 };
00061 /*[]*/
00062 
00063 bool uem_bgn(void);
00064 bool uem_end(void);
00065 bool uem_register_svmsg(int mqid, size_t msgsize, void *data);
00066 bool uem_register_svsem(int semid, struct sembuf *sops, size_t nsops,
00067   void *data);
00068 #ifdef POSIX_IPC
00069 bool uem_register_pxmsg(mqd_t mqd, void *data);
00070 bool uem_register_pxsem(sem_t *sem, void *data);
00071 #endif
00072 bool uem_register_signal(int signum, void *data);
00073 bool uem_register_process(pid_t pid, void *data); /* also array of pids? */
00074 bool uem_register_fdset(int nfds, fd_set *fdset, enum UEM_TYPE type,
00075   void *data);
00076 bool uem_register_heartbeat(long usecs, void *data);
00077 
00078 struct uem_event *uem_wait(void);
00079 void uem_free(struct uem_event *e);
00080 bool uem_unregister(struct uem_event *e);
00081 
00082 // call to unregister?
00083 // is it the same as cancelling the thread that blocks?
00084 
00085 #endif

Generated on Fri Apr 23 10:57:01 2004 for AUP2 Example Source by doxygen 1.3.1