[PATCH 7/8] d3dx10: Add ID3DX10ThreadPump:PurgeAllItems implementation.

Piotr Caban wine at gitlab.winehq.org
Sat Jun 18 06:56:59 CDT 2022


From: Piotr Caban <piotr at codeweavers.com>

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
---
 dlls/d3dx10_43/d3dx10_43_main.c | 48 +++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/dlls/d3dx10_43/d3dx10_43_main.c b/dlls/d3dx10_43/d3dx10_43_main.c
index 5804a1058b0..df1e3f413f5 100644
--- a/dlls/d3dx10_43/d3dx10_43_main.c
+++ b/dlls/d3dx10_43/d3dx10_43_main.c
@@ -404,8 +404,52 @@ static HRESULT WINAPI thread_pump_ProcessDeviceWorkItems(ID3DX10ThreadPump *ifac
 
 static HRESULT WINAPI thread_pump_PurgeAllItems(ID3DX10ThreadPump *iface)
 {
-    FIXME("iface %p stub!\n", iface);
-    return E_NOTIMPL;
+    struct thread_pump *thread_pump = impl_from_ID3DX10ThreadPump(iface);
+    struct list list = LIST_INIT(list);
+    struct work_item *work_item;
+    LONG v;
+
+    TRACE("iface %p.\n", iface);
+
+    while (1)
+    {
+        AcquireSRWLockExclusive(&thread_pump->io_lock);
+        list_move_tail(&list, &thread_pump->io_queue);
+        thread_pump->io_count = 0;
+        ReleaseSRWLockExclusive(&thread_pump->io_lock);
+
+        AcquireSRWLockExclusive(&thread_pump->proc_lock);
+        list_move_tail(&list, &thread_pump->proc_queue);
+        thread_pump->proc_count = 0;
+        ReleaseSRWLockExclusive(&thread_pump->proc_lock);
+
+        while (!list_empty(&list))
+        {
+            work_item = LIST_ENTRY(list_head(&list), struct work_item, entry);
+            list_remove(&work_item->entry);
+            work_item_free(work_item, TRUE);
+            if (!InterlockedDecrement(&thread_pump->processing_count))
+                RtlWakeAddressAll((void *)&thread_pump->processing_count);
+        }
+
+        if (!(v = thread_pump->processing_count))
+            break;
+
+        RtlWaitOnAddress((void *)&thread_pump->processing_count, &v, sizeof(v), NULL);
+    }
+
+    AcquireSRWLockExclusive(&thread_pump->device_lock);
+    list_move_tail(&list, &thread_pump->device_queue);
+    thread_pump->device_count = 0;
+    ReleaseSRWLockExclusive(&thread_pump->device_lock);
+
+    while(!list_empty(&list))
+    {
+        work_item = LIST_ENTRY(list_head(&list), struct work_item, entry);
+        list_remove(&work_item->entry);
+        work_item_free(work_item, TRUE);
+    }
+    return S_OK;
 }
 
 static HRESULT WINAPI thread_pump_GetQueueStatus(ID3DX10ThreadPump *iface,
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/272



More information about the wine-devel mailing list