summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrooneg <rooneg@13f79535-47bb-0310-9956-ffa450edef68>2006-01-26 04:28:34 +0000
committerrooneg <rooneg@13f79535-47bb-0310-9956-ffa450edef68>2006-01-26 04:28:34 +0000
commitad50d3e771f7ab7d6e26c6914151db939a48ad6b (patch)
tree4138553a6007420c1524060dc11884d4c9efd766
parent9c4da4bdaa37dc7cee8de8b0f0dcc66d6e87229e (diff)
downloadlibapr-ad50d3e771f7ab7d6e26c6914151db939a48ad6b.tar.gz
Merge r371172 to 1.2.x.
Original log message: Fix an assert that occurs when you destroy a rwlock on win32 and later clear the pool it was allocated from. Submitted by: Evgueni Brevnov <evgueni.brevnov gmail.com> * locks/win32/thread_rwlock.c (apr_thread_rwlock_destroy): Use apr_pool_cleanup_run to call our cleanup function. (thread_rwlock_cleanup): Put the destruction of the rwlock here instead of in the destructor function. * test/testlock.c (test_thread_rwlocks): Destroy the rwlock explicitly so we can see this kind of problem. * CHANGES: Note change. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/branches/1.2.x@372430 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--locks/win32/thread_rwlock.c18
-rw-r--r--test/testlock.c2
3 files changed, 15 insertions, 8 deletions
diff --git a/CHANGES b/CHANGES
index e67312367..49ece980b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@ Changes for APR 1.2.3-dev
*) Keep testpipe.c from hanging on win32. [Garrett Rooney]
+ *) Fix assertion from double close of a handle with a rwlock on win32.
+ [Evgueni Brevnov <evgueni.brevnov gmail.com>]
+
*) Documented that apr_stat and apr_dir_read can return APR_INCOMPLETE,
and how to determine which parts of the resulting apr_finfo_t can be
used in such a case.
diff --git a/locks/win32/thread_rwlock.c b/locks/win32/thread_rwlock.c
index 75d79bcbe..9207d7929 100644
--- a/locks/win32/thread_rwlock.c
+++ b/locks/win32/thread_rwlock.c
@@ -23,7 +23,15 @@
static apr_status_t thread_rwlock_cleanup(void *data)
{
- return apr_thread_rwlock_destroy((apr_thread_rwlock_t *) data);
+ apr_thread_rwlock_t *rwlock = data;
+
+ if (! CloseHandle(rwlock->read_event))
+ return apr_get_os_error();
+
+ if (! CloseHandle(rwlock->write_mutex))
+ return apr_get_os_error();
+
+ return APR_SUCCESS;
}
APR_DECLARE(apr_status_t)apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock,
@@ -151,13 +159,7 @@ APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock)
APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock)
{
- if (! CloseHandle(rwlock->read_event))
- return apr_get_os_error();
-
- if (! CloseHandle(rwlock->write_mutex))
- return apr_get_os_error();
-
- return APR_SUCCESS;
+ return apr_pool_cleanup_run(rwlock->pool, rwlock, thread_rwlock_cleanup);
}
APR_POOL_IMPLEMENT_ACCESSOR(thread_rwlock)
diff --git a/test/testlock.c b/test/testlock.c
index 8e7943dde..c74164282 100644
--- a/test/testlock.c
+++ b/test/testlock.c
@@ -209,6 +209,8 @@ static void test_thread_rwlock(abts_case *tc, void *data)
apr_thread_join(&s4, t4);
ABTS_INT_EQUAL(tc, MAX_ITER, x);
+
+ apr_thread_rwlock_destroy(rwlock);
}
static void test_cond(abts_case *tc, void *data)