You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by dr...@apache.org on 2001/06/06 20:22:01 UTC
cvs commit: apr/test testlock.c
dreid 01/06/06 11:22:01
Modified: test testlock.c
Log:
This adds a test to testlock for locking the same lock from the same
thread a number of times. Win32 and OS/2 don't have the changes yet.
Revision Changes Path
1.2 +68 -18 apr/test/testlock.c
Index: testlock.c
===================================================================
RCS file: /home/cvs/apr/test/testlock.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- testlock.c 2001/05/31 03:30:06 1.1
+++ testlock.c 2001/06/06 18:21:57 1.2
@@ -60,9 +60,6 @@
#include "errno.h"
#include <stdio.h>
#include <stdlib.h>
-#ifdef BEOS
-#include <unistd.h>
-#endif
#if !APR_HAS_THREADS
int main(void)
@@ -81,7 +78,7 @@
apr_file_t *in, *out, *err;
apr_lock_t *thread_rw_lock, *thread_lock;
-apr_pool_t *context;
+apr_pool_t *pool;
int i = 0, x = 0;
void * APR_THREAD_FUNC thread_rw_func(void *data)
@@ -116,6 +113,8 @@
while (1)
{
apr_lock_acquire(thread_lock);
+ if (apr_lock_acquire(thread_lock) != APR_SUCCESS)
+ printf("Failed!\n");
if (i == MAX_ITER)
exitLoop = 0;
else
@@ -124,6 +123,7 @@
x++;
}
apr_lock_release(thread_lock);
+ apr_lock_release(thread_lock);
if (!exitLoop)
break;
@@ -138,7 +138,7 @@
apr_file_printf(out, "Initializing the rw lock.");
s1 = apr_lock_create(&thread_rw_lock, APR_READWRITE, APR_INTRAPROCESS,
- "lock.file", context);
+ "lock.file", pool);
if (s1 != APR_SUCCESS) {
apr_file_printf(err, "Could not create lock\n");
return s1;
@@ -149,10 +149,10 @@
x = 0;
apr_file_printf(out, "Starting all the threads.......");
- s1 = apr_thread_create(&t1, NULL, thread_rw_func, NULL, context);
- s2 = apr_thread_create(&t2, NULL, thread_rw_func, NULL, context);
- s3 = apr_thread_create(&t3, NULL, thread_rw_func, NULL, context);
- s4 = apr_thread_create(&t4, NULL, thread_rw_func, NULL, context);
+ s1 = apr_thread_create(&t1, NULL, thread_rw_func, NULL, pool);
+ s2 = apr_thread_create(&t2, NULL, thread_rw_func, NULL, pool);
+ s3 = apr_thread_create(&t3, NULL, thread_rw_func, NULL, pool);
+ s4 = apr_thread_create(&t4, NULL, thread_rw_func, NULL, pool);
if (s1 != APR_SUCCESS || s2 != APR_SUCCESS ||
s3 != APR_SUCCESS || s4 != APR_SUCCESS) {
apr_file_printf(err, "Error starting threads\n");
@@ -174,6 +174,7 @@
else {
apr_file_printf(out, "Everything is working!\n");
}
+
return APR_SUCCESS;
}
@@ -184,7 +185,7 @@
apr_file_printf(out, "Initializing the lock.");
s1 = apr_lock_create(&thread_lock, APR_MUTEX, APR_INTRAPROCESS,
- "lock.file", context);
+ "lock.file", pool);
if (s1 != APR_SUCCESS) {
apr_file_printf(err, "Could not create lock\n");
@@ -196,10 +197,10 @@
x = 0;
apr_file_printf(out, "Starting all the threads.......");
- s1 = apr_thread_create(&t1, NULL, thread_func, NULL, context);
- s2 = apr_thread_create(&t2, NULL, thread_func, NULL, context);
- s3 = apr_thread_create(&t3, NULL, thread_func, NULL, context);
- s4 = apr_thread_create(&t4, NULL, thread_func, NULL, context);
+ s1 = apr_thread_create(&t1, NULL, thread_func, NULL, pool);
+ s2 = apr_thread_create(&t2, NULL, thread_func, NULL, pool);
+ s3 = apr_thread_create(&t3, NULL, thread_func, NULL, pool);
+ s4 = apr_thread_create(&t4, NULL, thread_func, NULL, pool);
if (s1 != APR_SUCCESS || s2 != APR_SUCCESS ||
s3 != APR_SUCCESS || s4 != APR_SUCCESS) {
apr_file_printf(err, "Error starting threads\n");
@@ -224,17 +225,63 @@
return APR_SUCCESS;
}
+apr_status_t test_multiple_locking(void)
+{
+ apr_lock_t *multi;
+ int try = 0;
+ apr_status_t rv;
+
+ printf("Testing multiple locking\n");
+ printf("%-60s"," Creating the lock we'll use");
+ if ((rv = apr_lock_create(&multi, APR_MUTEX, APR_LOCKALL,"multi.lock",
+ pool)) != APR_SUCCESS) {
+ printf("Failed!\n");
+ return rv;
+ }
+ printf("OK\n");
+
+ printf("%-60s", " Trying to lock 10 times");
+ for (try = 0; try < 10; try++) {
+ if ((rv = apr_lock_acquire(multi)) != APR_SUCCESS) {
+ printf("Failed!\n");
+ printf("Error at try %d\n", try);
+ return rv;
+ }
+ }
+ printf("OK\n");
+
+ printf("%-60s", " Trying to unlock 10 times");
+ for (try = 0; try < 10; try++) {
+ if ((rv = apr_lock_release(multi)) != APR_SUCCESS) {
+ printf("Failed!\n");
+ printf("Error at try %d\n", try);
+ return rv;
+ }
+ }
+ printf("OK\n");
+
+ printf("%-60s", " Destroying the lock we've been using");
+ if ((rv = apr_lock_destroy(multi)) != APR_SUCCESS) {
+ printf("Failed!\n");
+ return rv;
+ }
+ printf("OK\n");
+
+ printf("Multiple locking test completed\n");
+ return APR_SUCCESS;
+}
+
int main(void)
{
apr_initialize();
atexit(apr_terminate);
- if (apr_pool_create(&context, NULL) != APR_SUCCESS)
+ if (apr_pool_create(&pool, NULL) != APR_SUCCESS)
exit(-1);
- apr_file_open_stdin(&in, context);
- apr_file_open_stdout(&out, context);
- apr_file_open_stderr(&err, context);
+ apr_file_open_stdin(&in, pool);
+ apr_file_open_stdout(&out, pool);
+ apr_file_open_stderr(&err, pool);
apr_file_printf(out, "OK\n");
@@ -243,6 +290,9 @@
if (test_exclusive() != APR_SUCCESS)
exit(-3);
+
+ if (test_multiple_locking() != APR_SUCCESS)
+ exit(-4);
return 1;
}
Re: cvs commit: apr/test testlock.c
Posted by Brian Havard <br...@kheldar.apana.org.au>.
On 6 Jun 2001 18:22:01 -0000, dreid@apache.org wrote:
>dreid 01/06/06 11:22:01
>
> Modified: test testlock.c
> Log:
> This adds a test to testlock for locking the same lock from the same
> thread a number of times. Win32 and OS/2 don't have the changes yet.
OS/2 locks are already be safe to lock multiple times in the same thread.
A current run of testlock looks like this:
F:\Apache\httpd-2.0\srclib\apr\test>testlock.exe
APR Locks Test
==============
Exclusive lock test
Initializing the lock OK
Starting all the threads OK
Waiting for threads to exit OK
Test passed
Testing multiple locking
Creating the lock we'll use OK
Trying to lock 10 times OK
Trying to unlock 10 times OK
Destroying the lock we've been using OK
Test passed
RW Lock Tests
Initializing the RW lock Failed!
RW Lock test failed : [20523] This function has not been implemented on
this platform
I've looked at implementing RW locks but the only thing in the OS/2 API
that works that way are file locks. I guess I could implement them by using
file locks on a temp file but that's pretty ugly.
--
______________________________________________________________________________
| Brian Havard | "He is not the messiah! |
| brianh@kheldar.apana.org.au | He's a very naughty boy!" - Life of Brian |
------------------------------------------------------------------------------