1 2 /* 3 * Copyright (c) 2002, Intel Corporation. All rights reserved. 4 * Created by: crystal.xiong REMOVE-THIS AT intel DOT com 5 * This file is licensed under the GPL license. For the full content 6 * of this license, see the COPYING file at the top level of this 7 * source tree. 8 * 9 * 1. Two threads sending/receiving on different message queue. 10 * 2. Set different Priority to the messages in the message queue, to 11 * see whether the highest priority is received first. 12 */ 13 14 #include <stdio.h> 15 #include <unistd.h> 16 #include <fcntl.h> 17 #include <stdlib.h> 18 #include <sys/wait.h> 19 #include <sys/mman.h> 20 #include <string.h> 21 #include <getopt.h> 22 #include <pthread.h> 23 #include <limits.h> 24 #include <mqueue.h> 25 26 #include "posixtest.h" 27 28 #define MQ_NAME_1 "/testmsg1" 29 #define MQ_NAME_2 "/testmsg2" 30 #define MSG_SIZE 128 31 #define MAX_MSG 3 32 33 const char *s_msg_ptr[] = { "msg test 1", "msg test 2", "msg test 3" }; 34 35 char r_msg_ptr_1[MAX_MSG][MSG_SIZE]; 36 char r_msg_ptr_2[MAX_MSG][MSG_SIZE]; 37 pthread_t send1, send2, rev1, rev2; 38 39 int *send_1(void *mq) 40 { 41 int i; 42 mqd_t mq1 = *(mqd_t *) mq; 43 44 printf("Enter into send_1 \n"); 45 for (i = 0; i < MAX_MSG; i++) { 46 if (-1 == mq_send(mq1, s_msg_ptr[i], MSG_SIZE, i)) { 47 perror("mq_send doesn't return success \n"); 48 pthread_exit((void *)1); 49 } 50 printf("[%d] send '%s' in thread send_1. \n", i + 1, 51 s_msg_ptr[i]); 52 } 53 pthread_exit(NULL); 54 55 } 56 57 int *send_2(void *mq) 58 { 59 int i; 60 mqd_t mq2 = *(mqd_t *) mq; 61 62 printf("Enter into send_2 \n"); 63 for (i = 0; i < MAX_MSG; i++) { 64 if (-1 == mq_send(mq2, s_msg_ptr[i], MSG_SIZE, i)) { 65 perror("mq_send doesn't return success \n"); 66 pthread_exit((void *)1); 67 } 68 printf("[%d] send '%s' in thread send_2. \n", i + 1, 69 s_msg_ptr[i]); 70 } 71 pthread_exit(NULL); 72 } 73 74 int *receive_1(void *mq) 75 { 76 int i; 77 mqd_t mq1 = *(mqd_t *) mq; 78 79 printf("Enter into receive_1 \n"); 80 for (i = 0; i < MAX_MSG; i++) { 81 if (-1 == mq_receive(mq1, r_msg_ptr_1[i], MSG_SIZE, NULL)) { 82 perror("mq_receive doesn't return success \n"); 83 pthread_exit((void *)1); 84 } 85 printf("[%d] receive '%s' in thread receive_1. \n", i + 1, 86 r_msg_ptr_1[i]); 87 } 88 pthread_exit(NULL); 89 } 90 91 int *receive_2(void *mq) 92 { 93 int i; 94 mqd_t mq2 = *(mqd_t *) mq; 95 96 printf("Enter into receive_2 \n"); 97 for (i = 0; i < MAX_MSG; i++) { 98 if (-1 == mq_receive(mq2, r_msg_ptr_2[i], MSG_SIZE, NULL)) { 99 perror("mq_receive doesn't return success \n"); 100 pthread_exit((void *)1); 101 } 102 printf("[%d] receive '%s' in thread receive_2. \n", i + 1, 103 r_msg_ptr_2[i]); 104 } 105 pthread_exit(NULL); 106 } 107 108 int main(void) 109 { 110 111 mqd_t mq1 = 0, mq2 = 0; 112 struct mq_attr mqstat; 113 int oflag = O_CREAT | O_NONBLOCK | O_RDWR; 114 115 memset(&mqstat, 0, sizeof(mqstat)); 116 mqstat.mq_maxmsg = MAX_MSG; 117 mqstat.mq_msgsize = MSG_SIZE; 118 mqstat.mq_flags = 0; 119 120 if ((mq1 = mq_open(MQ_NAME_1, oflag, 0777, &mqstat)) == -1) { 121 printf("mq_open doesn't return success \n"); 122 return PTS_UNRESOLVED; 123 } 124 if ((mq2 = mq_open(MQ_NAME_2, oflag, 0777, &mqstat)) == -1) { 125 printf("mq_open doesn't return success \n"); 126 return PTS_UNRESOLVED; 127 } 128 pthread_create(&send1, NULL, (void *)send_1, (void *)&mq1); 129 pthread_create(&send2, NULL, (void *)send_2, (void *)&mq2); 130 pthread_create(&rev1, NULL, (void *)receive_1, (void *)&mq1); 131 pthread_create(&rev2, NULL, (void *)receive_2, (void *)&mq2); 132 pthread_join(send1, NULL); 133 pthread_join(send2, NULL); 134 pthread_join(rev1, NULL); 135 pthread_join(rev2, NULL); 136 137 mq_close(mq1); 138 mq_close(mq2); 139 mq_unlink(MQ_NAME_1); 140 mq_unlink(MQ_NAME_2); 141 return PTS_PASS; 142 } 143