1b411202f9ff33a587558e2e836626bc7eb9db183sewardj
2b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Do simple things with a recursive mutex. */
3b411202f9ff33a587558e2e836626bc7eb9db183sewardj
4b411202f9ff33a587558e2e836626bc7eb9db183sewardj/* Needed for older glibcs (2.3 and older, at least) who don't
5b411202f9ff33a587558e2e836626bc7eb9db183sewardj   otherwise "know" about pthread_rwlock_anything or about
6b411202f9ff33a587558e2e836626bc7eb9db183sewardj   PTHREAD_MUTEX_RECURSIVE (amongst things). */
7b411202f9ff33a587558e2e836626bc7eb9db183sewardj#define _GNU_SOURCE 1
8b411202f9ff33a587558e2e836626bc7eb9db183sewardj
9b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdio.h>
10b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <stdlib.h>
11b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <assert.h>
12b411202f9ff33a587558e2e836626bc7eb9db183sewardj#include <pthread.h>
13b411202f9ff33a587558e2e836626bc7eb9db183sewardj
14b411202f9ff33a587558e2e836626bc7eb9db183sewardjvoid nearly_main ( void )
15b411202f9ff33a587558e2e836626bc7eb9db183sewardj{
16b411202f9ff33a587558e2e836626bc7eb9db183sewardj   pthread_mutex_t mx1;
17b411202f9ff33a587558e2e836626bc7eb9db183sewardj   pthread_mutexattr_t attr;
18b411202f9ff33a587558e2e836626bc7eb9db183sewardj   int r;
19b411202f9ff33a587558e2e836626bc7eb9db183sewardj
20b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutexattr_init( &attr );
21b411202f9ff33a587558e2e836626bc7eb9db183sewardj   assert(r==0);
22b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE );
23b411202f9ff33a587558e2e836626bc7eb9db183sewardj   assert(r==0);
24b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_init( &mx1, &attr );
25b411202f9ff33a587558e2e836626bc7eb9db183sewardj   assert(r==0);
26b411202f9ff33a587558e2e836626bc7eb9db183sewardj
27b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before lock #1\n");
28b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_lock( &mx1 ); assert(r == 0);
29b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before lock #2\n");
30b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_lock( &mx1 ); assert(r == 0);
31b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before lock #3\n");
32b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_lock( &mx1 ); assert(r == 0);
33b411202f9ff33a587558e2e836626bc7eb9db183sewardj
34b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before unlock #1\n");
35b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
36b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before unlock #2\n");
37b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
38b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before unlock #3\n");
39b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
40b411202f9ff33a587558e2e836626bc7eb9db183sewardj
41b411202f9ff33a587558e2e836626bc7eb9db183sewardj   fprintf(stderr, "before unlock #4\n");
42b411202f9ff33a587558e2e836626bc7eb9db183sewardj   r = pthread_mutex_unlock( &mx1 ); /* FAILS: assert(r == 0); */
43b411202f9ff33a587558e2e836626bc7eb9db183sewardj}
44b411202f9ff33a587558e2e836626bc7eb9db183sewardj
45b411202f9ff33a587558e2e836626bc7eb9db183sewardjint main ( void )
46b411202f9ff33a587558e2e836626bc7eb9db183sewardj{
47b411202f9ff33a587558e2e836626bc7eb9db183sewardj   nearly_main();
48b411202f9ff33a587558e2e836626bc7eb9db183sewardj   return 0;
49b411202f9ff33a587558e2e836626bc7eb9db183sewardj}
50