void * oldTrylockThread (void * arg) { TESTSTART (void) old_mutex_trylock(&ox); TESTSTOP return NULL; }
int old_mutex_destroy(old_mutex_t *mutex) { int result = 0; old_mutex_t mx; if (mutex == NULL || *mutex == NULL) { return EINVAL; } if (*mutex != (old_mutex_t) PTW32_OBJECT_AUTO_INIT) { mx = *mutex; if ((result = old_mutex_trylock(&mx)) == 0) { *mutex = NULL; (void) old_mutex_unlock(&mx); if (mx->mutex == 0) { DeleteCriticalSection(&mx->cs); } else { result = (CloseHandle (mx->mutex) ? 0 : EINVAL); } if (result == 0) { mx->mutex = 0; free(mx); } else { *mutex = mx; } } } else { result = EINVAL; } if (ptw32_try_enter_critical_section != NULL) { (void) FreeLibrary(ptw32_h_kernel32); ptw32_h_kernel32 = 0; } return(result); }
int main (int argc, char *argv[]) { pthread_mutexattr_init(&ma); printf( "=============================================================================\n"); printf( "Trylock plus unlock on an unlocked mutex.\n"); printf( "%ld iterations.\n\n", ITERATIONS); printf( "%-45s %15s %15s\n", "Test", "Total(msec)", "average(usec)"); printf( "-----------------------------------------------------------------------------\n"); /* * Time the loop overhead so we can subtract it from the actual test times. */ TESTSTART TESTSTOP durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; overHeadMilliSecs = durationMilliSecs; old_mutex_use = OLD_WIN32CS; assert(old_mutex_init(&ox, NULL) == 0); TESTSTART (void) old_mutex_trylock(&ox); (void) old_mutex_unlock(&ox); TESTSTOP assert(old_mutex_destroy(&ox) == 0); durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; printf( "%-45s %15ld %15.3f\n", "Old PT Mutex using a Critical Section (WNT)", durationMilliSecs, (float) durationMilliSecs * 1E3 / ITERATIONS); old_mutex_use = OLD_WIN32MUTEX; assert(old_mutex_init(&ox, NULL) == 0); TESTSTART (void) old_mutex_trylock(&ox); (void) old_mutex_unlock(&ox); TESTSTOP assert(old_mutex_destroy(&ox) == 0); durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; printf( "%-45s %15ld %15.3f\n", "Old PT Mutex using a Win32 Mutex (W9x)", durationMilliSecs, (float) durationMilliSecs * 1E3 / ITERATIONS); printf( ".............................................................................\n"); /* * Now we can start the actual tests */ #ifdef __PTW32_MUTEX_TYPES runTest("PTHREAD_MUTEX_DEFAULT", PTHREAD_MUTEX_DEFAULT); runTest("PTHREAD_MUTEX_NORMAL", PTHREAD_MUTEX_NORMAL); runTest("PTHREAD_MUTEX_ERRORCHECK", PTHREAD_MUTEX_ERRORCHECK); runTest("PTHREAD_MUTEX_RECURSIVE", PTHREAD_MUTEX_RECURSIVE); #else runTest("Non-blocking lock", 0); #endif printf( ".............................................................................\n"); pthread_mutexattr_setrobust(&ma, PTHREAD_MUTEX_ROBUST); #ifdef __PTW32_MUTEX_TYPES runTest("PTHREAD_MUTEX_DEFAULT (Robust)", PTHREAD_MUTEX_DEFAULT); runTest("PTHREAD_MUTEX_NORMAL (Robust)", PTHREAD_MUTEX_NORMAL); runTest("PTHREAD_MUTEX_ERRORCHECK (Robust)", PTHREAD_MUTEX_ERRORCHECK); runTest("PTHREAD_MUTEX_RECURSIVE (Robust)", PTHREAD_MUTEX_RECURSIVE); #else runTest("Non-blocking lock", 0); #endif printf( "=============================================================================\n"); /* * End of tests. */ pthread_mutexattr_destroy(&ma); return 0; }