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