Add code to test POSIX message queue.
This commit is contained in:
parent
b89632601d
commit
b2bbf4f8ad
5
tools/regression/mqueue/Makefile
Normal file
5
tools/regression/mqueue/Makefile
Normal file
@ -0,0 +1,5 @@
|
||||
# $FreeBSD$
|
||||
|
||||
SUBDIR=mqtest1 mqtest2 mqtest3 mqtest4 mqtest5
|
||||
|
||||
.include <bsd.subdir.mk>
|
8
tools/regression/mqueue/mqtest1/Makefile
Normal file
8
tools/regression/mqueue/mqtest1/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG=mqtest1
|
||||
LDADD+=
|
||||
NO_MAN=
|
||||
DEBUG_FLAGS=-g
|
||||
|
||||
.include <bsd.prog.mk>
|
51
tools/regression/mqueue/mqtest1/mqtest1.c
Normal file
51
tools/regression/mqueue/mqtest1/mqtest1.c
Normal file
@ -0,0 +1,51 @@
|
||||
/* $FreeBSD$ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <mqueue.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define MQNAME "/mytstqueue1"
|
||||
|
||||
int main()
|
||||
{
|
||||
struct mq_attr attr, attr2;
|
||||
struct sigevent sigev;
|
||||
int mq;
|
||||
int status;
|
||||
|
||||
attr.mq_maxmsg = 2;
|
||||
attr.mq_msgsize = 100;
|
||||
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
|
||||
if (mq == -1)
|
||||
err(1, "mq_open");
|
||||
status = mq_unlink(MQNAME);
|
||||
if (status)
|
||||
err(1, "mq_unlink");
|
||||
status = mq_getattr(mq, &attr2);
|
||||
if (status)
|
||||
err(1, "mq_getattr");
|
||||
if (attr.mq_maxmsg != attr2.mq_maxmsg)
|
||||
err(1, "mq_maxmsg changed");
|
||||
if (attr.mq_msgsize != attr2.mq_msgsize)
|
||||
err(1, "mq_msgsize changed");
|
||||
|
||||
sigev.sigev_notify = SIGEV_SIGNAL;
|
||||
sigev.sigev_signo = SIGRTMIN;
|
||||
status = mq_notify(mq, &sigev);
|
||||
if (status)
|
||||
err(1, "mq_notify");
|
||||
status = mq_notify(mq, &sigev);
|
||||
if (status == 0)
|
||||
err(1, "mq_notify 2");
|
||||
else if (errno != EBUSY)
|
||||
err(1, "mq_notify 3");
|
||||
status = mq_notify(mq, NULL);
|
||||
if (status)
|
||||
err(1, "mq_notify 4");
|
||||
status = mq_close(mq);
|
||||
if (status)
|
||||
err(1, "mq_close");
|
||||
return (0);
|
||||
}
|
8
tools/regression/mqueue/mqtest2/Makefile
Normal file
8
tools/regression/mqueue/mqtest2/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG=mqtest2
|
||||
LDADD+=
|
||||
NO_MAN=
|
||||
DEBUG_FLAGS=-g
|
||||
|
||||
.include <bsd.prog.mk>
|
87
tools/regression/mqueue/mqtest2/mqtest2.c
Normal file
87
tools/regression/mqueue/mqtest2/mqtest2.c
Normal file
@ -0,0 +1,87 @@
|
||||
/* $FreeBSD$ */
|
||||
#include <stdio.h>
|
||||
#include <mqueue.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define MQNAME "/mytstqueue2"
|
||||
#define LOOPS 1000
|
||||
#define PRIO 10
|
||||
|
||||
void alarmhandler(int sig)
|
||||
{
|
||||
write(1, "timeout\n", 8);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
struct mq_attr attr;
|
||||
int mq, status, pid;
|
||||
|
||||
mq_unlink(MQNAME);
|
||||
|
||||
attr.mq_maxmsg = 5;
|
||||
attr.mq_msgsize = 128;
|
||||
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
|
||||
if (mq == -1)
|
||||
err(1, "mq_open");
|
||||
status = mq_getattr(mq, &attr);
|
||||
if (status)
|
||||
err(1, "mq_getattr");
|
||||
pid = fork();
|
||||
if (pid == 0) { /* child */
|
||||
int prio, j, i;
|
||||
char *buf;
|
||||
|
||||
mq_close(mq);
|
||||
|
||||
signal(SIGALRM, alarmhandler);
|
||||
|
||||
mq = mq_open(MQNAME, O_RDWR);
|
||||
if (mq == -1)
|
||||
err(1, "child: mq_open");
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
alarm(3);
|
||||
status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
|
||||
if (status == -1)
|
||||
err(2, "child: mq_receive");
|
||||
for (i = 0; i < attr.mq_msgsize; ++i)
|
||||
if (buf[i] != i)
|
||||
err(3, "child: message data corrupted");
|
||||
if (prio != PRIO)
|
||||
err(4, "child: priority is incorrect: %d",
|
||||
prio);
|
||||
}
|
||||
alarm(0);
|
||||
free(buf);
|
||||
mq_close(mq);
|
||||
return (0);
|
||||
} else if (pid == -1) {
|
||||
err(1, "fork()");
|
||||
} else {
|
||||
char *buf;
|
||||
int i, j, prio;
|
||||
|
||||
signal(SIGALRM, alarmhandler);
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
for (i = 0; i < attr.mq_msgsize; ++i)
|
||||
buf[i] = i;
|
||||
alarm(3);
|
||||
status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
|
||||
if (status)
|
||||
err(1, "mq_send");
|
||||
}
|
||||
alarm(3);
|
||||
wait(&status);
|
||||
alarm(0);
|
||||
}
|
||||
status = mq_close(mq);
|
||||
if (status)
|
||||
err(1, "mq_close");
|
||||
mq_unlink(MQNAME);
|
||||
return (0);
|
||||
}
|
8
tools/regression/mqueue/mqtest3/Makefile
Normal file
8
tools/regression/mqueue/mqtest3/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG=mqtest3
|
||||
LDADD+=
|
||||
NO_MAN=
|
||||
DEBUG_FLAGS=-g
|
||||
|
||||
.include <bsd.prog.mk>
|
103
tools/regression/mqueue/mqtest3/mqtest3.c
Normal file
103
tools/regression/mqueue/mqtest3/mqtest3.c
Normal file
@ -0,0 +1,103 @@
|
||||
/* $FreeBSD$ */
|
||||
#include <stdio.h>
|
||||
#include <mqueue.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/select.h>
|
||||
|
||||
#define MQNAME "/mytstqueue3"
|
||||
#define LOOPS 1000
|
||||
#define PRIO 10
|
||||
|
||||
void sighandler(int sig)
|
||||
{
|
||||
write(1, "timeout\n", 8);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int mq, status;
|
||||
struct mq_attr attr;
|
||||
int pid;
|
||||
fd_set set;
|
||||
|
||||
mq_unlink(MQNAME);
|
||||
|
||||
attr.mq_maxmsg = 5;
|
||||
attr.mq_msgsize = 128;
|
||||
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
|
||||
if (mq == -1)
|
||||
err(1, "mq_open()");
|
||||
status = mq_getattr(mq, &attr);
|
||||
if (status)
|
||||
err(1, "mq_getattr()");
|
||||
|
||||
pid = fork();
|
||||
if (pid == 0) { /* child */
|
||||
int prio, j, i;
|
||||
char *buf;
|
||||
|
||||
mq_close(mq);
|
||||
|
||||
signal(SIGALRM, sighandler);
|
||||
|
||||
mq = mq_open(MQNAME, O_RDWR);
|
||||
if (mq == -1)
|
||||
err(1, "child process: mq_open");
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
FD_ZERO(&set);
|
||||
FD_SET(mq, &set);
|
||||
alarm(3);
|
||||
status = select(mq+1, &set, NULL, NULL, NULL);
|
||||
if (status != 1)
|
||||
err(1, "child process: select()");
|
||||
status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
|
||||
if (status == -1)
|
||||
err(2, "child process: mq_receive");
|
||||
for (i = 0; i < attr.mq_msgsize; ++i)
|
||||
if (buf[i] != i)
|
||||
err(3, "message data corrupted");
|
||||
if (prio != PRIO)
|
||||
err(4, "priority is incorrect: %d", prio);
|
||||
}
|
||||
alarm(0);
|
||||
free(buf);
|
||||
mq_close(mq);
|
||||
return (0);
|
||||
} else if (pid == -1) {
|
||||
err(1, "fork()");
|
||||
} else {
|
||||
char *buf;
|
||||
int i, j, prio;
|
||||
|
||||
signal(SIGALRM, sighandler);
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
for (i = 0; i < attr.mq_msgsize; ++i) {
|
||||
buf[i] = i;
|
||||
}
|
||||
alarm(3);
|
||||
FD_ZERO(&set);
|
||||
FD_SET(mq, &set);
|
||||
status = select(mq+1, NULL, &set, NULL, NULL);
|
||||
if (status != 1)
|
||||
err(1, "select()");
|
||||
status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
|
||||
if (status) {
|
||||
kill(pid, SIGKILL);
|
||||
err(2, "mq_send()");
|
||||
}
|
||||
}
|
||||
alarm(3);
|
||||
wait(&status);
|
||||
alarm(0);
|
||||
}
|
||||
status = mq_close(mq);
|
||||
if (status)
|
||||
err(1, "mq_close");
|
||||
mq_unlink(MQNAME);
|
||||
return (0);
|
||||
}
|
8
tools/regression/mqueue/mqtest4/Makefile
Normal file
8
tools/regression/mqueue/mqtest4/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG=mqtest4
|
||||
LDADD+=
|
||||
NO_MAN=
|
||||
DEBUG_FLAGS=-g
|
||||
|
||||
.include <bsd.prog.mk>
|
109
tools/regression/mqueue/mqtest4/mqtest4.c
Normal file
109
tools/regression/mqueue/mqtest4/mqtest4.c
Normal file
@ -0,0 +1,109 @@
|
||||
/* $FreeBSD$ */
|
||||
#include <stdio.h>
|
||||
#include <mqueue.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/event.h>
|
||||
|
||||
#define MQNAME "/mytstqueue4"
|
||||
#define LOOPS 1000
|
||||
#define PRIO 10
|
||||
|
||||
void sighandler(int sig)
|
||||
{
|
||||
write(1, "timeout\n", 8);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int mq, status;
|
||||
struct mq_attr attr;
|
||||
int pid;
|
||||
fd_set set;
|
||||
int kq;
|
||||
struct kevent kev;
|
||||
|
||||
mq_unlink(MQNAME);
|
||||
|
||||
attr.mq_maxmsg = 5;
|
||||
attr.mq_msgsize = 128;
|
||||
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
|
||||
if (mq == -1)
|
||||
err(1, "mq_open()");
|
||||
status = mq_getattr(mq, &attr);
|
||||
if (status)
|
||||
err(1, "mq_getattr()");
|
||||
pid = fork();
|
||||
if (pid == 0) { /* child */
|
||||
int prio, j, i;
|
||||
char *buf;
|
||||
|
||||
mq_close(mq);
|
||||
kq = kqueue();
|
||||
mq = mq_open(MQNAME, O_RDWR);
|
||||
if (mq == -1)
|
||||
err(1, "child: mq_open");
|
||||
EV_SET(&kev, mq, EVFILT_READ, EV_ADD, 0, 0, 0);
|
||||
status = kevent(kq, &kev, 1, NULL, 0, NULL);
|
||||
if (status == -1)
|
||||
err(1, "child: kevent");
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
alarm(3);
|
||||
status = kevent(kq, NULL, 0, &kev, 1, NULL);
|
||||
if (status != 1)
|
||||
err(1, "child: kevent 2");
|
||||
status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
|
||||
if (status == -1)
|
||||
err(2, "child: mq_receive");
|
||||
for (i = 0; i < attr.mq_msgsize; ++i)
|
||||
if (buf[i] != i)
|
||||
err(3, "child: message data corrupted");
|
||||
if (prio != PRIO)
|
||||
err(4, "child: priority is incorrect: %d",
|
||||
prio);
|
||||
}
|
||||
alarm(0);
|
||||
free(buf);
|
||||
mq_close(mq);
|
||||
return (0);
|
||||
} else if (pid == -1) {
|
||||
err(1, "fork()");
|
||||
} else {
|
||||
char *buf;
|
||||
int i, j, prio;
|
||||
|
||||
signal(SIGALRM, sighandler);
|
||||
kq = kqueue();
|
||||
EV_SET(&kev, mq, EVFILT_WRITE, EV_ADD, 0, 0, 0);
|
||||
status = kevent(kq, &kev, 1, NULL, 0, NULL);
|
||||
if (status == -1)
|
||||
err(1, "kevent");
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
for (i = 0; i < attr.mq_msgsize; ++i) {
|
||||
buf[i] = i;
|
||||
}
|
||||
alarm(3);
|
||||
status = kevent(kq, NULL, 0, &kev, 1, NULL);
|
||||
if (status != 1)
|
||||
err(1, "child: kevent 2");
|
||||
status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
|
||||
if (status) {
|
||||
err(2, "mq_send()");
|
||||
}
|
||||
}
|
||||
free(buf);
|
||||
alarm(3);
|
||||
wait(&status);
|
||||
alarm(0);
|
||||
}
|
||||
status = mq_close(mq);
|
||||
if (status)
|
||||
err(1, "mq_close");
|
||||
mq_unlink(MQNAME);
|
||||
return (0);
|
||||
}
|
8
tools/regression/mqueue/mqtest5/Makefile
Normal file
8
tools/regression/mqueue/mqtest5/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG=mqtest5
|
||||
LDADD+=
|
||||
NO_MAN=
|
||||
DEBUG_FLAGS=-g
|
||||
|
||||
.include <bsd.prog.mk>
|
117
tools/regression/mqueue/mqtest5/mqtest5.c
Normal file
117
tools/regression/mqueue/mqtest5/mqtest5.c
Normal file
@ -0,0 +1,117 @@
|
||||
/* $FreeBSD$ */
|
||||
#include <stdio.h>
|
||||
#include <mqueue.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/select.h>
|
||||
#include <sys/event.h>
|
||||
#include <signal.h>
|
||||
|
||||
#define MQNAME "/mytstqueue5"
|
||||
#define LOOPS 1000
|
||||
#define PRIO 10
|
||||
|
||||
void sighandler(int sig)
|
||||
{
|
||||
write(1, "timeout\n", 8);
|
||||
_exit(1);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int mq, status;
|
||||
struct mq_attr attr;
|
||||
int pid;
|
||||
sigset_t set;
|
||||
struct sigaction sa;
|
||||
siginfo_t info;
|
||||
|
||||
mq_unlink(MQNAME);
|
||||
|
||||
sigemptyset(&set);
|
||||
sigaddset(&set, SIGRTMIN);
|
||||
sigprocmask(SIG_BLOCK, &set, NULL);
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
sa.sa_sigaction = (void *) SIG_DFL;
|
||||
sigaction(SIGRTMIN, &sa, NULL);
|
||||
|
||||
attr.mq_maxmsg = 5;
|
||||
attr.mq_msgsize = 128;
|
||||
mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
|
||||
if (mq == -1)
|
||||
err(1, "mq_open()");
|
||||
status = mq_getattr(mq, &attr);
|
||||
if (status)
|
||||
err(1, "mq_getattr()");
|
||||
pid = fork();
|
||||
if (pid == 0) { /* child */
|
||||
int prio, j, i;
|
||||
char *buf;
|
||||
struct sigevent sigev;
|
||||
|
||||
signal(SIGALRM, sighandler);
|
||||
|
||||
sigev.sigev_notify = SIGEV_SIGNAL;
|
||||
sigev.sigev_signo = SIGRTMIN;
|
||||
sigev.sigev_value.sival_int = 2;
|
||||
|
||||
mq_close(mq);
|
||||
mq = mq_open(MQNAME, O_RDWR | O_NONBLOCK);
|
||||
if (mq == -1)
|
||||
err(1, "child: mq_open");
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
alarm(3);
|
||||
status = mq_notify(mq, &sigev);
|
||||
if (status)
|
||||
err(1, "child: mq_notify");
|
||||
status = sigwaitinfo(&set, &info);
|
||||
if (status == -1)
|
||||
err(1, "child: sigwaitinfo");
|
||||
if (info.si_value.sival_int != 2)
|
||||
err(1, "child: sival_int");
|
||||
status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
|
||||
if (status == -1)
|
||||
err(2, "child: mq_receive");
|
||||
for (i = 0; i < attr.mq_msgsize; ++i)
|
||||
if (buf[i] != i)
|
||||
err(3, "child: message data corrupted");
|
||||
if (prio != PRIO)
|
||||
err(4, "child: priority is incorrect: %d",
|
||||
prio);
|
||||
}
|
||||
alarm(0);
|
||||
free(buf);
|
||||
mq_close(mq);
|
||||
return (0);
|
||||
} else if (pid == -1) {
|
||||
err(1, "fork()");
|
||||
} else {
|
||||
char *buf;
|
||||
int i, j, prio;
|
||||
|
||||
signal(SIGALRM, sighandler);
|
||||
buf = malloc(attr.mq_msgsize);
|
||||
for (j = 0; j < LOOPS; ++j) {
|
||||
for (i = 0; i < attr.mq_msgsize; ++i) {
|
||||
buf[i] = i;
|
||||
}
|
||||
alarm(3);
|
||||
status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
|
||||
if (status) {
|
||||
kill(pid, SIGKILL);
|
||||
err(2, "mq_send()");
|
||||
}
|
||||
}
|
||||
alarm(3);
|
||||
wait(&status);
|
||||
alarm(0);
|
||||
}
|
||||
status = mq_close(mq);
|
||||
if (status)
|
||||
err(1, "mq_close");
|
||||
mq_unlink(MQNAME);
|
||||
return (0);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user