00001
00002
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
00018 enum UEM_TYPE {
00019 UEM_SVMSG,
00020 UEM_PXMSG,
00021 UEM_SVSEM,
00022 UEM_PXSEM,
00023 UEM_FD_READ,
00024 UEM_FD_WRITE,
00025 UEM_FD_ERROR,
00026 UEM_SIG,
00027 UEM_PROCESS,
00028 UEM_HEARTBEAT,
00029 UEM_NONE
00030 };
00031
00032 struct uem_reg {
00033 enum UEM_TYPE ur_type;
00034 pthread_t ur_tid;
00035 union {
00036 int ur_mqid;
00037 struct {
00038 int s_semid;
00039 struct sembuf *s_sops;
00040 } ur_svsem;
00041 #ifdef POSIX_IPC
00042 mqd_t ur_mqd;
00043 sem_t *ur_sem;
00044 #endif
00045 int ur_signum;
00046 pid_t ur_pid;
00047 long ur_usecs;
00048 fd_set ur_fdset;
00049 } ur_resource;
00050 void *ur_data;
00051 size_t ur_size;
00052 };
00053
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);
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
00083
00084
00085 #endif