summaryrefslogtreecommitdiffstats
path: root/regress/lib/libpthread/sigmask
diff options
context:
space:
mode:
authormarc <marc@openbsd.org>2003-07-14 22:01:42 +0000
committermarc <marc@openbsd.org>2003-07-14 22:01:42 +0000
commita0189cc010048cf82ae5b61bfcdfd799eb030280 (patch)
tree11703e2fa5a290b485d37600b82202d96d728010 /regress/lib/libpthread/sigmask
parent-make a copy the global variable (diff)
downloadwireguard-openbsd-a0189cc010048cf82ae5b61bfcdfd799eb030280.tar.xz
wireguard-openbsd-a0189cc010048cf82ae5b61bfcdfd799eb030280.zip
improve test. fails with current code
Diffstat (limited to 'regress/lib/libpthread/sigmask')
-rw-r--r--regress/lib/libpthread/sigmask/sigmask.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/regress/lib/libpthread/sigmask/sigmask.c b/regress/lib/libpthread/sigmask/sigmask.c
index 51b93486842..b3ccc0fa2a4 100644
--- a/regress/lib/libpthread/sigmask/sigmask.c
+++ b/regress/lib/libpthread/sigmask/sigmask.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sigmask.c,v 1.1 2003/07/10 21:02:12 marc Exp $ */
+/* $OpenBSD: sigmask.c,v 1.2 2003/07/14 22:01:42 marc Exp $ */
/* PUBLIC DOMAIN July 2003 Marco S Hyman <marc@snafu.org> */
#include <sys/time.h>
@@ -16,17 +16,46 @@
int main (int argc, char *argv[])
{
sigset_t mask;
+ int sig;
+
+ /* any two (or more) command line args should cause the program
+ to die */
+ if (argc > 2) {
+ printf("trigger sigalrm[1] [test should die]\n");
+ ualarm(100000, 0);
+ CHECKe(sleep(1));
+ }
/* mask sigalrm */
CHECKe(sigemptyset(&mask));
CHECKe(sigaddset(&mask, SIGALRM));
CHECKe(pthread_sigmask(SIG_BLOCK, &mask, NULL));
- /* now trigger sigalrm */
+ /* now trigger sigalrm and wait for it */
+ printf("trigger sigalrm[2] [masked, test should not die]\n");
ualarm(100000, 0);
+ CHECKe(sleep(1));
- /* wait for it -- we shouldn't see it. */
+ /* sigwait for sigalrm, it should be pending. If it is not
+ the test will hang. */
+ CHECKe(sigwait(&mask, &sig));
+ ASSERT(sig == SIGALRM);
+
+ /* make sure sigwait didn't muck with the mask by triggering
+ sigalrm, again */
+ printf("trigger sigalrm[3] after sigwait [masked, test should not die]\n");
+ ualarm(100000, 0);
CHECKe(sleep(1));
+ /* any single command line arg will run this code wich unmasks the
+ signal and then makes sure the program terminates when sigalrm
+ is triggered. */
+ if (argc > 1) {
+ printf("trigger sigalrm[4] [unmasked, test should die]\n");
+ CHECKe(pthread_sigmask(SIG_UNBLOCK, &mask, NULL));
+ ualarm(100000, 0);
+ CHECKe(sleep(1));
+ }
+
SUCCEED;
}