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