]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/drd/tests/hold_lock.c
Inital import
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / drd / tests / hold_lock.c
1 /** Hold several types of synchronization objects locked as long as specified.
2  */
3
4 #define _GNU_SOURCE 1
5
6 #include <assert.h>
7 #include <pthread.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <time.h>
11 #include <unistd.h>
12
13
14 static void delay_ms(const int ms)
15 {
16   struct timespec ts;
17
18   assert(ms >= 0);
19   ts.tv_sec = ms / 1000;
20   ts.tv_nsec = (ms % 1000) * 1000 * 1000;
21   nanosleep(&ts, 0);
22 }
23
24 int main(int argc, char** argv)
25 {
26   int interval = 0;
27   int optchar;
28   pthread_mutex_t     mutex;
29   pthread_mutexattr_t mutexattr;
30   pthread_rwlock_t    rwlock;
31
32   while ((optchar = getopt(argc, argv, "i:")) != EOF)
33   {
34     switch (optchar)
35     {
36     case 'i':
37       interval = atoi(optarg);
38       break;
39     default:
40       fprintf(stderr, "Usage: %s [-i <interval time in ms>].\n", argv[0]);
41       break;
42     }
43   }
44
45   fprintf(stderr, "Locking mutex ...\n");
46
47   pthread_mutexattr_init(&mutexattr);
48   pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
49   pthread_mutex_init(&mutex, &mutexattr);
50   pthread_mutexattr_destroy(&mutexattr);
51   pthread_mutex_lock(&mutex);
52   delay_ms(interval);
53   pthread_mutex_lock(&mutex);
54   pthread_mutex_unlock(&mutex);
55   pthread_mutex_unlock(&mutex);
56   pthread_mutex_destroy(&mutex);
57
58   fprintf(stderr, "Locking rwlock exclusively ...\n");
59
60   pthread_rwlock_init(&rwlock, 0);
61   pthread_rwlock_wrlock(&rwlock);
62   delay_ms(interval);
63   pthread_rwlock_unlock(&rwlock);
64   pthread_rwlock_destroy(&rwlock);
65
66   fprintf(stderr, "Locking rwlock shared ...\n");
67
68   pthread_rwlock_init(&rwlock, 0);
69   pthread_rwlock_rdlock(&rwlock);
70   delay_ms(interval);
71   pthread_rwlock_rdlock(&rwlock);
72   pthread_rwlock_unlock(&rwlock);
73   pthread_rwlock_unlock(&rwlock);
74   pthread_rwlock_destroy(&rwlock);
75
76   fprintf(stderr, "Done.\n");
77
78   return 0;
79 }