1 /* testing pthread mutex behaviour with various attributes */
9 #define T(f) if ((r=(f))) t_error(#f " failed: %s\n", strerror(r))
10 #define E(f) if (f) t_error(#f " failed: %s\n", strerror(errno))
12 static void *relock(void *arg)
17 T(pthread_mutex_lock(a[0]));
19 *(int*)a[2] = pthread_mutex_lock(a[0]);
24 static int test_relock(int mtype)
29 pthread_mutexattr_t ma;
34 void *a[] = {&m,&s,&i};
36 T(pthread_mutexattr_init(&ma));
37 T(pthread_mutexattr_settype(&ma, mtype));
38 T(pthread_mutex_init(a[0], &ma));
39 E(sem_init(a[1], 0, 0));
40 T(pthread_create(&t, 0, relock, a));
42 E(clock_gettime(CLOCK_REALTIME, &ts));
43 ts.tv_nsec += 100*1000*1000;
44 if (ts.tv_nsec >= 1000*1000*1000) {
45 ts.tv_nsec -= 1000*1000*1000;
48 r = sem_timedwait(a[1],&ts);
50 if (errno != ETIMEDOUT)
51 t_error("sem_timedwait failed with unexpected error: %s\n", strerror(errno));
54 T(pthread_join(t, &p));
55 T(pthread_mutex_destroy(a[0]));
56 T(pthread_mutexattr_destroy(&ma));
61 static void *unlock(void *arg)
65 *(int*)a[1] = pthread_mutex_unlock(a[0]);
69 static int test_unlock(int mtype)
73 pthread_mutexattr_t ma;
79 T(pthread_mutexattr_init(&ma));
80 T(pthread_mutexattr_settype(&ma, mtype));
81 T(pthread_mutex_init(a[0], &ma));
82 T(pthread_create(&t, 0, unlock, a));
83 T(pthread_join(t, &p));
84 T(pthread_mutex_destroy(a[0]));
85 T(pthread_mutexattr_destroy(&ma));
89 static int test_unlock_other(int mtype)
93 pthread_mutexattr_t ma;
99 T(pthread_mutexattr_init(&ma));
100 T(pthread_mutexattr_settype(&ma, mtype));
101 T(pthread_mutex_init(a[0], &ma));
102 T(pthread_mutex_lock(a[0]));
103 T(pthread_create(&t, 0, unlock, a));
104 T(pthread_join(t, &p));
105 T(pthread_mutex_destroy(a[0]));
106 T(pthread_mutexattr_destroy(&ma));
110 static void test_mutexattr()
113 pthread_mutexattr_t a;
117 T(pthread_mutexattr_init(&a));
118 T(pthread_mutexattr_gettype(&a, &i));
119 if (i != PTHREAD_MUTEX_DEFAULT)
120 t_error("default mutex type is %d, wanted PTHREAD_MUTEX_DEFAULT (%d)\n", i, PTHREAD_MUTEX_DEFAULT);
121 T(pthread_mutexattr_settype(&a, PTHREAD_MUTEX_ERRORCHECK));
122 T(pthread_mutexattr_gettype(&a, &i));
123 if (i != PTHREAD_MUTEX_ERRORCHECK)
124 t_error("setting error check mutex type failed failed: got %d, wanted %d\n", i, PTHREAD_MUTEX_ERRORCHECK);
133 i = test_relock(PTHREAD_MUTEX_NORMAL);
135 t_error("PTHREAD_MUTEX_NORMAL relock did not deadlock, got %s\n", strerror(i));
136 i = test_relock(PTHREAD_MUTEX_ERRORCHECK);
138 t_error("PTHREAD_MUTEX_ERRORCHECK relock did not return EDEADLK, got %s\n", i==-1?"deadlock":strerror(i));
139 i = test_relock(PTHREAD_MUTEX_RECURSIVE);
141 t_error("PTHREAD_MUTEX_RECURSIVE relock did not succed, got %s\n", i==-1?"deadlock":strerror(i));
143 i = test_unlock(PTHREAD_MUTEX_ERRORCHECK);
145 t_error("PTHREAD_MUTEX_ERRORCHECK unlock did not return EPERM, got %s\n", strerror(i));
146 i = test_unlock(PTHREAD_MUTEX_RECURSIVE);
148 t_error("PTHREAD_MUTEX_RECURSIVE unlock did not return EPERM, got %s\n", strerror(i));
150 i = test_unlock_other(PTHREAD_MUTEX_ERRORCHECK);
152 t_error("PTHREAD_MUTEX_ERRORCHECK unlock did not return EPERM, got %s\n", strerror(i));
153 i = test_unlock_other(PTHREAD_MUTEX_RECURSIVE);
155 t_error("PTHREAD_MUTEX_RECURSIVE unlock did not return EPERM, got %s\n", strerror(i));