| /* |
| * mutex6n.c |
| * |
| * Tests PTHREAD_MUTEX_NORMAL mutex type. |
| * Thread locks mutex twice (recursive lock). |
| * The thread should deadlock. |
| * |
| * Depends on API functions: |
| * pthread_create() |
| * pthread_mutexattr_init() |
| * pthread_mutexattr_settype() |
| * pthread_mutexattr_gettype() |
| * pthread_mutex_init() |
| * pthread_mutex_lock() |
| * pthread_mutex_unlock() |
| */ |
| |
| #include "test.h" |
| |
| static int lockCount = 0; |
| |
| static pthread_mutex_t mutex; |
| static pthread_mutexattr_t mxAttr; |
| |
| void * locker(void * arg) |
| { |
| assert(pthread_mutex_lock(&mutex) == 0); |
| lockCount++; |
| |
| /* Should wait here (deadlocked) */ |
| assert(pthread_mutex_lock(&mutex) == 0); |
| lockCount++; |
| assert(pthread_mutex_unlock(&mutex) == 0); |
| |
| return (void *) 555; |
| } |
| |
| int |
| main() |
| { |
| pthread_t t; |
| int mxType = -1; |
| |
| assert(pthread_mutexattr_init(&mxAttr) == 0); |
| assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_NORMAL) == 0); |
| assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); |
| assert(mxType == PTHREAD_MUTEX_NORMAL); |
| |
| assert(pthread_mutex_init(&mutex, &mxAttr) == 0); |
| |
| assert(pthread_create(&t, NULL, locker, NULL) == 0); |
| |
| Sleep(1000); |
| |
| assert(lockCount == 1); |
| |
| /* |
| * Should succeed even though we don't own the lock |
| * because FAST mutexes don't check ownership. |
| */ |
| assert(pthread_mutex_unlock(&mutex) == 0); |
| |
| Sleep (1000); |
| |
| assert(lockCount == 2); |
| |
| exit(0); |
| |
| /* Never reached */ |
| return 0; |
| } |
| |