62 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 
 | |
|  * mutex7n.c
 | |
|  *
 | |
|  * Tests PTHREAD_MUTEX_NORMAL mutex type.
 | |
|  * Thread locks then trylocks mutex (attempted recursive lock).
 | |
|  * The thread should lock first time and EBUSY second time.
 | |
|  *
 | |
|  * 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++;
 | |
|   assert(pthread_mutex_trylock(&mutex) == EBUSY);
 | |
|   lockCount++;
 | |
|   assert(pthread_mutex_unlock(&mutex) == 0);
 | |
|   assert(pthread_mutex_unlock(&mutex) == EPERM);
 | |
| 
 | |
|   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 == 2);
 | |
| 
 | |
|   exit(0);
 | |
| 
 | |
|   /* Never reached */
 | |
|   return 0;
 | |
| }
 | |
| 
 |