]> git.ipfire.org Git - thirdparty/glibc.git/blame - nptl/tst-sem11.c
stdlib: Fix tst-makecontext2 log when swapcontext fails
[thirdparty/glibc.git] / nptl / tst-sem11.c
CommitLineData
2af4e3e5
UD
1#include <semaphore.h>
2#include <stdio.h>
3#include <unistd.h>
4#include <pthread.h>
5#include <internaltypes.h>
6
7#ifndef SEM_WAIT
8# define SEM_WAIT(s) sem_wait (s)
9#endif
10
11static void *
12tf (void *arg)
13{
14#ifdef PREPARE
15 PREPARE
16#endif
17 SEM_WAIT (arg);
18 return NULL;
19}
20
21int
22main (void)
23{
24 int tries = 5;
25 pthread_t th;
9c04f7c1
UD
26 union
27 {
28 sem_t s;
29 struct new_sem ns;
30 } u;
2af4e3e5 31 again:
9c04f7c1 32 if (sem_init (&u.s, 0, 0) != 0)
2af4e3e5
UD
33 {
34 puts ("sem_init failed");
35 return 1;
36 }
042e1521
CD
37#if __HAVE_64B_ATOMICS
38 if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0)
39#else
9c04f7c1 40 if (u.ns.nwaiters != 0)
042e1521 41#endif
2af4e3e5
UD
42 {
43 puts ("nwaiters not initialized");
44 return 1;
45 }
46
9c04f7c1 47 if (pthread_create (&th, NULL, tf, &u.s) != 0)
2af4e3e5
UD
48 {
49 puts ("pthread_create failed");
50 return 1;
51 }
52
53 sleep (1);
54
55 if (pthread_cancel (th) != 0)
56 {
57 puts ("pthread_cancel failed");
58 return 1;
59 }
60
61 void *r;
62 if (pthread_join (th, &r) != 0)
63 {
64 puts ("pthread_join failed");
65 return 1;
66 }
67 if (r != PTHREAD_CANCELED && --tries > 0)
68 {
69 /* Maybe we get the scheduling right the next time. */
9c04f7c1 70 sem_destroy (&u.s);
2af4e3e5
UD
71 goto again;
72 }
73
042e1521
CD
74#if __HAVE_64B_ATOMICS
75 if ((u.ns.data >> SEM_NWAITERS_SHIFT) != 0)
76#else
9c04f7c1 77 if (u.ns.nwaiters != 0)
042e1521 78#endif
2af4e3e5
UD
79 {
80 puts ("nwaiters not reset");
81 return 1;
82 }
83
84 return 0;
85}