]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - tools/regression/mqueue/mqtest4/mqtest4.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / tools / regression / mqueue / mqtest4 / mqtest4.c
1 /* $FreeBSD$ */
2 #include <stdio.h>
3 #include <mqueue.h>
4 #include <fcntl.h>
5 #include <signal.h>
6 #include <unistd.h>
7 #include <sys/select.h>
8 #include <sys/event.h>
9
10 #define MQNAME  "/mytstqueue4"
11 #define LOOPS   1000
12 #define PRIO    10
13
14 void sighandler(int sig)
15 {
16         write(1, "timeout\n", 8);
17         _exit(1);
18 }
19
20 int main()
21 {
22         mqd_t mq;
23         int status;
24         struct mq_attr attr;
25         int pid;
26         fd_set set;
27         int kq;
28         struct kevent kev;
29
30         mq_unlink(MQNAME);
31
32         attr.mq_maxmsg  = 5;
33         attr.mq_msgsize = 128;
34         mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
35         if (mq == (mqd_t) -1)
36                 err(1, "mq_open()");
37         status = mq_getattr(mq, &attr);
38         if (status)
39                 err(1, "mq_getattr()");
40         pid = fork();
41         if (pid == 0) { /* child */
42                 int prio, j, i;
43                 char *buf;
44
45                 mq_close(mq);
46                 kq = kqueue();
47                 mq = mq_open(MQNAME, O_RDWR);
48                 if (mq == (mqd_t)-1)
49                         err(1, "child: mq_open");
50                 EV_SET(&kev, __mq_oshandle(mq), EVFILT_READ, EV_ADD, 0, 0, 0);
51                 status = kevent(kq, &kev, 1, NULL, 0, NULL);
52                 if (status == -1)
53                         err(1, "child: kevent");
54                 buf = malloc(attr.mq_msgsize);
55                 for (j = 0; j < LOOPS; ++j) {
56                         alarm(3);
57                         status = kevent(kq, NULL, 0, &kev, 1, NULL);
58                         if (status != 1)
59                                 err(1, "child: kevent 2");
60                         status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
61                         if (status == -1)
62                                 err(2, "child: mq_receive");
63                         for (i = 0; i < attr.mq_msgsize; ++i)
64                                 if (buf[i] != i)
65                                         err(3, "child: message data corrupted");
66                         if (prio != PRIO)
67                                 err(4, "child: priority is incorrect: %d",
68                                          prio);
69                 }
70                 alarm(0);
71                 free(buf);
72                 mq_close(mq);
73                 return (0);
74         } else if (pid == -1) {
75                 err(1, "fork()");
76         } else {
77                 char *buf;
78                 int i, j, prio;
79
80                 signal(SIGALRM, sighandler);
81                 kq = kqueue();
82                 EV_SET(&kev, __mq_oshandle(mq), EVFILT_WRITE, EV_ADD, 0, 0, 0);
83                 status = kevent(kq, &kev, 1, NULL, 0, NULL);
84                 if (status == -1)
85                         err(1, "kevent");
86                 buf = malloc(attr.mq_msgsize);
87                 for (j = 0; j < LOOPS; ++j) {
88                         for (i = 0; i < attr.mq_msgsize; ++i) {
89                                 buf[i] = i;
90                         }
91                         alarm(3);
92                         status = kevent(kq, NULL, 0, &kev, 1, NULL);
93                         if (status != 1)
94                                 err(1, "child: kevent 2");
95                         status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
96                         if (status) {
97                                 err(2, "mq_send()");
98                         }
99                 }
100                 free(buf);
101                 alarm(3);
102                 wait(&status);
103                 alarm(0);
104         }
105         status = mq_close(mq);
106         if (status)
107                 err(1, "mq_close");
108         mq_unlink(MQNAME);
109         return (0);
110 }