Листинг 5.27.Функция mq_receive: первая половина
//my_pxmsg_mmap/mq_receive.с
1 #include "unpipc.h"
2 #include "mqueue.h"
3 ssize_t
4 mymq_receive(mymqd_t mqd, char *ptr, size_t maxlen, unsigned int *priop)
5 {
6 int n;
7 long index;
8 int8_t *mptr;
9 ssize_t len;
10 struct mymq_hdr *mqhdr;
11 struct mymq_attr *attr;
12 struct mymsg_hdr *msghdr;
13 struct mymq_info *mqinfo;
14 mqinfo = mqd;
15 if (mqinfo->mqi_magic != MQI_MAGIC) {
16 errno = EBADF;
17 return(-1);
18 }
19 mqhdr = mqinfo->mqi_hdr; /* указатель struct */
20 mptr = (int8_t *) mqhdr; /* указатель на байт */
21 attr = &mqhdr->mqh_attr;
22 if ((n = pthread_mutex_lock(&mqhdr->mqh_lock)) != 0) {
23 errno = n;
24 return(-1);
25 }
26 if (maxlen < attr->mq_msgsize) {
27 errno = EMSGSIZE;
28 goto err;
29 }
30 if (attr->mq_curmsgs = 0) { /* очередь пуста */
31 if (mqinfo->mqi_flags & O_NONBLOCK) {
32 errno = EAGAIN;
33 goto err;
34 }
35 /* ожидаем помещения сообщения в очередь */
36 mqhdr->mqh_nwait++;
37 while (attr->mq_curmsgs == 0)
38 pthread_cond_wait(&mqhdr->mqh_wait, &mqhdr->mqh_lock);
39 mqhdr->mqh_nwait--;
40 }