diff options
author | 2011-09-13 23:50:17 +0000 | |
---|---|---|
committer | 2011-09-13 23:50:17 +0000 | |
commit | d13be5d47e4149db2549a9828e244d59dbc43f15 (patch) | |
tree | 24654cab1dc6977bb362e8b14917c0d71534ad8b /regress/lib/libpthread/restart/read | |
parent | On KA43: (diff) | |
download | wireguard-openbsd-d13be5d47e4149db2549a9828e244d59dbc43f15.tar.xz wireguard-openbsd-d13be5d47e4149db2549a9828e244d59dbc43f15.zip |
first round of tests to check system calls restarting with pthreads.
guenther@ ok
Diffstat (limited to 'regress/lib/libpthread/restart/read')
-rw-r--r-- | regress/lib/libpthread/restart/read/Makefile | 6 | ||||
-rw-r--r-- | regress/lib/libpthread/restart/read/read.c | 59 |
2 files changed, 65 insertions, 0 deletions
diff --git a/regress/lib/libpthread/restart/read/Makefile b/regress/lib/libpthread/restart/read/Makefile new file mode 100644 index 00000000000..70b244c9672 --- /dev/null +++ b/regress/lib/libpthread/restart/read/Makefile @@ -0,0 +1,6 @@ +# $OpenBSD: Makefile,v 1.1 2011/09/13 23:50:17 fgsch Exp $ + +PROG = read +CFLAGS += -I${.CURDIR}/../../include + +.include <bsd.regress.mk> diff --git a/regress/lib/libpthread/restart/read/read.c b/regress/lib/libpthread/restart/read/read.c new file mode 100644 index 00000000000..581e65c9b71 --- /dev/null +++ b/regress/lib/libpthread/restart/read/read.c @@ -0,0 +1,59 @@ +/* $OpenBSD: read.c,v 1.1 2011/09/13 23:50:17 fgsch Exp $ */ +/* + * Federico G. Schwindt <fgsch@openbsd.org>, 2011. Public Domain. + */ +#include <sys/types.h> +#include <pthread.h> +#include <signal.h> +#include <unistd.h> +#include "test.h" + +volatile sig_atomic_t hits = 0; + +void +handler(int sig) +{ + hits++; +} + +void * +thr_read(void *arg) +{ + int fds[2]; + char buf; + + CHECKe(pipe(fds)); + ASSERT(read(fds[0], &buf, 1) == -1); + return ((caddr_t)NULL + errno); +} + +int +main(int argc, char **argv) +{ + struct sigaction sa; + pthread_t tid; + void *retval; + + bzero(&sa, sizeof(sa)); + sa.sa_handler = handler; + sa.sa_flags = SA_RESTART; + CHECKe(sigaction(SIGUSR1, &sa, NULL)); + sa.sa_flags = 0; + CHECKe(sigaction(SIGUSR2, &sa, NULL)); + + CHECKr(pthread_create(&tid, NULL, thr_read, NULL)); + sleep(2); + + /* Should restart it. */ + CHECKr(pthread_kill(tid, SIGUSR1)); + sleep(1); + + /* Should interrupt it. */ + CHECKr(pthread_kill(tid, SIGUSR2)); + sleep(1); + + CHECKr(pthread_join(tid, &retval)); + ASSERT(retval == (void *)EINTR); + ASSERT(hits == 2); + SUCCEED; +} |