From 9da8fdcb33373b4b2e1de2a8b7af3ed4b5811245 Mon Sep 17 00:00:00 2001 From: rpj Date: Fri, 8 Oct 2004 12:03:18 +0000 Subject: Mutex speedups --- pthread_mutex_lock.c | 69 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 17 deletions(-) (limited to 'pthread_mutex_lock.c') diff --git a/pthread_mutex_lock.c b/pthread_mutex_lock.c index b733801..6695907 100644 --- a/pthread_mutex_lock.c +++ b/pthread_mutex_lock.c @@ -44,6 +44,7 @@ int pthread_mutex_lock (pthread_mutex_t * mutex) { int result = 0; + LONG c; pthread_mutex_t mx; /* @@ -68,29 +69,48 @@ pthread_mutex_lock (pthread_mutex_t * mutex) if (mx->kind == PTHREAD_MUTEX_NORMAL) { - if (0 != InterlockedIncrement (&mx->lock_idx)) + if ((c = (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 0, + (PTW32_INTERLOCKED_LONG) -1)) != -1) { - if (ptw32_semwait (&mx->wait_sema) != 0) + do { - result = errno; + if (c == 1 || + (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) 0) != -1) + { + if (ptw32_semwait (&mx->wait_sema) != 0) + { + result = errno; + break; + } + } } + while ((c = (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) -1)) != -1); } } else { - if (0 == InterlockedIncrement (&mx->lock_idx)) + pthread_t self = pthread_self(); + + if ((c = (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 0, + (PTW32_INTERLOCKED_LONG) -1)) == -1) { mx->recursive_count = 1; - mx->ownerThread = pthread_self (); + mx->ownerThread = self; } else { - pthread_t self = pthread_self(); - if (pthread_equal (mx->ownerThread, self)) { - (void) InterlockedDecrement (&mx->lock_idx); - if (mx->kind == PTHREAD_MUTEX_RECURSIVE) { mx->recursive_count++; @@ -102,15 +122,30 @@ pthread_mutex_lock (pthread_mutex_t * mutex) } else { - if (ptw32_semwait (&mx->wait_sema) == 0) + do { - mx->recursive_count = 1; - mx->ownerThread = self; - } - else - { - result = errno; - } + if (c == 1 || + (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) 0) != -1) + { + if (ptw32_semwait (&mx->wait_sema) == 0) + { + mx->recursive_count = 1; + mx->ownerThread = self; + } + else + { + result = errno; + break; + } + } + } + while ((c = (LONG) PTW32_INTERLOCKED_COMPARE_EXCHANGE( + (PTW32_INTERLOCKED_LPLONG) &mx->lock_idx, + (PTW32_INTERLOCKED_LONG) 1, + (PTW32_INTERLOCKED_LONG) -1)) != -1); } } } -- cgit v1.2.3