urlmon 3: Use task queue in Switch implementation.

Jacek Caban jacek at codeweavers.com
Wed May 31 12:46:04 CDT 2006


---

 dlls/urlmon/binding.c |   41 ++++++++++++++++++++++-------------------
 1 files changed, 22 insertions(+), 19 deletions(-)

-------------- next part --------------
4a209c71dbd216541297900ede71023a5e6877bb
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index db4cc52..431370e 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -37,7 +37,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 typedef struct Binding Binding;
 
 enum task_enum {
-    TASK_ON_PROGRESS
+    TASK_ON_PROGRESS,
+    TASK_SWITCH
 };
 
 typedef struct {
@@ -48,17 +49,13 @@ typedef struct {
     LPWSTR status_text;
 } on_progress_data;
 
-typedef struct {
-    Binding *binding;
-    PROTOCOLDATA *data;
-} switch_data;
-
 typedef struct _task_t {
     enum task_enum task;
     Binding *binding;
     struct _task_t *next;
     union {
         on_progress_data on_progress;
+        PROTOCOLDATA *protocol_data;
     } data;
 } task_t;
 
@@ -156,7 +153,13 @@ static void do_task(task_t *task)
 
         HeapFree(GetProcessHeap(), 0, data->status_text);
         HeapFree(GetProcessHeap(), 0, data);
+
+        break;
     }
+    case TASK_SWITCH:
+        task->binding->continue_call++;
+        IInternetProtocol_Continue(task->binding->protocol, task->data.protocol_data);
+        task->binding->continue_call--;
     }
 }
 
@@ -188,16 +191,11 @@ static LRESULT WINAPI notif_wnd_proc(HWN
         return 0;
     }
     case WM_MK_CONTINUE: {
-        switch_data *data = (switch_data*)lParam;
-
-        data->binding->continue_call++;
-        IInternetProtocol_Continue(data->binding->protocol, data->data);
-        data->binding->continue_call--;
+        Binding *binding = (Binding*)lParam;
 
-        do_tasks(data->binding);
+        do_tasks(binding);
 
-        IBinding_Release(BINDING(data->binding));
-        HeapFree(GetProcessHeap(), 0, data);
+        IBinding_Release(BINDING(binding));
         return 0;
     }
     }
@@ -806,17 +804,22 @@ static HRESULT WINAPI InternetProtocolSi
         PROTOCOLDATA *pProtocolData)
 {
     Binding *This = PROTSINK_THIS(iface);
-    switch_data *data;
+    task_t *task;
 
     TRACE("(%p)->(%p)\n", This, pProtocolData);
 
-    data = HeapAlloc(GetProcessHeap(), 0, sizeof(switch_data));
+    task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
+    task->task = TASK_SWITCH;
 
     IBinding_AddRef(BINDING(This));
-    data->binding = This;
-    data->data = pProtocolData;
+    task->binding = This;
 
-    PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)data);
+    task->data.protocol_data = pProtocolData;
+
+    push_task(task);
+
+    IBinding_AddRef(BINDING(This));
+    PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This);
 
     return S_OK;
 }


More information about the wine-patches mailing list