В листинге 5.26 приведена вторая половина функции mq_send. К моменту ее выполнения мы уже знаем о наличии в очереди свободного места для нашего сообщения.
71 /* очередь была пуста или новое письмо добавлено к концу списка */
72 pmsghdr->msg_next = freeindex;
73 nmsghdr->msg_next = 0;
74 }
75 /* запускаем любой из процессов, заблокированных в mq_receive */
76 if (attr->mq_curmsgs == 0)
77 pthread_cond_signal(&mqhdr->mqh_wait);
78 attr->mq_curmsgs++;
79 pthread_mutex_unlock(&mqhdr->mqh_lock);
80 return(0);
81 err:
82 pthread_mutex_unlock(&mqhdr->mqh lock);
83 return(-1);
84 }
Получение индекса свободного блока
50-52 Поскольку количество свободных сообщений при создании очереди равно mq_maxmsg, ситуация, в которой mq_curmsgs будет меньше mq_maxmsg для пустого списка свободных сообщений, возникнуть не может.
Копирование сообщения
53-56 Указатель nmsghdr хранит адрес области памяти, в которую помещается сообщение. Приоритет и длина сообщения сохраняются в структуре msg_hdr, а затем в память копируется содержимое сообщения, переданного вызвавшим процессом.
Помещение нового сообщения в соответствующее место связного списка
57-74 Порядок сообщений в нашем списке зависит от их приоритета: они расположены в порядке его убывания. При добавлении нового сообщения мы проверяем, существуют ли сообщения с тем же приоритетом; в этом случае сообщение добавляется после последнего из них. Используя такой метод упорядочения, мы гарантируем, что mq_receive всегда будет возвращать старейшее сообщение с наивысшим приоритетом. По мере продвижения по списку мы сохраняем в pmsghdr адрес предыдущего сообщения, поскольку именно это сообщение будет хранить индекс нового сообщения в поле msg_next.