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 2003/12/29 16:31:39 UTC
cvs commit: apr/test testlock.c
jorton 2003/12/29 07:31:39
Modified: include apr_thread_cond.h
locks/unix thread_cond.c
test testlock.c
Log:
* include/apr_thread_cond.h: Note when destroying a condvar gives
undefined results in a POSIX implementation.
* locks/unix/thread_cond.c (apr_thread_cond_create): Don't run cleanup
if pthread_cond_init fails since that gives undefined results.
(apr_thread_cond_destroy): Use apr_pool_cleanup_run so the cleanup is
always unregistered.
* test/testlock.c (test_cond): Test apr_thread_cond_destroy and use
apr_assert_success() a little more.
Revision Changes Path
1.10 +6 -0 apr/include/apr_thread_cond.h
Index: apr_thread_cond.h
===================================================================
RCS file: /home/cvs/apr/include/apr_thread_cond.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -u -r1.9 -r1.10
--- apr_thread_cond.h 29 Dec 2003 14:57:30 -0000 1.9
+++ apr_thread_cond.h 29 Dec 2003 15:31:39 -0000 1.10
@@ -82,6 +82,12 @@
typedef struct apr_thread_cond_t apr_thread_cond_t;
/**
+ * Note: destroying a condition variable (or likewise, destroying or
+ * clearing the pool from which a condition variable was allocated) if
+ * any threads are blocked waiting on it gives undefined results.
+ */
+
+/**
* Create and initialize a condition variable that can be used to signal
* and schedule threads in a single process.
* @param cond the memory address where the newly created condition variable
1.11 +1 -7 apr/locks/unix/thread_cond.c
Index: thread_cond.c
===================================================================
RCS file: /home/cvs/apr/locks/unix/thread_cond.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -u -r1.10 -r1.11
--- thread_cond.c 29 Dec 2003 15:06:38 -0000 1.10
+++ thread_cond.c 29 Dec 2003 15:31:39 -0000 1.11
@@ -87,7 +87,6 @@
#ifdef PTHREAD_SETS_ERRNO
rv = errno;
#endif
- thread_cond_cleanup(new_cond);
return rv;
}
@@ -166,12 +165,7 @@
APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond)
{
- apr_status_t rv;
- if ((rv = thread_cond_cleanup(cond)) == APR_SUCCESS) {
- apr_pool_cleanup_kill(cond->pool, cond, thread_cond_cleanup);
- return APR_SUCCESS;
- }
- return rv;
+ return apr_pool_cleanup_run(cond->pool, cond, thread_cond_cleanup);
}
APR_POOL_IMPLEMENT_ACCESSOR(thread_cond)
1.25 +12 -7 apr/test/testlock.c
Index: testlock.c
===================================================================
RCS file: /home/cvs/apr/test/testlock.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -u -r1.24 -r1.25
--- testlock.c 1 Jan 2003 00:01:56 -0000 1.24
+++ testlock.c 29 Dec 2003 15:31:39 -0000 1.25
@@ -251,17 +251,19 @@
apr_status_t s0, s1, s2, s3, s4;
int count1, count2, count3, count4;
int sum;
-
- s1 = apr_thread_mutex_create(&put.mutex, APR_THREAD_MUTEX_DEFAULT, p);
- CuAssertIntEquals(tc, APR_SUCCESS, s1);
+
+ apr_assert_success(tc, "create put mutex",
+ apr_thread_mutex_create(&put.mutex,
+ APR_THREAD_MUTEX_DEFAULT, p));
CuAssertPtrNotNull(tc, put.mutex);
- s1 = apr_thread_mutex_create(&nready.mutex, APR_THREAD_MUTEX_DEFAULT, p);
- CuAssertIntEquals(tc, APR_SUCCESS, s1);
+ apr_assert_success(tc, "create nready mutex",
+ apr_thread_mutex_create(&nready.mutex,
+ APR_THREAD_MUTEX_DEFAULT, p));
CuAssertPtrNotNull(tc, nready.mutex);
- s1 = apr_thread_cond_create(&nready.cond, p);
- CuAssertIntEquals(tc, APR_SUCCESS, s1);
+ apr_assert_success(tc, "create condvar",
+ apr_thread_cond_create(&nready.cond, p));
CuAssertPtrNotNull(tc, nready.cond);
count1 = count2 = count3 = count4 = 0;
@@ -286,6 +288,9 @@
apr_thread_join(&s2, p3);
apr_thread_join(&s3, p4);
apr_thread_join(&s4, c1);
+
+ apr_assert_success(tc, "destroy condvar",
+ apr_thread_cond_destroy(nready.cond));
sum = count1 + count2 + count3 + count4;
/*