Home | History | Annotate | Download | only in mqueues
      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