summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivan <ivan@13f79535-47bb-0310-9956-ffa450edef68>2022-06-20 22:08:29 +0000
committerivan <ivan@13f79535-47bb-0310-9956-ffa450edef68>2022-06-20 22:08:29 +0000
commit64b77e871489ca311a21e6b8ced4daf8511474d1 (patch)
treec555be654162f92328a1ab820a7f721a41ae4e5d
parent713c80a0150355c9c685b37a07a6c803daaa90fd (diff)
downloadlibapr-64b77e871489ca311a21e6b8ced4daf8511474d1.tar.gz
On 1.8.x branch: Merge r1866300 from trunk:
Add test for WAIT_ABANDONED handling for win32 mutexes. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.8.x@1902122 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--test/testlock.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/testlock.c b/test/testlock.c
index 5099fb339..be9822861 100644
--- a/test/testlock.c
+++ b/test/testlock.c
@@ -475,6 +475,45 @@ static void test_thread_unnestedmutex(abts_case *tc, void *data)
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
}
+#ifdef WIN32
+static void *APR_THREAD_FUNC
+thread_win32_abandoned_mutex_function(apr_thread_t *thd, void *data)
+{
+ apr_thread_mutex_t *mutex = data;
+ apr_status_t rv;
+
+ rv = apr_thread_mutex_lock(mutex);
+
+ /* exit from thread without unlocking mutex. */
+ apr_thread_exit(thd, rv);
+}
+
+static void test_win32_abandoned_mutex(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ apr_thread_t *thread;
+ apr_thread_mutex_t *mutex;
+
+ /* Create timed mutex: APR will create Win32 mutex object in this case. */
+ rv = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_TIMED, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_thread_create(&thread, NULL, thread_win32_abandoned_mutex_function,
+ mutex, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ apr_thread_join(&rv, thread);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_thread_mutex_trylock(mutex);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_thread_mutex_unlock (mutex);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+}
+
+#endif
+
#endif /* !APR_HAS_THREADS */
#if !APR_HAS_THREADS
@@ -504,6 +543,9 @@ abts_suite *testlock(abts_suite *suite)
#if APR_HAS_TIMEDLOCKS
abts_run_test(suite, test_timeoutmutex, NULL);
#endif
+#ifdef WIN32
+ abts_run_test(suite, test_win32_abandoned_mutex, NULL);
+#endif
#endif
return suite;