This involves an API semantics change, so I'm posting it
for comments before committing...

The idea here is to skip the mutex locking for buffered
file reads and writes unless the file has been created with
APR_XTHREAD.  This fixes a bit of bogusness in the httpd,
where we do a huge number of mutex lock/unlock cycles when
reading the config file--which is only accessed by a single
thread.

--Brian


Index: file_io/unix/readwrite.c =================================================================== RCS file: /home/cvs/apr/file_io/unix/readwrite.c,v retrieving revision 1.75 diff -u -r1.75 readwrite.c --- file_io/unix/readwrite.c 18 Feb 2002 06:08:53 -0000 1.75 +++ file_io/unix/readwrite.c 10 Mar 2002 05:33:53 -0000 @@ -118,7 +118,9 @@ apr_uint64_t size = *nbytes;

#if APR_HAS_THREADS
-        apr_thread_mutex_lock(thefile->thlock);
+        if (thefile->flags & APR_XTHREAD) {
+            apr_thread_mutex_lock(thefile->thlock);
+        }
#endif

        if (thefile->direction == 1) {
@@ -164,7 +166,9 @@
            rv = 0;
        }
#if APR_HAS_THREADS
-        apr_thread_mutex_unlock(thefile->thlock);
+        if (thefile->flags & APR_XTHREAD) {
+            apr_thread_mutex_unlock(thefile->thlock);
+        }
#endif
        return rv;
    }
@@ -223,7 +227,9 @@
        int size = *nbytes;

#if APR_HAS_THREADS
-        apr_thread_mutex_lock(thefile->thlock);
+        if (thefile->flags & APR_XTHREAD) {
+            apr_thread_mutex_lock(thefile->thlock);
+        }
#endif

        if ( thefile->direction == 0 ) {
@@ -251,7 +257,9 @@
        }

#if APR_HAS_THREADS
-        apr_thread_mutex_unlock(thefile->thlock);
+        if (thefile->flags & APR_XTHREAD) {
+            apr_thread_mutex_unlock(thefile->thlock);
+        }
#endif
        return rv;
    }




Reply via email to