summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorIvan Zhakov <ivan@apache.org>2019-09-03 05:06:02 +0000
committerIvan Zhakov <ivan@apache.org>2019-09-03 05:06:02 +0000
commitd8f809f6653f9c5b5447c6c4286f5159802ce6f7 (patch)
tree1d9389215a39216e069399b29e23cb3d6a041c52 /test
parentb9cf94c8f9306e0fd33ba07db531b66e0c6abbaa (diff)
downloadapr-d8f809f6653f9c5b5447c6c4286f5159802ce6f7.tar.gz
Add test for WAIT_ABANDONED handling for win32 mutexes. Code works as
expected. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1866300 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test')
-rw-r--r--test/testlock.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/testlock.c b/test/testlock.c
index bd6a557a4..1ee2e95fe 100644
--- a/test/testlock.c
+++ b/test/testlock.c
@@ -425,6 +425,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
@@ -450,6 +489,9 @@ abts_suite *testlock(abts_suite *suite)
abts_run_test(suite, test_cond, NULL);
abts_run_test(suite, test_timeoutcond, NULL);
abts_run_test(suite, test_timeoutmutex, NULL);
+#ifdef WIN32
+ abts_run_test(suite, test_win32_abandoned_mutex, NULL);
+#endif
#endif
return suite;