blob: 7d8ff2d371caffe1546451c87c7d998edaebc681 [file] [log] [blame]
bart8bba1f72008-02-27 16:13:05 +00001/** Initialize several kinds of mutexes and lock each mutex twice.
2 * Note: locking a regular mutex twice causes a deadlock.
bart5357fcb2008-02-27 15:46:00 +00003 */
4
5#define _GNU_SOURCE
6
7#include <stdio.h>
bart4240ff32008-02-27 17:41:22 +00008#include <unistd.h>
bart5357fcb2008-02-27 15:46:00 +00009#include <pthread.h>
bart85569572008-05-03 09:15:25 +000010#include "../../config.h"
bart5357fcb2008-02-27 15:46:00 +000011
bart4240ff32008-02-27 17:41:22 +000012
bart5357fcb2008-02-27 15:46:00 +000013static void lock_twice(pthread_mutex_t* const p)
14{
bart5f09dcf2009-07-10 09:26:29 +000015 if (pthread_mutex_trylock(p) != 0)
16 fprintf(stderr, "first lock call failed !\n");
17 if (pthread_mutex_trylock(p) != 0)
18 fprintf(stderr, "second lock call failed !\n");
19 if (pthread_mutex_unlock(p) != 0)
20 fprintf(stderr, "first unlock call failed !\n");
21 if (pthread_mutex_unlock(p) != 0)
22 fprintf(stderr, "second unlock call failed !\n");
bart5357fcb2008-02-27 15:46:00 +000023}
24
25int main(int argc, char** argv)
26{
bart85569572008-05-03 09:15:25 +000027#if defined(HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
bart5357fcb2008-02-27 15:46:00 +000028 {
29 pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
30
bart5f09dcf2009-07-10 09:26:29 +000031 fprintf(stderr, "Recursive mutex (statically initialized).\n");
bart5357fcb2008-02-27 15:46:00 +000032 lock_twice(&m);
bart68d80f42008-03-08 15:03:30 +000033 pthread_mutex_destroy(&m);
bart85569572008-05-03 09:15:25 +000034 }
35#endif
36#if defined(HAVE_PTHREAD_MUTEX_RECURSIVE_NP)
bart5357fcb2008-02-27 15:46:00 +000037 {
38 pthread_mutex_t m;
39 pthread_mutexattr_t attr;
40
bart5f09dcf2009-07-10 09:26:29 +000041 fprintf(stderr, "\nRecursive mutex (initialized via mutex attributes).\n");
bart5357fcb2008-02-27 15:46:00 +000042 pthread_mutexattr_init(&attr);
43 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
44 pthread_mutex_init(&m, &attr);
45 pthread_mutexattr_destroy(&attr);
46 lock_twice(&m);
47 pthread_mutex_destroy(&m);
bart85569572008-05-03 09:15:25 +000048 }
49#endif
50#if defined(HAVE_PTHREAD_MUTEX_ERRORCHECK_NP)
bart5357fcb2008-02-27 15:46:00 +000051 {
52 pthread_mutex_t m;
53 pthread_mutexattr_t attr;
54
bart5f09dcf2009-07-10 09:26:29 +000055 fprintf(stderr, "\nError checking mutex.\n");
bart5357fcb2008-02-27 15:46:00 +000056 pthread_mutexattr_init(&attr);
57 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
58 pthread_mutex_init(&m, &attr);
59 pthread_mutexattr_destroy(&attr);
60 lock_twice(&m);
bart85569572008-05-03 09:15:25 +000061 pthread_mutex_destroy(&m);
62 }
63#endif
njnf76d27a2009-05-28 01:53:07 +000064
bart5357fcb2008-02-27 15:46:00 +000065 {
66 pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
67
bart5f09dcf2009-07-10 09:26:29 +000068 fprintf(stderr, "\nNon-recursive mutex.\n");
bart5357fcb2008-02-27 15:46:00 +000069 lock_twice(&m);
bart85569572008-05-03 09:15:25 +000070 }
bart5f09dcf2009-07-10 09:26:29 +000071
72 fprintf(stderr, "\nDone.\n");
73
bart5357fcb2008-02-27 15:46:00 +000074 return 0;
75}