6 void* threadfn(void* nop
)
8 enum nobug_resource_state threadenter
= (enum nobug_resource_state
) nop
;
9 NOBUG_THREAD_ID_SET("thread");
12 RESOURCE_USER_INIT(e
);
13 ECHO ("thread startup");
15 if (threadenter
!= NOBUG_RESOURCE_WAITING
)
17 ECHO ("enter via wait");
18 RESOURCE_WAIT(NOBUG_ON
, t
, "thread", e
);
19 NOBUG_RESOURCE_STATE(NOBUG_ON
, threadenter
, e
);
23 ECHO ("enter direct");
24 RESOURCE_ENTER(NOBUG_ON
, t
, "thread", threadenter
, e
);
27 RESOURCE_LEAVE(NOBUG_ON
, e
);
29 ECHO ("thread finished");
33 void* bugfn(void* nop
)
36 RESOURCE_USER_INIT(e
);
38 ECHO ("thread startup, attach resource");
39 RESOURCE_WAIT(NOBUG_ON
, t
, "thread", e
);
42 NOBUG_THREAD_ID_SET("thread");
44 RESOURCE_LEAVE(NOBUG_ON
, e
);
45 ECHO ("thread finished");
50 NOBUG_THREAD_ID_SET("main");
53 RESOURCE_HANDLE_INIT (t
);
54 RESOURCE_ANNOUNCE(NOBUG_ON
, "type", "test", main
, t
);
56 TEST(resourcethreaded_ilg_threadid
)
58 ECHO ("create thread");
60 pthread_create (&h
, NULL
, bugfn
, NULL
);
62 pthread_join (h
, NULL
);
63 ECHO ("thread joined");
67 TEST(resourcethreaded_assert_state_waiting_ok
)
70 RESOURCE_USER_INIT(e
);
71 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_WAITING
, e
);
73 RESOURCE_ASSERT_STATE(t
, NOBUG_RESOURCE_WAITING
);
75 RESOURCE_LEAVE(NOBUG_ON
, e
);
79 TEST(resourcethreaded_assert_state_exclusive_fail
)
82 RESOURCE_USER_INIT(e
);
83 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_WAITING
, e
);
85 RESOURCE_ASSERT_STATE(t
, NOBUG_RESOURCE_EXCLUSIVE
);
87 RESOURCE_LEAVE(NOBUG_ON
, e
);
91 TEST(resourcethreaded_waiting_waiting
)
94 RESOURCE_USER_INIT(e
);
95 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_WAITING
, e
);
97 ECHO ("create thread");
99 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_WAITING
);
101 pthread_join (h
, NULL
);
102 ECHO ("thread joined");
104 RESOURCE_LEAVE(NOBUG_ON
, e
);
107 TEST(resourcethreaded_waiting_exclusive
)
110 RESOURCE_USER_INIT(e
);
111 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_WAITING
, e
);
113 ECHO ("create thread");
115 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_EXCLUSIVE
);
116 pthread_join (h
, NULL
);
117 ECHO ("thread joined");
119 RESOURCE_LEAVE(NOBUG_ON
, e
);
122 TEST(resourcethreaded_waiting_recursive
)
125 RESOURCE_USER_INIT(e
);
126 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_WAITING
, e
);
128 ECHO ("create thread");
130 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_RECURSIVE
);
131 pthread_join (h
, NULL
);
132 ECHO ("thread joined");
134 RESOURCE_LEAVE(NOBUG_ON
, e
);
137 TEST(resourcethreaded_waiting_shared
)
140 RESOURCE_USER_INIT(e
);
141 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_WAITING
, e
);
143 ECHO ("create thread");
145 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_SHARED
);
146 pthread_join (h
, NULL
);
147 ECHO ("thread joined");
149 RESOURCE_LEAVE(NOBUG_ON
, e
);
155 TEST(resourcethreaded_exclusive_waiting
)
158 RESOURCE_USER_INIT(e
);
159 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_EXCLUSIVE
, e
);
161 ECHO ("create thread");
163 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_WAITING
);
164 pthread_join (h
, NULL
);
165 ECHO ("thread joined");
167 RESOURCE_LEAVE(NOBUG_ON
, e
);
170 TEST(resourcethreaded_exclusive_exclusive
)
173 RESOURCE_USER_INIT(e
);
174 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_EXCLUSIVE
, e
);
176 ECHO ("create thread");
178 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_EXCLUSIVE
);
179 pthread_join (h
, NULL
);
180 ECHO ("thread joined");
182 RESOURCE_LEAVE(NOBUG_ON
, e
);
185 TEST(resourcethreaded_exclusive_recursive
)
188 RESOURCE_USER_INIT(e
);
189 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_EXCLUSIVE
, e
);
191 ECHO ("create thread");
193 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_RECURSIVE
);
194 pthread_join (h
, NULL
);
195 ECHO ("thread joined");
197 RESOURCE_LEAVE(NOBUG_ON
, e
);
200 TEST(resourcethreaded_exclusive_shared
)
203 RESOURCE_USER_INIT(e
);
204 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_EXCLUSIVE
, e
);
206 ECHO ("create thread");
208 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_SHARED
);
209 pthread_join (h
, NULL
);
210 ECHO ("thread joined");
212 RESOURCE_LEAVE(NOBUG_ON
, e
);
218 TEST(resourcethreaded_recursive_waiting
)
221 RESOURCE_USER_INIT(e
);
222 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_RECURSIVE
, e
);
224 ECHO ("create thread");
226 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_WAITING
);
227 pthread_join (h
, NULL
);
228 ECHO ("thread joined");
230 RESOURCE_LEAVE(NOBUG_ON
, e
);
233 TEST(resourcethreaded_recursive_exclusive
)
236 RESOURCE_USER_INIT(e
);
237 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_RECURSIVE
, e
);
239 ECHO ("create thread");
241 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_EXCLUSIVE
);
242 pthread_join (h
, NULL
);
243 ECHO ("thread joined");
245 RESOURCE_LEAVE(NOBUG_ON
, e
);
248 TEST(resourcethreaded_recursive_recursive
)
251 RESOURCE_USER_INIT(e
);
252 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_RECURSIVE
, e
);
254 ECHO ("create thread");
256 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_RECURSIVE
);
257 pthread_join (h
, NULL
);
258 ECHO ("thread joined");
260 RESOURCE_LEAVE(NOBUG_ON
, e
);
263 TEST(resourcethreaded_recursive_shared
)
266 RESOURCE_USER_INIT(e
);
267 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_RECURSIVE
, e
);
269 ECHO ("create thread");
271 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_SHARED
);
272 pthread_join (h
, NULL
);
273 ECHO ("thread joined");
275 RESOURCE_LEAVE(NOBUG_ON
, e
);
281 TEST(resourcethreaded_shared_waiting
)
284 RESOURCE_USER_INIT(e
);
285 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_SHARED
, e
);
287 ECHO ("create thread");
289 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_WAITING
);
290 pthread_join (h
, NULL
);
291 ECHO ("thread joined");
293 RESOURCE_LEAVE(NOBUG_ON
, e
);
296 TEST(resourcethreaded_shared_exclusive
)
299 RESOURCE_USER_INIT(e
);
300 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_SHARED
, e
);
302 ECHO ("create thread");
304 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_EXCLUSIVE
);
305 pthread_join (h
, NULL
);
306 ECHO ("thread joined");
308 RESOURCE_LEAVE(NOBUG_ON
, e
);
311 TEST(resourcethreaded_shared_recursive
)
314 RESOURCE_USER_INIT(e
);
315 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_SHARED
, e
);
317 ECHO ("create thread");
319 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_RECURSIVE
);
320 pthread_join (h
, NULL
);
321 ECHO ("thread joined");
323 RESOURCE_LEAVE(NOBUG_ON
, e
);
326 TEST(resourcethreaded_shared_shared
)
329 RESOURCE_USER_INIT(e
);
330 RESOURCE_ENTER(NOBUG_ON
, t
, "main", NOBUG_RESOURCE_SHARED
, e
);
332 ECHO ("create thread");
334 pthread_create (&h
, NULL
, threadfn
, (void*)NOBUG_RESOURCE_SHARED
);
335 pthread_join (h
, NULL
);
336 ECHO ("thread joined");
338 RESOURCE_LEAVE(NOBUG_ON
, e
);
341 RESOURCE_FORGET(NOBUG_ON
, t
);