/* local definitions needed by mq routines */ #include #include /* a message */ typedef struct { unsigned int type; char text[1]; } MSG; union semun { int val; struct semid_ds *buf; unsigned short *array; } arg; /* * One of these structures is malloced to describe any open message queue * each time mq_open is called. */ struct libc_mq; struct libc_mq { int index; /* index of this message queue */ int msgqid; /* value returned by msgget */ int semid; /* semaphore id */ int fd; /* fd of shared memory file */ int oflag; /* original open flag used */ int th; /* thread id for mq_notify */ char *name; /* name used */ MSG *wrbuf; /* msg write buffer */ MSG *rdbuf; /* msg read buffer */ struct mq_attr *attr; /* pointer to attribute structure */ struct sigevent *sigevent; /* used for mq_notify */ void (*cleanup_notify)(struct libc_mq *); /* also used for mq_notify */ struct libc_mq *next; /* next info struct in hash table */ }; extern struct libc_mq *__find_mq (mqd_t mq); extern void __cleanup_mq (mqd_t mq); extern void __cleanup_mq_notify (struct libc_mq *ptr); #define MSGQ_PREFIX "/dev/shm/__MSGQ__"