1 /* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3 Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20 /* NOTE: this tests functionality beyond POSIX. POSIX does not allow
21 exit to be called more than once. */
36 #include <sys/select.h>
37 #include <sys/socket.h>
45 /* Since STREAMS are not supported in the standard Linux kernel and
46 there we don't advertise STREAMS as supported is no need to test
47 the STREAMS related functions. This affects
48 getmsg() getpmsg() putmsg()
51 lockf() and fcntl() are tested in tst-cancel16.
53 pthread_join() is tested in tst-join5.
55 pthread_testcancel()'s only purpose is to allow cancellation. This
56 is tested in several places.
58 sem_wait() and sem_timedwait() are checked in tst-cancel1[2345] tests.
60 mq_send(), mq_timedsend(), mq_receive() and mq_timedreceive() are checked
61 in tst-mqueue8{,x} tests.
63 aio_suspend() is tested in tst-cancel17.
65 clock_nanosleep() is tested in tst-cancel18.
68 /* Pipe descriptors. */
71 /* Temporary file descriptor, to be closed after each round. */
72 static int tempfd
= -1;
73 static int tempfd2
= -1;
74 /* Name of temporary file to be removed after each round. */
75 static char *tempfname
;
76 /* Temporary message queue. */
77 static int tempmsg
= -1;
79 /* Often used barrier for two threads. */
80 static pthread_barrier_t b2
;
87 #define WRITE_BUFFER_SIZE 4096
89 /* Cleanup handling test. */
110 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
111 tempfd
= fd
= mkstemp (fname
);
113 printf ("%s: mkstemp failed\n", __FUNCTION__
);
116 r
= pthread_barrier_wait (&b2
);
117 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
119 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
124 r
= pthread_barrier_wait (&b2
);
125 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
127 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
132 pthread_cleanup_push (cl
, NULL
);
135 s
= read (fd
, buf
, sizeof (buf
));
137 pthread_cleanup_pop (0);
139 printf ("%s: read returns with %zd\n", __FUNCTION__
, s
);
155 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
156 tempfd
= fd
= mkstemp (fname
);
158 printf ("%s: mkstemp failed\n", __FUNCTION__
);
161 r
= pthread_barrier_wait (&b2
);
162 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
164 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
169 r
= pthread_barrier_wait (&b2
);
170 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
172 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
177 pthread_cleanup_push (cl
, NULL
);
180 struct iovec iov
[1] = { [0] = { .iov_base
= buf
, .iov_len
= sizeof (buf
) } };
181 s
= readv (fd
, iov
, 1);
183 pthread_cleanup_pop (0);
185 printf ("%s: readv returns with %zd\n", __FUNCTION__
, s
);
201 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
202 tempfd
= fd
= mkstemp (fname
);
204 printf ("%s: mkstemp failed\n", __FUNCTION__
);
207 r
= pthread_barrier_wait (&b2
);
208 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
210 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
215 r
= pthread_barrier_wait (&b2
);
216 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
218 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
223 pthread_cleanup_push (cl
, NULL
);
225 char buf
[WRITE_BUFFER_SIZE
];
226 memset (buf
, '\0', sizeof (buf
));
227 s
= write (fd
, buf
, sizeof (buf
));
229 pthread_cleanup_pop (0);
231 printf ("%s: write returns with %zd\n", __FUNCTION__
, s
);
238 tf_writev (void *arg
)
247 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
248 tempfd
= fd
= mkstemp (fname
);
250 printf ("%s: mkstemp failed\n", __FUNCTION__
);
253 r
= pthread_barrier_wait (&b2
);
254 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
256 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
261 r
= pthread_barrier_wait (&b2
);
262 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
264 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
269 pthread_cleanup_push (cl
, NULL
);
271 char buf
[WRITE_BUFFER_SIZE
];
272 memset (buf
, '\0', sizeof (buf
));
273 struct iovec iov
[1] = { [0] = { .iov_base
= buf
, .iov_len
= sizeof (buf
) } };
274 s
= writev (fd
, iov
, 1);
276 pthread_cleanup_pop (0);
278 printf ("%s: writev returns with %zd\n", __FUNCTION__
, s
);
287 int r
= pthread_barrier_wait (&b2
);
288 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
290 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
296 r
= pthread_barrier_wait (&b2
);
297 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
299 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
304 pthread_cleanup_push (cl
, NULL
);
306 sleep (arg
== NULL
? 1000000 : 0);
308 pthread_cleanup_pop (0);
310 printf ("%s: sleep returns\n", __FUNCTION__
);
317 tf_usleep (void *arg
)
319 int r
= pthread_barrier_wait (&b2
);
320 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
322 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
328 r
= pthread_barrier_wait (&b2
);
329 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
331 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
336 pthread_cleanup_push (cl
, NULL
);
338 usleep (arg
== NULL
? (useconds_t
) ULONG_MAX
: 0);
340 pthread_cleanup_pop (0);
342 printf ("%s: usleep returns\n", __FUNCTION__
);
349 tf_nanosleep (void *arg
)
351 int r
= pthread_barrier_wait (&b2
);
352 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
354 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
360 r
= pthread_barrier_wait (&b2
);
361 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
363 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
368 pthread_cleanup_push (cl
, NULL
);
370 struct timespec ts
= { .tv_sec
= arg
== NULL
? 10000000 : 0, .tv_nsec
= 0 };
371 TEMP_FAILURE_RETRY (nanosleep (&ts
, &ts
));
373 pthread_cleanup_pop (0);
375 printf ("%s: nanosleep returns\n", __FUNCTION__
);
382 tf_select (void *arg
)
391 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
392 tempfd
= fd
= mkstemp (fname
);
394 printf ("%s: mkstemp failed\n", __FUNCTION__
);
397 r
= pthread_barrier_wait (&b2
);
398 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
400 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
405 r
= pthread_barrier_wait (&b2
);
406 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
408 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
417 pthread_cleanup_push (cl
, NULL
);
419 s
= select (fd
+ 1, &rfs
, NULL
, NULL
, NULL
);
421 pthread_cleanup_pop (0);
423 printf ("%s: select returns with %d (%s)\n", __FUNCTION__
, s
,
431 tf_pselect (void *arg
)
440 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
441 tempfd
= fd
= mkstemp (fname
);
443 printf ("%s: mkstemp failed\n", __FUNCTION__
);
446 r
= pthread_barrier_wait (&b2
);
447 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
449 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
454 r
= pthread_barrier_wait (&b2
);
455 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
457 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
466 pthread_cleanup_push (cl
, NULL
);
468 s
= pselect (fd
+ 1, &rfs
, NULL
, NULL
, NULL
, NULL
);
470 pthread_cleanup_pop (0);
472 printf ("%s: pselect returns with %d (%s)\n", __FUNCTION__
, s
,
489 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
490 tempfd
= fd
= mkstemp (fname
);
492 printf ("%s: mkstemp failed\n", __FUNCTION__
);
495 r
= pthread_barrier_wait (&b2
);
496 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
498 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
503 r
= pthread_barrier_wait (&b2
);
504 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
506 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
510 struct pollfd rfs
[1] = { [0] = { .fd
= fd
, .events
= POLLIN
} };
513 pthread_cleanup_push (cl
, NULL
);
515 s
= poll (rfs
, 1, -1);
517 pthread_cleanup_pop (0);
519 printf ("%s: poll returns with %d (%s)\n", __FUNCTION__
, s
,
536 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
537 tempfd
= fd
= mkstemp (fname
);
539 printf ("%s: mkstemp failed\n", __FUNCTION__
);
542 r
= pthread_barrier_wait (&b2
);
543 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
545 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
550 r
= pthread_barrier_wait (&b2
);
551 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
553 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
557 struct pollfd rfs
[1] = { [0] = { .fd
= fd
, .events
= POLLIN
} };
560 pthread_cleanup_push (cl
, NULL
);
562 s
= ppoll (rfs
, 1, NULL
, NULL
);
564 pthread_cleanup_pop (0);
566 printf ("%s: ppoll returns with %d (%s)\n", __FUNCTION__
, s
,
579 puts ("fork failed");
585 /* Make the program disappear after a while. */
594 struct timespec ts
= { .tv_sec
= 0, .tv_nsec
= 100000000 };
595 while (nanosleep (&ts
, &ts
) != 0)
598 r
= pthread_barrier_wait (&b2
);
599 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
601 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
606 r
= pthread_barrier_wait (&b2
);
607 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
609 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
614 pthread_cleanup_push (cl
, NULL
);
618 pthread_cleanup_pop (0);
620 printf ("%s: wait returns with %d (%s)\n", __FUNCTION__
, s
,
628 tf_waitpid (void *arg
)
634 puts ("fork failed");
640 /* Make the program disappear after a while. */
649 struct timespec ts
= { .tv_sec
= 0, .tv_nsec
= 100000000 };
650 while (nanosleep (&ts
, &ts
) != 0)
653 r
= pthread_barrier_wait (&b2
);
654 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
656 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
661 r
= pthread_barrier_wait (&b2
);
662 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
664 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
669 pthread_cleanup_push (cl
, NULL
);
671 s
= waitpid (-1, NULL
, 0);
673 pthread_cleanup_pop (0);
675 printf ("%s: waitpid returns with %d (%s)\n", __FUNCTION__
, s
,
683 tf_waitid (void *arg
)
688 puts ("fork failed");
694 /* Make the program disappear after a while. */
703 struct timespec ts
= { .tv_sec
= 0, .tv_nsec
= 100000000 };
704 while (nanosleep (&ts
, &ts
) != 0)
707 r
= pthread_barrier_wait (&b2
);
708 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
710 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
715 r
= pthread_barrier_wait (&b2
);
716 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
718 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
723 pthread_cleanup_push (cl
, NULL
);
729 s
= waitid (P_PID
, pid
, &si
, WEXITED
);
731 pthread_cleanup_pop (0);
733 printf ("%s: waitid returns with %d (%s)\n", __FUNCTION__
, s
,
741 tf_sigpause (void *arg
)
743 int r
= pthread_barrier_wait (&b2
);
744 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
746 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
752 r
= pthread_barrier_wait (&b2
);
753 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
755 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
760 pthread_cleanup_push (cl
, NULL
);
762 /* Just for fun block the cancellation signal. We need to use
763 __xpg_sigpause since otherwise we will get the BSD version. */
764 __xpg_sigpause (SIGCANCEL
);
766 pthread_cleanup_pop (0);
768 printf ("%s: sigpause returned\n", __FUNCTION__
);
775 tf_sigsuspend (void *arg
)
777 int r
= pthread_barrier_wait (&b2
);
778 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
780 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
786 r
= pthread_barrier_wait (&b2
);
787 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
789 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
794 pthread_cleanup_push (cl
, NULL
);
796 /* Just for fun block all signals. */
801 pthread_cleanup_pop (0);
803 printf ("%s: sigsuspend returned\n", __FUNCTION__
);
810 tf_sigwait (void *arg
)
812 int r
= pthread_barrier_wait (&b2
);
813 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
815 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
821 r
= pthread_barrier_wait (&b2
);
822 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
824 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
832 sigaddset (&mask
, SIGUSR1
);
833 if (pthread_sigmask (SIG_BLOCK
, &mask
, NULL
) != 0)
835 printf ("%s: pthread_sigmask failed\n", __FUNCTION__
);
840 pthread_cleanup_push (cl
, NULL
);
842 /* Wait for SIGUSR1. */
843 sigwait (&mask
, &sig
);
845 pthread_cleanup_pop (0);
847 printf ("%s: sigwait returned with signal %d\n", __FUNCTION__
, sig
);
854 tf_sigwaitinfo (void *arg
)
856 int r
= pthread_barrier_wait (&b2
);
857 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
859 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
865 r
= pthread_barrier_wait (&b2
);
866 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
868 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
876 sigaddset (&mask
, SIGUSR1
);
877 if (pthread_sigmask (SIG_BLOCK
, &mask
, NULL
) != 0)
879 printf ("%s: pthread_sigmask failed\n", __FUNCTION__
);
884 pthread_cleanup_push (cl
, NULL
);
886 /* Wait for SIGUSR1. */
887 sigwaitinfo (&mask
, &info
);
889 pthread_cleanup_pop (0);
891 printf ("%s: sigwaitinfo returned with signal %d\n", __FUNCTION__
,
899 tf_sigtimedwait (void *arg
)
901 int r
= pthread_barrier_wait (&b2
);
902 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
904 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
910 r
= pthread_barrier_wait (&b2
);
911 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
913 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
921 sigaddset (&mask
, SIGUSR1
);
922 if (pthread_sigmask (SIG_BLOCK
, &mask
, NULL
) != 0)
924 printf ("%s: pthread_sigmask failed\n", __FUNCTION__
);
928 /* Wait for SIGUSR1. */
930 struct timespec ts
= { .tv_sec
= 60, .tv_nsec
= 0 };
931 pthread_cleanup_push (cl
, NULL
);
933 sigtimedwait (&mask
, &info
, &ts
);
935 pthread_cleanup_pop (0);
937 printf ("%s: sigtimedwait returned with signal %d\n", __FUNCTION__
,
947 int r
= pthread_barrier_wait (&b2
);
948 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
950 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
956 r
= pthread_barrier_wait (&b2
);
957 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
959 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
964 pthread_cleanup_push (cl
, NULL
);
968 pthread_cleanup_pop (0);
970 printf ("%s: pause returned\n", __FUNCTION__
);
977 tf_accept (void *arg
)
979 struct sockaddr_un sun
;
980 /* To test a non-blocking accept call we make the call file by using
981 a datagrame socket. */
982 int pf
= arg
== NULL
? SOCK_STREAM
: SOCK_DGRAM
;
984 tempfd
= socket (AF_UNIX
, pf
, 0);
987 printf ("%s: socket call failed\n", __FUNCTION__
);
996 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
999 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-1-XXXXXX");
1000 if (mktemp (sun
.sun_path
) == NULL
)
1002 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1006 sun
.sun_family
= AF_UNIX
;
1008 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1009 offsetof (struct sockaddr_un
, sun_path
)
1010 + strlen (sun
.sun_path
) + 1) != 0);
1012 unlink (sun
.sun_path
);
1016 socklen_t len
= sizeof (sun
);
1018 int r
= pthread_barrier_wait (&b2
);
1019 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1021 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1027 r
= pthread_barrier_wait (&b2
);
1028 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1030 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1035 pthread_cleanup_push (cl
, NULL
);
1037 accept (tempfd
, (struct sockaddr
*) &sun
, &len
);
1039 pthread_cleanup_pop (0);
1041 printf ("%s: accept returned\n", __FUNCTION__
);
1050 struct sockaddr_un sun
;
1052 tempfd
= socket (AF_UNIX
, SOCK_STREAM
, 0);
1055 printf ("%s: first socket call failed\n", __FUNCTION__
);
1064 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1067 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-2-XXXXXX");
1068 if (mktemp (sun
.sun_path
) == NULL
)
1070 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1074 sun
.sun_family
= AF_UNIX
;
1076 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1077 offsetof (struct sockaddr_un
, sun_path
)
1078 + strlen (sun
.sun_path
) + 1) != 0);
1082 tempfd2
= socket (AF_UNIX
, SOCK_STREAM
, 0);
1085 printf ("%s: second socket call failed\n", __FUNCTION__
);
1089 if (connect (tempfd2
, (struct sockaddr
*) &sun
, sizeof (sun
)) != 0)
1091 printf ("%s: connect failed\n", __FUNCTION__
);
1095 unlink (sun
.sun_path
);
1097 int r
= pthread_barrier_wait (&b2
);
1098 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1100 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1106 r
= pthread_barrier_wait (&b2
);
1107 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1109 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1114 pthread_cleanup_push (cl
, NULL
);
1116 /* Very large block, so that the send call blocks. */
1119 send (tempfd2
, mem
, arg
== NULL
? sizeof (mem
) : 1, 0);
1121 pthread_cleanup_pop (0);
1123 printf ("%s: send returned\n", __FUNCTION__
);
1132 struct sockaddr_un sun
;
1134 tempfd
= socket (AF_UNIX
, SOCK_STREAM
, 0);
1137 printf ("%s: first socket call failed\n", __FUNCTION__
);
1146 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1149 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-3-XXXXXX");
1150 if (mktemp (sun
.sun_path
) == NULL
)
1152 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1156 sun
.sun_family
= AF_UNIX
;
1158 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1159 offsetof (struct sockaddr_un
, sun_path
)
1160 + strlen (sun
.sun_path
) + 1) != 0);
1164 tempfd2
= socket (AF_UNIX
, SOCK_STREAM
, 0);
1167 printf ("%s: second socket call failed\n", __FUNCTION__
);
1171 if (connect (tempfd2
, (struct sockaddr
*) &sun
, sizeof (sun
)) != 0)
1173 printf ("%s: connect failed\n", __FUNCTION__
);
1177 unlink (sun
.sun_path
);
1179 int r
= pthread_barrier_wait (&b2
);
1180 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1182 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1188 r
= pthread_barrier_wait (&b2
);
1189 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1191 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1196 pthread_cleanup_push (cl
, NULL
);
1200 recv (tempfd2
, mem
, arg
== NULL
? sizeof (mem
) : 0, 0);
1202 pthread_cleanup_pop (0);
1204 printf ("%s: recv returned\n", __FUNCTION__
);
1211 tf_recvfrom (void *arg
)
1213 struct sockaddr_un sun
;
1215 tempfd
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1218 printf ("%s: first socket call failed\n", __FUNCTION__
);
1227 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1230 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-4-XXXXXX");
1231 if (mktemp (sun
.sun_path
) == NULL
)
1233 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1237 sun
.sun_family
= AF_UNIX
;
1239 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1240 offsetof (struct sockaddr_un
, sun_path
)
1241 + strlen (sun
.sun_path
) + 1) != 0);
1243 tempfname
= strdup (sun
.sun_path
);
1245 tempfd2
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1248 printf ("%s: second socket call failed\n", __FUNCTION__
);
1252 int r
= pthread_barrier_wait (&b2
);
1253 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1255 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1261 r
= pthread_barrier_wait (&b2
);
1262 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1264 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1269 pthread_cleanup_push (cl
, NULL
);
1272 socklen_t len
= sizeof (sun
);
1274 recvfrom (tempfd2
, mem
, arg
== NULL
? sizeof (mem
) : 0, 0,
1275 (struct sockaddr
*) &sun
, &len
);
1277 pthread_cleanup_pop (0);
1279 printf ("%s: recvfrom returned\n", __FUNCTION__
);
1286 tf_recvmsg (void *arg
)
1288 struct sockaddr_un sun
;
1290 tempfd
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1293 printf ("%s: first socket call failed\n", __FUNCTION__
);
1302 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1305 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-5-XXXXXX");
1306 if (mktemp (sun
.sun_path
) == NULL
)
1308 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1312 sun
.sun_family
= AF_UNIX
;
1314 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1315 offsetof (struct sockaddr_un
, sun_path
)
1316 + strlen (sun
.sun_path
) + 1) != 0);
1318 tempfname
= strdup (sun
.sun_path
);
1320 tempfd2
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1323 printf ("%s: second socket call failed\n", __FUNCTION__
);
1327 int r
= pthread_barrier_wait (&b2
);
1328 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1330 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1336 r
= pthread_barrier_wait (&b2
);
1337 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1339 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1344 pthread_cleanup_push (cl
, NULL
);
1347 struct iovec iov
[1];
1348 iov
[0].iov_base
= mem
;
1349 iov
[0].iov_len
= arg
== NULL
? sizeof (mem
) : 0;
1353 m
.msg_namelen
= sizeof (sun
);
1356 m
.msg_control
= NULL
;
1357 m
.msg_controllen
= 0;
1359 recvmsg (tempfd2
, &m
, 0);
1361 pthread_cleanup_pop (0);
1363 printf ("%s: recvmsg returned\n", __FUNCTION__
);
1373 // XXX If somebody can provide a portable test case in which open()
1374 // blocks we can enable this test to run in both rounds.
1377 int r
= pthread_barrier_wait (&b2
);
1378 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1380 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1384 r
= pthread_barrier_wait (&b2
);
1385 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1387 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1391 pthread_cleanup_push (cl
, NULL
);
1393 open ("Makefile", O_RDONLY
);
1395 pthread_cleanup_pop (0);
1397 printf ("%s: open returned\n", __FUNCTION__
);
1404 tf_close (void *arg
)
1407 // XXX If somebody can provide a portable test case in which close()
1408 // blocks we can enable this test to run in both rounds.
1411 char fname
[] = "/tmp/tst-cancel-fd-XXXXXX";
1412 tempfd
= mkstemp (fname
);
1415 printf ("%s: mkstemp failed\n", __FUNCTION__
);
1420 int r
= pthread_barrier_wait (&b2
);
1421 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1423 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1427 r
= pthread_barrier_wait (&b2
);
1428 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1430 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1434 pthread_cleanup_push (cl
, NULL
);
1438 pthread_cleanup_pop (0);
1440 printf ("%s: close returned\n", __FUNCTION__
);
1447 tf_pread (void *arg
)
1450 // XXX If somebody can provide a portable test case in which pread()
1451 // blocks we can enable this test to run in both rounds.
1454 tempfd
= open ("Makefile", O_RDONLY
);
1457 printf ("%s: cannot open Makefile\n", __FUNCTION__
);
1461 int r
= pthread_barrier_wait (&b2
);
1462 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1464 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1468 r
= pthread_barrier_wait (&b2
);
1469 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1471 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1475 pthread_cleanup_push (cl
, NULL
);
1478 pread (tempfd
, mem
, sizeof (mem
), 0);
1480 pthread_cleanup_pop (0);
1482 printf ("%s: pread returned\n", __FUNCTION__
);
1489 tf_pwrite (void *arg
)
1492 // XXX If somebody can provide a portable test case in which pwrite()
1493 // blocks we can enable this test to run in both rounds.
1496 char fname
[] = "/tmp/tst-cancel4-fd-XXXXXX";
1497 tempfd
= mkstemp (fname
);
1500 printf ("%s: mkstemp failed\n", __FUNCTION__
);
1505 int r
= pthread_barrier_wait (&b2
);
1506 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1508 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1512 r
= pthread_barrier_wait (&b2
);
1513 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1515 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1519 pthread_cleanup_push (cl
, NULL
);
1522 pwrite (tempfd
, mem
, sizeof (mem
), 0);
1524 pthread_cleanup_pop (0);
1526 printf ("%s: pwrite returned\n", __FUNCTION__
);
1533 tf_fsync (void *arg
)
1536 // XXX If somebody can provide a portable test case in which fsync()
1537 // blocks we can enable this test to run in both rounds.
1540 tempfd
= open ("Makefile", O_RDONLY
);
1543 printf ("%s: cannot open Makefile\n", __FUNCTION__
);
1547 int r
= pthread_barrier_wait (&b2
);
1548 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1550 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1554 r
= pthread_barrier_wait (&b2
);
1555 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1557 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1561 pthread_cleanup_push (cl
, NULL
);
1565 pthread_cleanup_pop (0);
1567 printf ("%s: fsync returned\n", __FUNCTION__
);
1574 tf_msync (void *arg
)
1577 // XXX If somebody can provide a portable test case in which msync()
1578 // blocks we can enable this test to run in both rounds.
1581 tempfd
= open ("Makefile", O_RDONLY
);
1584 printf ("%s: cannot open Makefile\n", __FUNCTION__
);
1587 void *p
= mmap (NULL
, 10, PROT_READ
, MAP_SHARED
, tempfd
, 0);
1588 if (p
== MAP_FAILED
)
1590 printf ("%s: mmap failed\n", __FUNCTION__
);
1594 int r
= pthread_barrier_wait (&b2
);
1595 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1597 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1601 r
= pthread_barrier_wait (&b2
);
1602 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1604 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1608 pthread_cleanup_push (cl
, NULL
);
1612 pthread_cleanup_pop (0);
1614 printf ("%s: msync returned\n", __FUNCTION__
);
1621 tf_sendto (void *arg
)
1624 // XXX If somebody can provide a portable test case in which sendto()
1625 // blocks we can enable this test to run in both rounds.
1628 struct sockaddr_un sun
;
1630 tempfd
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1633 printf ("%s: first socket call failed\n", __FUNCTION__
);
1642 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1645 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-6-XXXXXX");
1646 if (mktemp (sun
.sun_path
) == NULL
)
1648 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1652 sun
.sun_family
= AF_UNIX
;
1654 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1655 offsetof (struct sockaddr_un
, sun_path
)
1656 + strlen (sun
.sun_path
) + 1) != 0);
1657 tempfname
= strdup (sun
.sun_path
);
1659 tempfd2
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1662 printf ("%s: second socket call failed\n", __FUNCTION__
);
1666 int r
= pthread_barrier_wait (&b2
);
1667 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1669 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1673 r
= pthread_barrier_wait (&b2
);
1674 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1676 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1680 pthread_cleanup_push (cl
, NULL
);
1684 sendto (tempfd2
, mem
, arg
== NULL
? sizeof (mem
) : 1, 0,
1685 (struct sockaddr
*) &sun
,
1686 offsetof (struct sockaddr_un
, sun_path
) + strlen (sun
.sun_path
) + 1);
1688 pthread_cleanup_pop (0);
1690 printf ("%s: sendto returned\n", __FUNCTION__
);
1697 tf_sendmsg (void *arg
)
1700 // XXX If somebody can provide a portable test case in which sendmsg()
1701 // blocks we can enable this test to run in both rounds.
1704 struct sockaddr_un sun
;
1706 tempfd
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1709 printf ("%s: first socket call failed\n", __FUNCTION__
);
1718 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1721 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-7-XXXXXX");
1722 if (mktemp (sun
.sun_path
) == NULL
)
1724 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1728 sun
.sun_family
= AF_UNIX
;
1730 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1731 offsetof (struct sockaddr_un
, sun_path
)
1732 + strlen (sun
.sun_path
) + 1) != 0);
1733 tempfname
= strdup (sun
.sun_path
);
1735 tempfd2
= socket (AF_UNIX
, SOCK_DGRAM
, 0);
1738 printf ("%s: second socket call failed\n", __FUNCTION__
);
1742 int r
= pthread_barrier_wait (&b2
);
1743 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1745 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1749 r
= pthread_barrier_wait (&b2
);
1750 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1752 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1756 pthread_cleanup_push (cl
, NULL
);
1759 struct iovec iov
[1];
1760 iov
[0].iov_base
= mem
;
1765 m
.msg_namelen
= (offsetof (struct sockaddr_un
, sun_path
)
1766 + strlen (sun
.sun_path
) + 1);
1769 m
.msg_control
= NULL
;
1770 m
.msg_controllen
= 0;
1772 sendmsg (tempfd2
, &m
, 0);
1774 pthread_cleanup_pop (0);
1776 printf ("%s: sendmsg returned\n", __FUNCTION__
);
1783 tf_creat (void *arg
)
1786 // XXX If somebody can provide a portable test case in which sendmsg()
1787 // blocks we can enable this test to run in both rounds.
1790 int r
= pthread_barrier_wait (&b2
);
1791 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1793 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1797 r
= pthread_barrier_wait (&b2
);
1798 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1800 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1804 pthread_cleanup_push (cl
, NULL
);
1806 creat ("tmp/tst-cancel-4-should-not-exist", 0666);
1808 pthread_cleanup_pop (0);
1810 printf ("%s: creat returned\n", __FUNCTION__
);
1817 tf_connect (void *arg
)
1820 // XXX If somebody can provide a portable test case in which connect()
1821 // blocks we can enable this test to run in both rounds.
1824 struct sockaddr_un sun
;
1826 tempfd
= socket (AF_UNIX
, SOCK_STREAM
, 0);
1829 printf ("%s: first socket call failed\n", __FUNCTION__
);
1838 printf ("%s: too many unsuccessful bind calls\n", __FUNCTION__
);
1841 strcpy (sun
.sun_path
, "/tmp/tst-cancel4-socket-2-XXXXXX");
1842 if (mktemp (sun
.sun_path
) == NULL
)
1844 printf ("%s: cannot generate temp file name\n", __FUNCTION__
);
1848 sun
.sun_family
= AF_UNIX
;
1850 while (bind (tempfd
, (struct sockaddr
*) &sun
,
1851 offsetof (struct sockaddr_un
, sun_path
)
1852 + strlen (sun
.sun_path
) + 1) != 0);
1853 tempfname
= strdup (sun
.sun_path
);
1857 tempfd2
= socket (AF_UNIX
, SOCK_STREAM
, 0);
1860 printf ("%s: second socket call failed\n", __FUNCTION__
);
1864 int r
= pthread_barrier_wait (&b2
);
1865 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1867 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1873 r
= pthread_barrier_wait (&b2
);
1874 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1876 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1881 pthread_cleanup_push (cl
, NULL
);
1883 connect (tempfd2
, (struct sockaddr
*) &sun
, sizeof (sun
));
1885 pthread_cleanup_pop (0);
1887 printf ("%s: connect returned\n", __FUNCTION__
);
1894 tf_tcdrain (void *arg
)
1897 // XXX If somebody can provide a portable test case in which tcdrain()
1898 // blocks we can enable this test to run in both rounds.
1901 int r
= pthread_barrier_wait (&b2
);
1902 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1904 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1910 r
= pthread_barrier_wait (&b2
);
1911 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1913 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1918 pthread_cleanup_push (cl
, NULL
);
1920 /* Regardless of stderr being a terminal, the tcdrain call should be
1922 tcdrain (STDERR_FILENO
);
1924 pthread_cleanup_pop (0);
1926 printf ("%s: tcdrain returned\n", __FUNCTION__
);
1933 tf_msgrcv (void *arg
)
1935 tempmsg
= msgget (IPC_PRIVATE
, 0666 | IPC_CREAT
);
1938 printf ("%s: msgget failed: %s\n", __FUNCTION__
, strerror (errno
));
1942 int r
= pthread_barrier_wait (&b2
);
1943 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1945 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
1951 r
= pthread_barrier_wait (&b2
);
1952 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
1954 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
1961 pthread_cleanup_push (cl
, NULL
);
1969 /* We need a positive random number. */
1971 randnr
= random () % 64000;
1972 while (randnr
<= 0);
1976 s
= msgrcv (tempmsg
, (struct msgbuf
*) &m
, 10, randnr
, 0);
1978 while (errno
== EIDRM
|| errno
== EINTR
);
1980 pthread_cleanup_pop (0);
1982 printf ("%s: msgrcv returned %zd with errno = %m\n", __FUNCTION__
, s
);
1984 msgctl (tempmsg
, IPC_RMID
, NULL
);
1991 tf_msgsnd (void *arg
)
1994 // XXX If somebody can provide a portable test case in which msgsnd()
1995 // blocks we can enable this test to run in both rounds.
1998 tempmsg
= msgget (IPC_PRIVATE
, 0666 | IPC_CREAT
);
2001 printf ("%s: msgget failed: %s\n", __FUNCTION__
, strerror (errno
));
2005 int r
= pthread_barrier_wait (&b2
);
2006 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
2008 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
2012 r
= pthread_barrier_wait (&b2
);
2013 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
2015 printf ("%s: 2nd barrier_wait failed\n", __FUNCTION__
);
2019 pthread_cleanup_push (cl
, NULL
);
2026 /* We need a positive random number. */
2028 m
.type
= random () % 64000;
2029 while (m
.type
<= 0);
2030 msgsnd (tempmsg
, (struct msgbuf
*) &m
, sizeof (m
.mem
), 0);
2032 pthread_cleanup_pop (0);
2034 printf ("%s: msgsnd returned\n", __FUNCTION__
);
2036 msgctl (tempmsg
, IPC_RMID
, NULL
);
2045 void *(*tf
) (void *);
2050 #define ADD_TEST(name, nbar, early) { #name, tf_##name, nbar, early }
2051 ADD_TEST (read
, 2, 0),
2052 ADD_TEST (readv
, 2, 0),
2053 ADD_TEST (select
, 2, 0),
2054 ADD_TEST (pselect
, 2, 0),
2055 ADD_TEST (poll
, 2, 0),
2056 ADD_TEST (ppoll
, 2, 0),
2057 ADD_TEST (write
, 2, 0),
2058 ADD_TEST (writev
, 2, 0),
2059 ADD_TEST (sleep
, 2, 0),
2060 ADD_TEST (usleep
, 2, 0),
2061 ADD_TEST (nanosleep
, 2, 0),
2062 ADD_TEST (wait
, 2, 0),
2063 ADD_TEST (waitid
, 2, 0),
2064 ADD_TEST (waitpid
, 2, 0),
2065 ADD_TEST (sigpause
, 2, 0),
2066 ADD_TEST (sigsuspend
, 2, 0),
2067 ADD_TEST (sigwait
, 2, 0),
2068 ADD_TEST (sigwaitinfo
, 2, 0),
2069 ADD_TEST (sigtimedwait
, 2, 0),
2070 ADD_TEST (pause
, 2, 0),
2071 ADD_TEST (accept
, 2, 0),
2072 ADD_TEST (send
, 2, 0),
2073 ADD_TEST (recv
, 2, 0),
2074 ADD_TEST (recvfrom
, 2, 0),
2075 ADD_TEST (recvmsg
, 2, 0),
2076 ADD_TEST (open
, 2, 1),
2077 ADD_TEST (close
, 2, 1),
2078 ADD_TEST (pread
, 2, 1),
2079 ADD_TEST (pwrite
, 2, 1),
2080 ADD_TEST (fsync
, 2, 1),
2081 ADD_TEST (msync
, 2, 1),
2082 ADD_TEST (sendto
, 2, 1),
2083 ADD_TEST (sendmsg
, 2, 1),
2084 ADD_TEST (creat
, 2, 1),
2085 ADD_TEST (connect
, 2, 1),
2086 ADD_TEST (tcdrain
, 2, 1),
2087 ADD_TEST (msgrcv
, 2, 0),
2088 ADD_TEST (msgsnd
, 2, 1),
2090 #define ntest_tf (sizeof (tests) / sizeof (tests[0]))
2099 if (socketpair (AF_UNIX
, SOCK_STREAM
, PF_UNIX
, fds
) != 0)
2101 perror ("socketpair");
2107 setsockopt (fds
[1], SOL_SOCKET
, SO_SNDBUF
, &val
, sizeof(val
));
2108 if (getsockopt (fds
[1], SOL_SOCKET
, SO_SNDBUF
, &val
, &len
) < 0)
2110 perror ("getsockopt");
2113 if (val
>= WRITE_BUFFER_SIZE
)
2115 puts ("minimum write buffer size too large");
2118 setsockopt (fds
[1], SOL_SOCKET
, SO_SNDBUF
, &val
, sizeof(val
));
2122 for (cnt
= 0; cnt
< ntest_tf
; ++cnt
)
2124 if (tests
[cnt
].only_early
)
2127 if (pthread_barrier_init (&b2
, NULL
, tests
[cnt
].nb
) != 0)
2129 puts ("b2 init failed");
2133 /* Reset the counter for the cleanup handler. */
2137 if (pthread_create (&th
, NULL
, tests
[cnt
].tf
, NULL
) != 0)
2139 printf ("create for '%s' test failed\n", tests
[cnt
].name
);
2144 int r
= pthread_barrier_wait (&b2
);
2145 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
2147 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
2152 struct timespec ts
= { .tv_sec
= 0, .tv_nsec
= 100000000 };
2153 while (nanosleep (&ts
, &ts
) != 0)
2156 if (pthread_cancel (th
) != 0)
2158 printf ("cancel for '%s' failed\n", tests
[cnt
].name
);
2164 if (pthread_join (th
, &status
) != 0)
2166 printf ("join for '%s' failed\n", tests
[cnt
].name
);
2170 if (status
!= PTHREAD_CANCELED
)
2172 printf ("thread for '%s' not canceled\n", tests
[cnt
].name
);
2177 if (pthread_barrier_destroy (&b2
) != 0)
2179 puts ("barrier_destroy failed");
2186 printf ("cleanup handler not called for '%s'\n", tests
[cnt
].name
);
2192 printf ("cleanup handler called more than once for '%s'\n",
2198 printf ("in-time cancel test of '%s' successful\n", tests
[cnt
].name
);
2210 if (tempfname
!= NULL
)
2218 msgctl (tempmsg
, IPC_RMID
, NULL
);
2223 for (cnt
= 0; cnt
< ntest_tf
; ++cnt
)
2225 if (pthread_barrier_init (&b2
, NULL
, tests
[cnt
].nb
) != 0)
2227 puts ("b2 init failed");
2231 /* Reset the counter for the cleanup handler. */
2235 if (pthread_create (&th
, NULL
, tests
[cnt
].tf
, (void *) 1l) != 0)
2237 printf ("create for '%s' test failed\n", tests
[cnt
].name
);
2242 int r
= pthread_barrier_wait (&b2
);
2243 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
2245 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
2250 if (pthread_cancel (th
) != 0)
2252 printf ("cancel for '%s' failed\n", tests
[cnt
].name
);
2257 r
= pthread_barrier_wait (&b2
);
2258 if (r
!= 0 && r
!= PTHREAD_BARRIER_SERIAL_THREAD
)
2260 printf ("%s: barrier_wait failed\n", __FUNCTION__
);
2266 if (pthread_join (th
, &status
) != 0)
2268 printf ("join for '%s' failed\n", tests
[cnt
].name
);
2272 if (status
!= PTHREAD_CANCELED
)
2274 printf ("thread for '%s' not canceled\n", tests
[cnt
].name
);
2279 if (pthread_barrier_destroy (&b2
) != 0)
2281 puts ("barrier_destroy failed");
2288 printf ("cleanup handler not called for '%s'\n", tests
[cnt
].name
);
2294 printf ("cleanup handler called more than once for '%s'\n",
2300 printf ("early cancel test of '%s' successful\n", tests
[cnt
].name
);
2312 if (tempfname
!= NULL
)
2320 msgctl (tempmsg
, IPC_RMID
, NULL
);
2329 #define TEST_FUNCTION do_test ()
2330 #include "../test-skeleton.c"