Daniel Lehman : msvcp140_atomic_wait/tests: Add test for threadpool_work functions.
Alexandre Julliard
julliard at winehq.org
Fri Jan 28 14:29:33 CST 2022
Module: wine
Branch: master
Commit: 2b6a1c003c08cc1ff58106c2acf777f5c2e17daf
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2b6a1c003c08cc1ff58106c2acf777f5c2e17daf
Author: Daniel Lehman <dlehman at esri.com>
Date: Fri Jan 28 16:18:44 2022 +0100
msvcp140_atomic_wait/tests: Add test for threadpool_work functions.
Signed-off-by: Daniel Lehman <dlehman at esri.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
.../tests/msvcp140_atomic_wait.c | 78 ++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c
index aee852afd98..e0dfef3222d 100644
--- a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c
+++ b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c
@@ -47,6 +47,83 @@ static void test___std_parallel_algorithms_hw_threads(void)
ok(nthr == si.dwNumberOfProcessors, "expected %u, got %u\n", si.dwNumberOfProcessors, nthr);
}
+static PTP_WORK cb_work;
+static void *cb_context;
+static void WINAPI threadpool_workcallback(PTP_CALLBACK_INSTANCE instance, void *context, PTP_WORK work) {
+ LONG *workcalled = context;
+ cb_work = work;
+ cb_context = context;
+
+ InterlockedIncrement(workcalled);
+}
+
+static HANDLE cb_event;
+static void CALLBACK threadpool_workfinalization(TP_CALLBACK_INSTANCE *instance, void *context)
+{
+ LONG *workcalled = context;
+
+ InterlockedIncrement(workcalled);
+ SetEvent(cb_event);
+}
+
+static void test_threadpool_work(void)
+{
+ PTP_WORK work;
+ DWORD gle, ret;
+ LONG workcalled;
+ TP_CALLBACK_ENVIRON environment;
+ TP_CALLBACK_ENVIRON_V3 environment3;
+
+ /* simple test */
+ workcalled = 0;
+ work = CreateThreadpoolWork(threadpool_workcallback, &workcalled, NULL);
+ ok(!!work, "failed to create threadpool_work\n");
+ SubmitThreadpoolWork(work);
+ WaitForThreadpoolWorkCallbacks(work, FALSE);
+ CloseThreadpoolWork(work);
+ ok(workcalled == 1, "expected work to be called once, got %d\n", workcalled);
+ ok(cb_work == work, "expected %p, got %p\n", work, cb_work);
+ ok(cb_context == &workcalled, "expected %p, got %p\n", &workcalled, cb_context);
+
+ /* test with environment */
+ cb_event = CreateEventW(NULL, TRUE, FALSE, NULL);
+ memset(&environment, 0, sizeof(environment));
+ environment.Version = 1;
+ environment.FinalizationCallback = threadpool_workfinalization;
+ workcalled = 0;
+ work = CreateThreadpoolWork(threadpool_workcallback, &workcalled, &environment);
+ ok(!!work, "failed to create threadpool_work\n");
+ SubmitThreadpoolWork(work);
+ WaitForThreadpoolWorkCallbacks(work, FALSE);
+ CloseThreadpoolWork(work);
+ ret = WaitForSingleObject(cb_event, 1000);
+ ok(ret == WAIT_OBJECT_0, "expected finalization callback to be called\n");
+ ok(workcalled == 2, "expected work to be called twice, got %d\n", workcalled);
+ CloseHandle(cb_event);
+
+ /* test with environment version 3 */
+ memset(&environment3, 0, sizeof(environment3));
+ environment3.Version = 3;
+ environment3.CallbackPriority = TP_CALLBACK_PRIORITY_NORMAL;
+ SetLastError(0xdeadbeef);
+ work = CreateThreadpoolWork(threadpool_workcallback, &workcalled,
+ (TP_CALLBACK_ENVIRON *)&environment3);
+ gle = GetLastError();
+ ok(gle == 0xdeadbeef, "expected 0xdeadbeef, got %x\n", gle);
+ ok(!!work, "failed to create threadpool_work\n");
+ CloseThreadpoolWork(work);
+
+ memset(&environment3, 0, sizeof(environment3));
+ environment3.Version = 3;
+ environment3.CallbackPriority = TP_CALLBACK_PRIORITY_INVALID;
+ SetLastError(0xdeadbeef);
+ work = CreateThreadpoolWork(threadpool_workcallback, &workcalled,
+ (TP_CALLBACK_ENVIRON *)&environment3);
+ gle = GetLastError();
+ ok(gle == ERROR_INVALID_PARAMETER, "expected %d, got %d\n", ERROR_INVALID_PARAMETER, gle);
+ ok(!work, "expected failure\n");
+}
+
START_TEST(msvcp140_atomic_wait)
{
HMODULE msvcp;
@@ -56,5 +133,6 @@ START_TEST(msvcp140_atomic_wait)
return;
}
test___std_parallel_algorithms_hw_threads();
+ test_threadpool_work();
FreeLibrary(msvcp);
}
More information about the wine-cvs
mailing list