Add pthread_mutex tests
This commit is contained in:
		| @@ -1,3 +1,17 @@ | |||||||
|  | 2003-01-09  Thomas Pfaff  <tpfaff@gmx.net> | ||||||
|  | 	 | ||||||
|  | 	* winsup.api/pthread/mutex1d.c: New test. Port from pthreads-win32  | ||||||
|  | 	project. | ||||||
|  | 	* winsup.api/pthread/mutex1e.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex4.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex5.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex6d.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex6e.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex7.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex7d.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex7e.c: Ditto. | ||||||
|  | 	* winsup.api/pthread/mutex7r.c: Ditto. | ||||||
|  |  | ||||||
| 2002-11-25  Robert Collins  <rbtcollins@hotmail.com> | 2002-11-25  Robert Collins  <rbtcollins@hotmail.com> | ||||||
|  |  | ||||||
| 	* readme: Document running portions of the test suite (Thanks Egor!). | 	* readme: Document running portions of the test suite (Thanks Egor!). | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								winsup/testsuite/winsup.api/pthread/mutex1d.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								winsup/testsuite/winsup.api/pthread/mutex1d.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex1d.c | ||||||
|  |  * | ||||||
|  |  * As for mutex1.c but with type set to PTHREAD_MUTEX_DEFAULT. | ||||||
|  |  * | ||||||
|  |  * Create a simple mutex object, lock it, unlock it, then destroy it. | ||||||
|  |  * This is the simplest test of the pthread mutex family that we can do. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions: | ||||||
|  |  *	pthread_mutexattr_settype() | ||||||
|  |  * 	pthread_mutex_init() | ||||||
|  |  *	pthread_mutex_destroy() | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "test.h" | ||||||
|  |  | ||||||
|  | pthread_mutex_t mutex = NULL; | ||||||
|  | pthread_mutexattr_t mxAttr; | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_DEFAULT) == 0); | ||||||
|  |  | ||||||
|  |   assert(mutex == NULL); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(mutex != NULL); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_lock(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_destroy(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   assert(mutex == NULL); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								winsup/testsuite/winsup.api/pthread/mutex1e.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								winsup/testsuite/winsup.api/pthread/mutex1e.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex1e.c | ||||||
|  |  * | ||||||
|  |  * As for mutex1.c but with type set to PTHREAD_MUTEX_ERRORCHECK. | ||||||
|  |  * | ||||||
|  |  * Create a simple mutex object, lock it, unlock it, then destroy it. | ||||||
|  |  * This is the simplest test of the pthread mutex family that we can do. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions: | ||||||
|  |  *	pthread_mutexattr_settype() | ||||||
|  |  * 	pthread_mutex_init() | ||||||
|  |  *	pthread_mutex_destroy() | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "test.h" | ||||||
|  |  | ||||||
|  | pthread_mutex_t mutex = NULL; | ||||||
|  | pthread_mutexattr_t mxAttr; | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); | ||||||
|  |  | ||||||
|  |   assert(mutex == NULL); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(mutex != NULL); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_lock(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_destroy(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   assert(mutex == NULL); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										67
									
								
								winsup/testsuite/winsup.api/pthread/mutex4.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								winsup/testsuite/winsup.api/pthread/mutex4.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex4.c | ||||||
|  |  * | ||||||
|  |  * Thread A locks mutex - thread B tries to unlock. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions:  | ||||||
|  |  *	pthread_mutex_lock() | ||||||
|  |  *	pthread_mutex_trylock() | ||||||
|  |  *	pthread_mutex_unlock() | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "test.h" | ||||||
|  |  | ||||||
|  | static int wasHere = 0; | ||||||
|  |  | ||||||
|  | static pthread_mutex_t mutex1; | ||||||
|  |   | ||||||
|  | void * unlocker(void * arg) | ||||||
|  | { | ||||||
|  |   int expectedResult = (int) arg; | ||||||
|  |  | ||||||
|  |   wasHere++; | ||||||
|  |   assert(pthread_mutex_unlock(&mutex1) == expectedResult); | ||||||
|  |   wasHere++; | ||||||
|  |   return NULL; | ||||||
|  | } | ||||||
|  |   | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   pthread_t t; | ||||||
|  |   pthread_mutexattr_t ma; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_init(&ma) == 0); | ||||||
|  |  | ||||||
|  |   wasHere = 0; | ||||||
|  |   assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_DEFAULT) == 0); | ||||||
|  |   assert(pthread_mutex_init(&mutex1, &ma) == 0); | ||||||
|  |   assert(pthread_mutex_lock(&mutex1) == 0); | ||||||
|  |   assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0); | ||||||
|  |   assert(pthread_join(t, NULL) == 0); | ||||||
|  |   assert(pthread_mutex_unlock(&mutex1) == 0); | ||||||
|  |   assert(pthread_mutex_destroy(&mutex1) == 0); | ||||||
|  |   assert(wasHere == 2); | ||||||
|  |  | ||||||
|  |   wasHere = 0; | ||||||
|  |   assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_ERRORCHECK) == 0); | ||||||
|  |   assert(pthread_mutex_init(&mutex1, &ma) == 0); | ||||||
|  |   assert(pthread_mutex_lock(&mutex1) == 0); | ||||||
|  |   assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0); | ||||||
|  |   assert(pthread_join(t, NULL) == 0); | ||||||
|  |   assert(pthread_mutex_unlock(&mutex1) == 0); | ||||||
|  |   assert(pthread_mutex_destroy(&mutex1) == 0); | ||||||
|  |   assert(wasHere == 2); | ||||||
|  |  | ||||||
|  |   wasHere = 0; | ||||||
|  |   assert(pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE) == 0); | ||||||
|  |   assert(pthread_mutex_init(&mutex1, &ma) == 0); | ||||||
|  |   assert(pthread_mutex_lock(&mutex1) == 0); | ||||||
|  |   assert(pthread_create(&t, NULL, unlocker, (void *) EPERM) == 0); | ||||||
|  |   assert(pthread_join(t, NULL) == 0); | ||||||
|  |   assert(pthread_mutex_unlock(&mutex1) == 0); | ||||||
|  |   assert(pthread_mutex_destroy(&mutex1) == 0); | ||||||
|  |   assert(wasHere == 2); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								winsup/testsuite/winsup.api/pthread/mutex5.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								winsup/testsuite/winsup.api/pthread/mutex5.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex5.c | ||||||
|  |  * | ||||||
|  |  * Confirm the equality/inequality of the various mutex types, | ||||||
|  |  * and the default not-set value. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "test.h" | ||||||
|  |  | ||||||
|  | static pthread_mutexattr_t mxAttr; | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   int mxType = -1; | ||||||
|  |   int success = 0;   /* Use to quell GNU compiler warnings. */ | ||||||
|  |  | ||||||
|  |   assert(success = PTHREAD_MUTEX_DEFAULT == PTHREAD_MUTEX_ERRORCHECK); | ||||||
|  |   assert(success = PTHREAD_MUTEX_DEFAULT != PTHREAD_MUTEX_RECURSIVE); | ||||||
|  |   assert(success = PTHREAD_MUTEX_RECURSIVE != PTHREAD_MUTEX_ERRORCHECK); | ||||||
|  |  | ||||||
|  |   if (success == success) | ||||||
|  |     { | ||||||
|  |       assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |       assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | ||||||
|  |       assert(mxType == PTHREAD_MUTEX_ERRORCHECK); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										64
									
								
								winsup/testsuite/winsup.api/pthread/mutex6d.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								winsup/testsuite/winsup.api/pthread/mutex6d.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex6d.c | ||||||
|  |  * | ||||||
|  |  * Tests PTHREAD_MUTEX_DEFAULT mutex type. | ||||||
|  |  * The thread should behave the same way than an errorchecking mutex. | ||||||
|  |  * | ||||||
|  |  * 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_lock(&mutex) == EDEADLK); | ||||||
|  |   lockCount++; | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == 0); | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == EPERM); | ||||||
|  |   | ||||||
|  |   return (void *) 555; | ||||||
|  | } | ||||||
|  |   | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   pthread_t t; | ||||||
|  |   int result = 0; | ||||||
|  |   int mxType = -1; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |   assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_DEFAULT) == 0); | ||||||
|  |   assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | ||||||
|  |   assert(mxType == PTHREAD_MUTEX_DEFAULT); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_create(&t, NULL, locker, NULL) == 0); | ||||||
|  |   | ||||||
|  |   assert(pthread_join(t, (void **) &result) == 0); | ||||||
|  |   assert(result == 555); | ||||||
|  |  | ||||||
|  |   assert(lockCount == 2); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_destroy(&mutex) == 0); | ||||||
|  |   assert(pthread_mutexattr_destroy(&mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   exit(0); | ||||||
|  |  | ||||||
|  |   /* Never reached */ | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								winsup/testsuite/winsup.api/pthread/mutex6e.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								winsup/testsuite/winsup.api/pthread/mutex6e.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex6e.c | ||||||
|  |  * | ||||||
|  |  * Tests PTHREAD_MUTEX_ERRORCHECK mutex type. | ||||||
|  |  * Thread locks mutex twice (recursive lock). | ||||||
|  |  * This should fail with an EDEADLK error. | ||||||
|  |  * The second unlock attempt should fail with an EPERM error. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions:  | ||||||
|  |  *      pthread_create() | ||||||
|  |  *      pthread_join() | ||||||
|  |  *      pthread_mutexattr_init() | ||||||
|  |  *      pthread_mutexattr_destroy() | ||||||
|  |  *      pthread_mutexattr_settype() | ||||||
|  |  *      pthread_mutexattr_gettype() | ||||||
|  |  *      pthread_mutex_init() | ||||||
|  |  *      pthread_mutex_destroy() | ||||||
|  |  *	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_lock(&mutex) == EDEADLK); | ||||||
|  |   lockCount++; | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == 0); | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == EPERM); | ||||||
|  |  | ||||||
|  |   return (void *) 555; | ||||||
|  | } | ||||||
|  |   | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   pthread_t t; | ||||||
|  |   int result = 0; | ||||||
|  |   int mxType = -1; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |   assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); | ||||||
|  |   assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | ||||||
|  |   assert(mxType == PTHREAD_MUTEX_ERRORCHECK); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_create(&t, NULL, locker, NULL) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_join(t, (void **) &result) == 0); | ||||||
|  |   assert(result == 555); | ||||||
|  |  | ||||||
|  |   assert(lockCount == 2); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_destroy(&mutex) == 0); | ||||||
|  |   assert(pthread_mutexattr_destroy(&mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   exit(0); | ||||||
|  |  | ||||||
|  |   /* Never reached */ | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										50
									
								
								winsup/testsuite/winsup.api/pthread/mutex7.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								winsup/testsuite/winsup.api/pthread/mutex7.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex7.c | ||||||
|  |  * | ||||||
|  |  * Test the default (type not set) mutex type. | ||||||
|  |  * Should be the same as PTHREAD_MUTEX_ERRORCHECK. | ||||||
|  |  * Thread locks then trylocks mutex (attempted recursive lock). | ||||||
|  |  * The thread should lock first time and EBUSY second time. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions:  | ||||||
|  |  *	pthread_mutex_lock() | ||||||
|  |  *	pthread_mutex_trylock() | ||||||
|  |  *	pthread_mutex_unlock() | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "test.h" | ||||||
|  |  | ||||||
|  | static int lockCount = 0; | ||||||
|  |  | ||||||
|  | static pthread_mutex_t mutex; | ||||||
|  |  | ||||||
|  | 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 0; | ||||||
|  | } | ||||||
|  |   | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   pthread_t t; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, NULL) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_create(&t, NULL, locker, NULL) == 0); | ||||||
|  |  | ||||||
|  |   Sleep(1000); | ||||||
|  |  | ||||||
|  |   assert(lockCount == 2); | ||||||
|  |  | ||||||
|  |   exit(0); | ||||||
|  |  | ||||||
|  |   /* Never reached */ | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										51
									
								
								winsup/testsuite/winsup.api/pthread/mutex7d.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								winsup/testsuite/winsup.api/pthread/mutex7d.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex7d.c | ||||||
|  |  * | ||||||
|  |  * Test the default (type not set) mutex type. | ||||||
|  |  * Should be the same as PTHREAD_MUTEX_ERRORCHECK. | ||||||
|  |  * Thread locks then trylocks mutex (attempted recursive lock). | ||||||
|  |  * The thread should lock first time and EBUSY second time. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions:  | ||||||
|  |  *	pthread_mutex_lock() | ||||||
|  |  *	pthread_mutex_trylock() | ||||||
|  |  *	pthread_mutex_unlock() | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "test.h" | ||||||
|  |  | ||||||
|  | static int lockCount = 0; | ||||||
|  |  | ||||||
|  | static pthread_mutex_t mutex; | ||||||
|  |  | ||||||
|  | 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 0; | ||||||
|  | } | ||||||
|  |   | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   int result = 0;  | ||||||
|  |   pthread_t t; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, NULL) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_create(&t, NULL, locker, NULL) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_join(t, (void **) &result) == 0);  | ||||||
|  |  | ||||||
|  |   assert(lockCount == 2); | ||||||
|  |  | ||||||
|  |   exit(0); | ||||||
|  |  | ||||||
|  |   /* Never reached */ | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								winsup/testsuite/winsup.api/pthread/mutex7e.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								winsup/testsuite/winsup.api/pthread/mutex7e.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex7e.c | ||||||
|  |  * | ||||||
|  |  * Tests PTHREAD_MUTEX_ERRORCHECK mutex type. | ||||||
|  |  * Thread locks and then trylocks mutex (attempted recursive lock). | ||||||
|  |  * Trylock should fail with an EBUSY error. | ||||||
|  |  * The second unlock attempt should fail with an EPERM error. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions:  | ||||||
|  |  *      pthread_create() | ||||||
|  |  *      pthread_join() | ||||||
|  |  *      pthread_mutexattr_init() | ||||||
|  |  *      pthread_mutexattr_destroy() | ||||||
|  |  *      pthread_mutexattr_settype() | ||||||
|  |  *      pthread_mutexattr_gettype() | ||||||
|  |  *      pthread_mutex_init() | ||||||
|  |  *      pthread_mutex_destroy() | ||||||
|  |  *	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 result = 0; | ||||||
|  |   int mxType = -1; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |   assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); | ||||||
|  |   assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | ||||||
|  |   assert(mxType == PTHREAD_MUTEX_ERRORCHECK); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_create(&t, NULL, locker, NULL) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_join(t, (void **) &result) == 0); | ||||||
|  |   assert(result == 555); | ||||||
|  |  | ||||||
|  |   assert(lockCount == 2); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_destroy(&mutex) == 0); | ||||||
|  |   assert(pthread_mutexattr_destroy(&mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   exit(0); | ||||||
|  |  | ||||||
|  |   /* Never reached */ | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										68
									
								
								winsup/testsuite/winsup.api/pthread/mutex7r.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								winsup/testsuite/winsup.api/pthread/mutex7r.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | |||||||
|  | /*  | ||||||
|  |  * mutex7r.c | ||||||
|  |  * | ||||||
|  |  * Tests PTHREAD_MUTEX_RECURSIVE mutex type. | ||||||
|  |  * Thread locks mutex then trylocks mutex (recursive lock twice). | ||||||
|  |  * Both locks and unlocks should succeed. | ||||||
|  |  * | ||||||
|  |  * Depends on API functions:  | ||||||
|  |  *      pthread_create() | ||||||
|  |  *      pthread_join() | ||||||
|  |  *      pthread_mutexattr_init() | ||||||
|  |  *      pthread_mutexattr_destroy() | ||||||
|  |  *      pthread_mutexattr_settype() | ||||||
|  |  *      pthread_mutexattr_gettype() | ||||||
|  |  *      pthread_mutex_init() | ||||||
|  |  *      pthread_mutex_destroy() | ||||||
|  |  *	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) == 0); | ||||||
|  |   lockCount++; | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == 0); | ||||||
|  |   assert(pthread_mutex_unlock(&mutex) == 0); | ||||||
|  |  | ||||||
|  |   return (void *) 555; | ||||||
|  | } | ||||||
|  |   | ||||||
|  | int | ||||||
|  | main() | ||||||
|  | { | ||||||
|  |   pthread_t t; | ||||||
|  |   int result = 0; | ||||||
|  |   int mxType = -1; | ||||||
|  |  | ||||||
|  |   assert(pthread_mutexattr_init(&mxAttr) == 0); | ||||||
|  |   assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_RECURSIVE) == 0); | ||||||
|  |   assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | ||||||
|  |   assert(mxType == PTHREAD_MUTEX_RECURSIVE); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_create(&t, NULL, locker, NULL) == 0); | ||||||
|  |  | ||||||
|  |   assert(pthread_join(t, (void **) &result) == 0); | ||||||
|  |   assert(result == 555); | ||||||
|  |  | ||||||
|  |   assert(lockCount == 2); | ||||||
|  |  | ||||||
|  |   assert(pthread_mutex_destroy(&mutex) == 0); | ||||||
|  |   assert(pthread_mutexattr_destroy(&mxAttr) == 0); | ||||||
|  |  | ||||||
|  |   exit(0); | ||||||
|  |  | ||||||
|  |   /* Never reached */ | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user