Jacek Caban : urlmon: Use custom task structs.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 7 16:00:22 CST 2007


Module: wine
Branch: master
Commit: 4e4b5890798dae03a7c72aedf218f2876a6afcb6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4e4b5890798dae03a7c72aedf218f2876a6afcb6

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb  7 17:29:12 2007 +0100

urlmon: Use custom task structs.

---

 dlls/urlmon/binding.c |  137 ++++++++++++++++++++++++++----------------------
 1 files changed, 74 insertions(+), 63 deletions(-)

diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index e7e739c..496d429 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -36,27 +36,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
 typedef struct Binding Binding;
 
-struct _task_t;
+struct _task_header_t;
 
-typedef void (*task_proc_t)(Binding*, struct _task_t*);
+typedef void (*task_proc_t)(Binding*, struct _task_header_t*);
 
-typedef struct {
-    Binding *binding;
-    ULONG progress;
-    ULONG progress_max;
-    ULONG status_code;
-    LPWSTR status_text;
-} on_progress_data;
-
-typedef struct _task_t {
+typedef struct _task_header_t {
     task_proc_t proc;
-    struct _task_t *next;
-    union {
-        on_progress_data on_progress;
-        PROTOCOLDATA *protocol_data;
-        DWORD bscf;
-    } data;
-} task_t;
+    struct _task_header_t *next;
+} task_header_t;
 
 typedef struct {
     const IStreamVtbl *lpStreamVtbl;
@@ -96,7 +83,7 @@ struct Binding {
 
     STGMEDIUM stgmed;
 
-    task_t *task_queue_head, *task_queue_tail;
+    task_header_t *task_queue_head, *task_queue_tail;
     CRITICAL_SECTION section;
 };
 
@@ -109,11 +96,12 @@ struct Binding {
 
 #define WM_MK_CONTINUE   (WM_USER+101)
 
-static void push_task(Binding *binding, task_t *task)
+static void push_task(Binding *binding, task_header_t *task, task_proc_t proc)
 {
+    task->proc = proc;
     task->next = NULL;
 
-     EnterCriticalSection(&binding->section);
+    EnterCriticalSection(&binding->section);
 
     if(binding->task_queue_tail)
         binding->task_queue_tail->next = task;
@@ -123,22 +111,22 @@ static void push_task(Binding *binding,
     LeaveCriticalSection(&binding->section);
 }
 
-static task_t *pop_task(Binding *binding)
+static task_header_t *pop_task(Binding *binding)
 {
-    task_t *ret;
+    task_header_t *ret;
 
-     EnterCriticalSection(&binding->section);
+    EnterCriticalSection(&binding->section);
 
-     ret = binding->task_queue_head;
-     if(ret) {
-         binding->task_queue_head = ret->next;
-         if(!binding->task_queue_head)
-             binding->task_queue_tail = NULL;
-     }
+    ret = binding->task_queue_head;
+    if(ret) {
+        binding->task_queue_head = ret->next;
+        if(!binding->task_queue_head)
+            binding->task_queue_tail = NULL;
+    }
 
-     LeaveCriticalSection(&binding->section);
+    LeaveCriticalSection(&binding->section);
 
-     return ret;
+    return ret;
 }
 
 static void fill_stream_buffer(ProtocolStream *This)
@@ -161,7 +149,7 @@ static LRESULT WINAPI notif_wnd_proc(HWN
 {
     if(msg == WM_MK_CONTINUE) {
         Binding *binding = (Binding*)lParam;
-        task_t *task;
+        task_header_t *task;
 
         while((task = pop_task(binding)))
             task->proc(binding, task);
@@ -696,26 +684,32 @@ static ULONG WINAPI InternetProtocolSink
     return IBinding_Release(BINDING(This));
 }
 
-static void switch_proc(Binding *binding, task_t *t)
+typedef struct {
+    task_header_t header;
+    PROTOCOLDATA *data;
+} switch_task_t;
+
+static void switch_proc(Binding *binding, task_header_t *t)
 {
-    IInternetProtocol_Continue(binding->protocol, t->data.protocol_data);
+    switch_task_t *task = (switch_task_t*)t;
+
+    IInternetProtocol_Continue(binding->protocol, task->data);
 
-    HeapFree(GetProcessHeap(), 0, t);
+    HeapFree(GetProcessHeap(), 0, task);
 }
 
 static HRESULT WINAPI InternetProtocolSink_Switch(IInternetProtocolSink *iface,
         PROTOCOLDATA *pProtocolData)
 {
     Binding *This = PROTSINK_THIS(iface);
-    task_t *task;
+    switch_task_t *task;
 
     TRACE("(%p)->(%p)\n", This, pProtocolData);
 
-    task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
-    task->proc = switch_proc;
-    task->data.protocol_data = pProtocolData;
+    task = HeapAlloc(GetProcessHeap(), 0, sizeof(switch_task_t));
+    task->data = pProtocolData;
 
-    push_task(This, task);
+    push_task(This, &task->header, switch_proc);
 
     IBinding_AddRef(BINDING(This));
     PostMessageW(This->notif_hwnd, WM_MK_CONTINUE, 0, (LPARAM)This);
@@ -723,19 +717,31 @@ static HRESULT WINAPI InternetProtocolSi
     return S_OK;
 }
 
-static void on_progress_proc(Binding *This, task_t *t)
+typedef struct {
+    task_header_t header;
+
+    Binding *binding;
+    ULONG progress;
+    ULONG progress_max;
+    ULONG status_code;
+    LPWSTR status_text;
+} on_progress_task_t;
+
+static void on_progress_proc(Binding *binding, task_header_t *t)
 {
-    IBindStatusCallback_OnProgress(This->callback, t->data.on_progress.progress,
-            t->data.on_progress.progress_max, t->data.on_progress.status_code, t->data.on_progress.status_text);
+    on_progress_task_t *task = (on_progress_task_t*)t;
+
+    IBindStatusCallback_OnProgress(binding->callback, task->progress,
+            task->progress_max, task->status_code, task->status_text);
 
-    HeapFree(GetProcessHeap(), 0, t->data.on_progress.status_text);
-    HeapFree(GetProcessHeap(), 0, t);
+    HeapFree(GetProcessHeap(), 0, task->status_text);
+    HeapFree(GetProcessHeap(), 0, task);
 }
 
 static void on_progress(Binding *This, ULONG progress, ULONG progress_max,
                         ULONG status_code, LPCWSTR status_text)
 {
-    task_t *task;
+    on_progress_task_t *task;
 
     if(GetCurrentThreadId() == This->apartment_thread && !This->continue_call) {
         IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
@@ -743,23 +749,22 @@ static void on_progress(Binding *This, U
         return;
     }
 
-    task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
+    task = HeapAlloc(GetProcessHeap(), 0, sizeof(on_progress_task_t));
 
-    task->proc = on_progress_proc;
-    task->data.on_progress.progress = progress;
-    task->data.on_progress.progress_max = progress_max;
-    task->data.on_progress.status_code = status_code;
+    task->progress = progress;
+    task->progress_max = progress_max;
+    task->status_code = status_code;
 
     if(status_text) {
         DWORD size = (strlenW(status_text)+1)*sizeof(WCHAR);
 
-        task->data.on_progress.status_text = HeapAlloc(GetProcessHeap(), 0, size);
-        memcpy(task->data.on_progress.status_text, status_text, size);
+        task->status_text = HeapAlloc(GetProcessHeap(), 0, size);
+        memcpy(task->status_text, status_text, size);
     }else {
-        task->data.on_progress.status_text = NULL;
+        task->status_text = NULL;
     }
 
-    push_task(This, task);
+    push_task(This, &task->header, on_progress_proc);
 
     if(GetCurrentThreadId() != This->apartment_thread) {
         IBinding_AddRef(BINDING(This));
@@ -814,11 +819,18 @@ static void report_data(Binding *This, D
             &formatetc, &This->stgmed);
 }
 
-static void report_data_proc(Binding *binding, task_t *t)
+typedef struct {
+    task_header_t header;
+    DWORD bscf;
+} report_data_task_t;
+
+static void report_data_proc(Binding *binding, task_header_t *t)
 {
-    report_data(binding, t->data.bscf);
+    report_data_task_t *task = (report_data_task_t*)t;
+
+    report_data(binding, task->bscf);
 
-    HeapFree(GetProcessHeap(), 0, t);
+    HeapFree(GetProcessHeap(), 0, task);
 }
 
 static HRESULT WINAPI InternetProtocolSink_ReportData(IInternetProtocolSink *iface,
@@ -857,11 +869,10 @@ static HRESULT WINAPI InternetProtocolSi
     }
 
     if(This->continue_call) {
-        task_t *task = HeapAlloc(GetProcessHeap(), 0, sizeof(task_t));
-        task->proc = report_data_proc;
-        task->data.bscf = grfBSCF;
+        report_data_task_t *task = HeapAlloc(GetProcessHeap(), 0, sizeof(report_data_task_t));
+        task->bscf = grfBSCF;
 
-        push_task(This, task);
+        push_task(This, &task->header, report_data_proc);
     }else {
         report_data(This, grfBSCF);
     }




More information about the wine-cvs mailing list