You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by jo...@apache.org on 2006/04/26 14:33:23 UTC

svn commit: r397188 - /apr/apr/trunk/test/testprocmutex.c

Author: jorton
Date: Wed Apr 26 05:33:19 2006
New Revision: 397188

URL: http://svn.apache.org/viewcvs?rev=397188&view=rev
Log:
* test/testprocmutex.c (make_child): Take trylock parameter.
(test_exclusive): Run tests for both normal locking and trylock

Submitted by: Chris Darroch <chrisd pearsoncmg.com>
PR: 39289

Modified:
    apr/apr/trunk/test/testprocmutex.c

Modified: apr/apr/trunk/test/testprocmutex.c
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/test/testprocmutex.c?rev=397188&r1=397187&r2=397188&view=diff
==============================================================================
--- apr/apr/trunk/test/testprocmutex.c (original)
+++ apr/apr/trunk/test/testprocmutex.c Wed Apr 26 05:33:19 2006
@@ -31,6 +31,7 @@
 #define MAX_ITER 200
 #define CHILDREN 6
 #define MAX_COUNTER (MAX_ITER * CHILDREN)
+#define MAX_WAIT_USEC (1000*1000)
 
 static apr_proc_mutex_t *proc_lock;
 static volatile int *x;
@@ -42,7 +43,7 @@
     return n+1;
 }
 
-static void make_child(abts_case *tc, apr_proc_t **proc, apr_pool_t *p)
+static void make_child(abts_case *tc, int trylock, apr_proc_t **proc, apr_pool_t *p)
 {
     apr_status_t rv;
 
@@ -68,8 +69,22 @@
             exit(1);
 
         do {
-            if (apr_proc_mutex_lock(proc_lock))
-                exit(1);
+            if (trylock) {
+                int wait_usec = 0;
+
+                while ((rv = apr_proc_mutex_trylock(proc_lock))) {
+                    if (!APR_STATUS_IS_EBUSY(rv))
+                        exit(1);
+                    if (++wait_usec >= MAX_WAIT_USEC)
+                        exit(1);
+                    apr_sleep(1);
+                }
+            }
+            else {
+                if (apr_proc_mutex_lock(proc_lock))
+                    exit(1);
+            }
+
             i++;
             *x = increment(*x);
             if (apr_proc_mutex_unlock(proc_lock))
@@ -106,12 +121,33 @@
         return;
  
     for (n = 0; n < CHILDREN; n++)
-        make_child(tc, &child[n], p);
+        make_child(tc, 0, &child[n], p);
 
     for (n = 0; n < CHILDREN; n++)
         await_child(tc, child[n]);
     
     ABTS_ASSERT(tc, "Locks don't appear to work", *x == MAX_COUNTER);
+
+    rv = apr_proc_mutex_trylock(proc_lock);
+    if (rv == APR_ENOTIMPL) {
+        ABTS_NOT_IMPL(tc, "apr_proc_mutex_trylock not implemented");
+        return;
+    }
+    APR_ASSERT_SUCCESS(tc, "check for trylock", rv);
+
+    rv = apr_proc_mutex_unlock(proc_lock);
+    APR_ASSERT_SUCCESS(tc, "unlock after trylock check", rv);
+
+    *x = 0;
+
+    for (n = 0; n < CHILDREN; n++)
+        make_child(tc, 1, &child[n], p);
+
+    for (n = 0; n < CHILDREN; n++)
+        await_child(tc, child[n]);
+    
+    ABTS_ASSERT(tc, "Locks don't appear to work with trylock",
+                *x == MAX_COUNTER);
 }
 #endif