1/* Copyright (C) 2002-2022 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#include <errno.h>
19#include <pthread.h>
20#include <stdio.h>
21
22
23static int
24do_test (void)
25{
26 pthread_rwlock_t r;
27 pthread_rwlockattr_t at;
28 int e;
29
30 if (pthread_rwlockattr_init (attr: &at) != 0)
31 {
32 puts (s: "rwlockattr_init failed");
33 return 1;
34 }
35 puts (s: "rwlockattr_init succeeded");
36
37#ifndef TYPE
38# define TYPE PTHREAD_RWLOCK_PREFER_READER_NP
39#endif
40
41 if (pthread_rwlockattr_setkind_np (attr: &at, TYPE) != 0)
42 {
43 puts (s: "rwlockattr_setkind failed");
44 return 1;
45 }
46 puts (s: "rwlockattr_setkind succeeded");
47
48 if (pthread_rwlock_init (rwlock: &r, attr: &at) != 0)
49 {
50 puts (s: "rwlock_init failed");
51 return 1;
52 }
53 puts (s: "rwlock_init succeeded");
54
55 if (pthread_rwlockattr_destroy (attr: &at) != 0)
56 {
57 puts (s: "rwlockattr_destroy failed");
58 return 1;
59 }
60 puts (s: "rwlockattr_destroy succeeded");
61
62 if (pthread_rwlock_wrlock (rwlock: &r) != 0)
63 {
64 puts (s: "1st rwlock_wrlock failed");
65 return 1;
66 }
67 puts (s: "1st rwlock_wrlock succeeded");
68
69 e = pthread_rwlock_tryrdlock (rwlock: &r);
70 if (e == 0)
71 {
72 puts (s: "rwlock_tryrdlock on rwlock with writer succeeded");
73 return 1;
74 }
75 if (e != EBUSY)
76 {
77 puts (s: "rwlock_tryrdlock on rwlock with writer return value != EBUSY");
78 return 1;
79 }
80 puts (s: "rwlock_tryrdlock on rwlock with writer failed with EBUSY");
81
82 e = pthread_rwlock_trywrlock (rwlock: &r);
83 if (e == 0)
84 {
85 puts (s: "rwlock_trywrlock on rwlock with writer succeeded");
86 return 1;
87 }
88 if (e != EBUSY)
89 {
90 puts (s: "rwlock_trywrlock on rwlock with writer return value != EBUSY");
91 return 1;
92 }
93 puts (s: "rwlock_trywrlock on rwlock with writer failed with EBUSY");
94
95 if (pthread_rwlock_unlock (rwlock: &r) != 0)
96 {
97 puts (s: "1st rwlock_unlock failed");
98 return 1;
99 }
100 puts (s: "1st rwlock_unlock succeeded");
101
102 if (pthread_rwlock_tryrdlock (rwlock: &r) != 0)
103 {
104 puts (s: "rwlock_tryrdlock on unlocked rwlock failed");
105 return 1;
106 }
107 puts (s: "rwlock_tryrdlock on unlocked rwlock succeeded");
108
109 e = pthread_rwlock_trywrlock (rwlock: &r);
110 if (e == 0)
111 {
112 puts (s: "rwlock_trywrlock on rwlock with reader succeeded");
113 return 1;
114 }
115 if (e != EBUSY)
116 {
117 puts (s: "rwlock_trywrlock on rwlock with reader return value != EBUSY");
118 return 1;
119 }
120 puts (s: "rwlock_trywrlock on rwlock with reader failed with EBUSY");
121
122 if (pthread_rwlock_unlock (rwlock: &r) != 0)
123 {
124 puts (s: "2nd rwlock_unlock failed");
125 return 1;
126 }
127 puts (s: "2nd rwlock_unlock succeeded");
128
129 if (pthread_rwlock_trywrlock (rwlock: &r) != 0)
130 {
131 puts (s: "rwlock_trywrlock on unlocked rwlock failed");
132 return 1;
133 }
134 puts (s: "rwlock_trywrlock on unlocked rwlock succeeded");
135
136 e = pthread_rwlock_tryrdlock (rwlock: &r);
137 if (e == 0)
138 {
139 puts (s: "rwlock_tryrdlock on rwlock with writer succeeded");
140 return 1;
141 }
142 if (e != EBUSY)
143 {
144 puts (s: "rwlock_tryrdlock on rwlock with writer return value != EBUSY");
145 return 1;
146 }
147 puts (s: "rwlock_tryrdlock on rwlock with writer failed with EBUSY");
148
149 if (pthread_rwlock_unlock (rwlock: &r) != 0)
150 {
151 puts (s: "3rd rwlock_unlock failed");
152 return 1;
153 }
154 puts (s: "3rd rwlock_unlock succeeded");
155
156 if (pthread_rwlock_destroy (rwlock: &r) != 0)
157 {
158 puts (s: "rwlock_destroy failed");
159 return 1;
160 }
161 puts (s: "rwlock_destroy succeeded");
162
163 return 0;
164}
165
166#define TEST_FUNCTION do_test ()
167#include "../test-skeleton.c"
168

source code of glibc/nptl/tst-rwlock2.c