на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить




Листинг 5.28. Функция mq_receive: вторая половина

//my_pxmsg_mmap/mq_receive.c

41  if ((index = mqhdr->mqh_head) == 0)

42   err_dump("mymq_receive: curmsgs = %ld; head = 0", attr->mq_curmsgs);

43  msghdr = (struct mymsg_hdr *) &mptr[index];

44  mqhdr->mqh_head = msghdr->msg_next; /* новое начало списка */

45  len = msghdr->msg_len;

46  memcpy(ptr, msghdr + 1, len); /* копирование самого сообщения */

47  if (priop != NULL)

48   *priop = msghdr->msg_prio;

49  /* только что считанное сообщение становится первым в списке пустых */

50  msghdr->msg_next = mqhdr->mqr_free;

51  mqhdr->mqh_free = index;

52  /* запуск любого процесса, заблокированного в вызове mq_send */

53  if (attr->mq_curmsgs == attr->mq_maxmsg)

54   pthread_cond_signal(&mqhdr->mqh_wait);

55  attr->mq_curmsgs--;

56  pthread_mutex_unlock(&mqhdr->mqh_lock);

57  return(len);

58 err:

59  pthread_mutex_unlock(&mqhdr->mqh_lock);

60  return(-1);

61 }


Листинг 5.27.Функция mq_receive: первая половина | UNIX: взаимодействие процессов | Возвращение сообщения вызвавшему процессу