apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Brian Pane <brian.p...@cnet.com>
Subject [PATCH] speedup for thread mutexes
Date Fri, 11 Jan 2002 04:28:12 GMT
This is a repost of a patch from December that reduces the number
of branches in the apr_thread_mutex_lock/unlock functions.  It
reduces the cost of these calls by about 10%.
--Brian

Index: srclib/apr/locks/unix/thread_mutex.c
===================================================================
RCS file: /home/cvspublic/apr/locks/unix/thread_mutex.c,v
retrieving revision 1.5
diff -u -r1.5 thread_mutex.c
--- srclib/apr/locks/unix/thread_mutex.c    22 Oct 2001 08:30:08 
-0000    1.5
+++ srclib/apr/locks/unix/thread_mutex.c    1 Jan 2002 02:40:46 -0000
@@ -128,26 +128,35 @@
     apr_status_t rv;
 
 #if APR_HAS_THREADS
-    if (mutex->nested && apr_os_thread_equal(mutex->owner,
-                                             apr_os_thread_current())) {
-        mutex->owner_ref++;
-        return APR_SUCCESS;
-    }
-#endif
+    if (mutex->nested) {
+        if (apr_os_thread_equal(mutex->owner, apr_os_thread_current())) {
+            mutex->owner_ref++;
+            return APR_SUCCESS;
+        }
 
-    rv = pthread_mutex_lock(&mutex->mutex);
-    if (rv) {
+        rv = pthread_mutex_lock(&mutex->mutex);
+        if (rv) {
 #ifdef PTHREAD_SETS_ERRNO
-        rv = errno;
+            rv = errno;
 #endif
-        return rv;
-    }
+            return rv;
+        }
 
-#if APR_HAS_THREADS
-    if (mutex->nested) {
         mutex->owner = apr_os_thread_current();
         mutex->owner_ref = 1;
     }
+    else {
+#endif
+        rv = pthread_mutex_lock(&mutex->mutex);
+        if (rv) {
+#ifdef PTHREAD_SETS_ERRNO
+            rv = errno;
+#endif
+            return rv;
+        }
+
+#if APR_HAS_THREADS
+    }
 #endif
 
     return rv;
@@ -194,24 +203,29 @@
             if (mutex->owner_ref > 0)
                 return APR_SUCCESS;
         }
-    }
-#endif
-
-    status = pthread_mutex_unlock(&mutex->mutex);
-    if (status) {
+        status = pthread_mutex_unlock(&mutex->mutex);
+        if (status) {
 #ifdef PTHREAD_SETS_ERRNO
-        status = errno;
+            status = errno;
 #endif
-        return status;
-    }
+            return status;
+        }
 
-#if APR_HAS_THREADS
-    if (mutex->nested) {
         memset(&mutex->owner, 0, sizeof mutex->owner);
         mutex->owner_ref = 0;
     }
+    else {
+#endif
+        status = pthread_mutex_unlock(&mutex->mutex);
+        if (status) {
+#ifdef PTHREAD_SETS_ERRNO
+            status = errno;
+#endif
+            return status;
+        }
+#if APR_HAS_THREADS
+    }
 #endif
-   
     return status;
 }
 



Mime
View raw message