1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <pthread.h>
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdlib.h>
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <unistd.h>
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* Test of the mechanism for showing all locks held by a thread -- one
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   thread has a lock, the other doesn't.  Running w/ command line args
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   switches the has/has-not thread around, so as to test lockset
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   retention in both the history mechanism and the primary errors. */
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovpthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER;
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint x = 0;
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovvoid* child_fn ( void* arg )
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (arg) pthread_mutex_lock(&mx);
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   x = 1;
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (arg) pthread_mutex_unlock(&mx);
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return NULL;
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main ( int argc, char** argv )
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   int sw = argc > 1;
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   pthread_t child1, child2;
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (pthread_create(&child1, NULL, child_fn, (void*)(long)(sw ? 0 : 1))) {
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      perror("pthread_create1");
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exit(1);
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   sleep(1); /* ensure repeatable results */
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (pthread_create(&child2, NULL, child_fn, (void*)(long)(sw ? 1 : 0))) {
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      perror("pthread_create1");
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exit(1);
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (pthread_join(child1, NULL)) {
40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      perror("pthread join1");
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exit(1);
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   if (pthread_join(child2, NULL)) {
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      perror("pthread join2");
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov      exit(1);
47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   }
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov   return 0;
50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
51