1*10465441SEvalZero #include <stdio.h>
2*10465441SEvalZero #include <fcntl.h>
3*10465441SEvalZero #include <stdlib.h>
4*10465441SEvalZero #include <string.h>
5*10465441SEvalZero #include <pthread.h>
6*10465441SEvalZero #include <mqueue.h>
7*10465441SEvalZero
8*10465441SEvalZero #define MQ_NAME_1 "testmsg1"
9*10465441SEvalZero #define MQ_NAME_2 "testmsg2"
10*10465441SEvalZero #define MSG_SIZE 128
11*10465441SEvalZero #define MAX_MSG 3
12*10465441SEvalZero
13*10465441SEvalZero const char *s_msg_ptr[] = {"msg test 1", "msg test 2", "msg test 3"};
14*10465441SEvalZero char r_msg_ptr_1[MAX_MSG][MSG_SIZE];
15*10465441SEvalZero char r_msg_ptr_2[MAX_MSG][MSG_SIZE];
16*10465441SEvalZero pthread_t send1, send2, rev1, rev2;
17*10465441SEvalZero
send_1(void * mq)18*10465441SEvalZero int * send_1(void * mq)
19*10465441SEvalZero {
20*10465441SEvalZero int i;
21*10465441SEvalZero mqd_t mq1 = *(mqd_t *)mq;
22*10465441SEvalZero
23*10465441SEvalZero printf("Enter into send_1 \n");
24*10465441SEvalZero for (i = 0; i < MAX_MSG; i++ ) {
25*10465441SEvalZero if ( -1 == mq_send(mq1, s_msg_ptr[i], MSG_SIZE, i)) {
26*10465441SEvalZero perror("mq_send doesn't return success \n");
27*10465441SEvalZero pthread_exit((void *)1);
28*10465441SEvalZero }
29*10465441SEvalZero printf("[%d] send '%s' in thread send_1. \n", i+1, s_msg_ptr[i]);
30*10465441SEvalZero }
31*10465441SEvalZero pthread_exit((void *)0);
32*10465441SEvalZero
33*10465441SEvalZero }
34*10465441SEvalZero
send_2(void * mq)35*10465441SEvalZero int * send_2(void * mq)
36*10465441SEvalZero {
37*10465441SEvalZero int i;
38*10465441SEvalZero mqd_t mq2 = *(mqd_t *)mq;
39*10465441SEvalZero
40*10465441SEvalZero printf("Enter into send_2 \n");
41*10465441SEvalZero for (i = 0; i < MAX_MSG; i++ ) {
42*10465441SEvalZero if ( -1 == mq_send(mq2, s_msg_ptr[i], MSG_SIZE, i)) {
43*10465441SEvalZero perror("mq_send doesn't return success \n");
44*10465441SEvalZero pthread_exit((void *)1);
45*10465441SEvalZero }
46*10465441SEvalZero printf("[%d] send '%s' in thread send_2. \n", i+1, s_msg_ptr[i]);
47*10465441SEvalZero }
48*10465441SEvalZero pthread_exit((void *)0);
49*10465441SEvalZero }
50*10465441SEvalZero
receive_1(void * mq)51*10465441SEvalZero int * receive_1(void * mq)
52*10465441SEvalZero {
53*10465441SEvalZero int i;
54*10465441SEvalZero mqd_t mq1 = *(mqd_t *)mq;
55*10465441SEvalZero
56*10465441SEvalZero printf("Enter into receive_1 \n");
57*10465441SEvalZero for (i = 0; i< MAX_MSG; i++) {
58*10465441SEvalZero if ( -1 == mq_receive(mq1, r_msg_ptr_1[i], MSG_SIZE, NULL) ) {
59*10465441SEvalZero perror("mq_receive doesn't return success \n");
60*10465441SEvalZero pthread_exit((void *)1);
61*10465441SEvalZero }
62*10465441SEvalZero printf("[%d] receive '%s' in thread receive_1. \n", i+1, r_msg_ptr_1[i]);
63*10465441SEvalZero }
64*10465441SEvalZero pthread_exit((void *)0);
65*10465441SEvalZero }
receive_2(void * mq)66*10465441SEvalZero int * receive_2(void * mq)
67*10465441SEvalZero {
68*10465441SEvalZero int i;
69*10465441SEvalZero mqd_t mq2 = *(mqd_t *)mq;
70*10465441SEvalZero
71*10465441SEvalZero printf("Enter into receive_2 \n");
72*10465441SEvalZero for (i = 0; i< MAX_MSG; i++) {
73*10465441SEvalZero if ( -1 == mq_receive(mq2, r_msg_ptr_2[i], MSG_SIZE, NULL) ) {
74*10465441SEvalZero perror("mq_receive doesn't return success \n");
75*10465441SEvalZero pthread_exit((void *)1);
76*10465441SEvalZero }
77*10465441SEvalZero printf("[%d] receive '%s' in thread receive_2. \n", i+1, r_msg_ptr_2[i]);
78*10465441SEvalZero }
79*10465441SEvalZero pthread_exit((void *)0);
80*10465441SEvalZero }
81*10465441SEvalZero
libc_mq()82*10465441SEvalZero int libc_mq()
83*10465441SEvalZero {
84*10465441SEvalZero mqd_t mq1 = 0, mq2 = 0;
85*10465441SEvalZero struct mq_attr mqstat;
86*10465441SEvalZero int oflag = O_CREAT|O_RDWR;
87*10465441SEvalZero
88*10465441SEvalZero memset(&mqstat, 0, sizeof(mqstat));
89*10465441SEvalZero mqstat.mq_maxmsg = MAX_MSG;
90*10465441SEvalZero mqstat.mq_msgsize = MSG_SIZE;
91*10465441SEvalZero mqstat.mq_flags = 0;
92*10465441SEvalZero
93*10465441SEvalZero if( ((mqd_t) -1) == (mq1 = mq_open(MQ_NAME_1,oflag,0777, &mqstat)) ) {
94*10465441SEvalZero printf("mq_open doesn't return success \n");
95*10465441SEvalZero return -1;
96*10465441SEvalZero }
97*10465441SEvalZero if( ((mqd_t) -1) == (mq2 = mq_open(MQ_NAME_2,oflag,0777, &mqstat)) ) {
98*10465441SEvalZero printf("mq_open doesn't return success \n");
99*10465441SEvalZero return -1;
100*10465441SEvalZero }
101*10465441SEvalZero pthread_create(&send1, NULL, (void *)send_1, (void *)&mq1);
102*10465441SEvalZero pthread_create(&send2, NULL, (void *)send_2, (void *)&mq2);
103*10465441SEvalZero pthread_create(&rev1, NULL, (void *)receive_1, (void *)&mq1);
104*10465441SEvalZero pthread_create(&rev2, NULL, (void *)receive_2, (void *)&mq2);
105*10465441SEvalZero pthread_join(send1, NULL);
106*10465441SEvalZero pthread_join(send2, NULL);
107*10465441SEvalZero pthread_join(rev1, NULL);
108*10465441SEvalZero pthread_join(rev2, NULL);
109*10465441SEvalZero
110*10465441SEvalZero mq_close(mq1);
111*10465441SEvalZero mq_close(mq2);
112*10465441SEvalZero mq_unlink(MQ_NAME_1);
113*10465441SEvalZero mq_unlink(MQ_NAME_2);
114*10465441SEvalZero
115*10465441SEvalZero printf("PASSED\n");
116*10465441SEvalZero return 0;
117*10465441SEvalZero }
118*10465441SEvalZero #include <finsh.h>
119*10465441SEvalZero FINSH_FUNCTION_EXPORT(libc_mq, posix mqueue test);
120