apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Philip Martin <phi...@codematters.co.uk>
Subject Re: apr_proc_mutex is broken
Date Mon, 18 Nov 2002 16:31:13 GMT
Aaron Bannert <aaron@clove.org> writes:

> On Sun, Nov 17, 2002 at 12:25:46PM +0000, Philip Martin wrote:
> >   $ ./testprocmutex 
> >   APR Proc Mutex Test
> >   ==============
> > 
> >   Exclusive lock test
> >       Initializing the lock                                   OK
> >       Starting all of the processes                           OK
> >       Waiting for processes to exit                           OK
> >   Locks don't appear to work!  x = 15998 instead of 16000
> > 
> > The test is multi-process, but the processes are single threaded.  I
> > guess the problem lies somewhere in the semaphores, but I don't have
> > any experience of using those.
> 
> I just ripped out that code, want to give this another try on your
> SMP Linux box?

It still fails.

As I said, I don't know much about semaphores, but I think the problem
is something to do with process exit.  I changed proc_mutex.c as
follows

Index: locks/unix/proc_mutex.c
===================================================================
RCS file: /home/cvspublic/apr/locks/unix/proc_mutex.c,v
retrieving revision 1.20
diff -u -r1.20 proc_mutex.c
--- locks/unix/proc_mutex.c     18 Nov 2002 01:59:03 -0000      1.20
+++ locks/unix/proc_mutex.c     18 Nov 2002 16:19:25 -0000
@@ -892,6 +892,8 @@
 
 APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex)
 {
+    if (!mutex->curr_locked)
+        abort();
     return mutex->meth->release(mutex);
 }

and now the test fails like so

$ ./testprocmutex 
APR Proc Mutex Test
==============

Exclusive lock test
    Initializing the lock                                   OK
    Starting all of the processes                           OK
    Waiting for processes to exit                           OK
Locks don't appear to work!  x = 4003 instead of 16000


The test now fails nearly every time and the "x" value is much
lower.  Next I changed the test code as follows

Index: testprocmutex.c
===================================================================
RCS file: /home/cvspublic/apr/test/testprocmutex.c,v
retrieving revision 1.10
diff -u -r1.10 testprocmutex.c
--- testprocmutex.c     9 Apr 2002 06:45:06 -0000       1.10
+++ testprocmutex.c     18 Nov 2002 16:23:00 -0000
@@ -85,7 +85,8 @@
             apr_proc_mutex_lock(proc_lock); 
             if (i == MAX_ITER) {
                 apr_proc_mutex_unlock(proc_lock); 
-                exit(1);
+                apr_sleep (1000000);
+                exit(0);
             }
             i++;
             (*x)++;

and now the test always passes.  I believe this is because the loops
all reach MAX_ITER before any of the subprocesses exit, and so any
damage to the semaphore doesn't affect the "x" value.

-- 
Philip Martin

Mime
View raw message