Jacek Caban : mshtml: Allow async tasks to have custom destructors.

Alexandre Julliard julliard at winehq.org
Wed Aug 3 12:48:11 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Aug  3 12:34:34 2011 +0200

mshtml: Allow async tasks to have custom destructors.

---

 dlls/mshtml/htmlwindow.c     |    4 ++--
 dlls/mshtml/mshtml_private.h |    3 ++-
 dlls/mshtml/navigate.c       |    4 ++--
 dlls/mshtml/nsio.c           |    2 +-
 dlls/mshtml/persist.c        |    4 ++--
 dlls/mshtml/task.c           |   10 ++++++++--
 6 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 465db09..61d0837 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -1847,7 +1847,7 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
         task->window = This;
         task->bscallback = bsc;
         task->mon = mon;
-        push_task(&task->header, navigate_proc, This->task_magic);
+        push_task(&task->header, navigate_proc, NULL, This->task_magic);
 
         /* Silently and repeated when real loading starts? */
         This->readystate = READYSTATE_LOADING;
@@ -1866,7 +1866,7 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
         IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
         task->window = This;
         task->uri = uri;
-        push_task(&task->header, navigate_javascript_proc, This->task_magic);
+        push_task(&task->header, navigate_javascript_proc, NULL, This->task_magic);
 
         /* Why silently? */
         This->readystate = READYSTATE_COMPLETE;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 66f89c9..cc92d2f 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -817,6 +817,7 @@ typedef void (*task_proc_t)(task_t*);
 struct task_t {
     LONG target_magic;
     task_proc_t proc;
+    task_proc_t destr;
     struct task_t *next;
 };
 
@@ -836,7 +837,7 @@ thread_data_t *get_thread_data(BOOL) DECLSPEC_HIDDEN;
 HWND get_thread_hwnd(void) DECLSPEC_HIDDEN;
 
 LONG get_task_target_magic(void) DECLSPEC_HIDDEN;
-void push_task(task_t*,task_proc_t,LONG) DECLSPEC_HIDDEN;
+void push_task(task_t*,task_proc_t,task_proc_t,LONG) DECLSPEC_HIDDEN;
 void remove_target_tasks(LONG) DECLSPEC_HIDDEN;
 
 DWORD set_task_timer(HTMLDocument*,DWORD,BOOL,IDispatch*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 7c38935..ee6fd93 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1242,7 +1242,7 @@ static HRESULT async_stop_request(nsChannelBSC *This)
 
     IBindStatusCallback_AddRef(&This->bsc.IBindStatusCallback_iface);
     task->bsc = This;
-    push_task(&task->header, stop_request_proc, This->bsc.doc->basedoc.doc_obj->basedoc.task_magic);
+    push_task(&task->header, stop_request_proc, NULL, This->bsc.doc->basedoc.doc_obj->basedoc.task_magic);
     return S_OK;
 }
 
@@ -1606,7 +1606,7 @@ HRESULT async_start_doc_binding(HTMLWindow *window, nsChannelBSC *bscallback)
     task->bscallback = bscallback;
     IBindStatusCallback_AddRef(&bscallback->bsc.IBindStatusCallback_iface);
 
-    push_task(&task->header, start_doc_binding_proc, window->task_magic);
+    push_task(&task->header, start_doc_binding_proc, NULL, window->task_magic);
     return S_OK;
 }
 
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index ef36afb..36ffcf8 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -925,7 +925,7 @@ static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_chan
 
         task->doc = window->doc;
         task->bscallback = bscallback;
-        push_task(&task->header, start_binding_proc, window->doc->basedoc.task_magic);
+        push_task(&task->header, start_binding_proc, NULL, window->doc->basedoc.task_magic);
     }
 
     return NS_OK;
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 550414f..a8f6834 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -296,14 +296,14 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
 
         task = heap_alloc(sizeof(docobj_task_t));
         task->doc = This->doc_obj;
-        push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic);
+        push_task(&task->header, set_progress_proc, NULL, This->doc_obj->basedoc.task_magic);
     }
 
     download_task = heap_alloc(sizeof(download_proc_task_t));
     download_task->doc = This->doc_obj;
     download_task->set_download = set_download;
     download_task->url = url;
-    push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic);
+    push_task(&download_task->header, set_downloading_proc, NULL, This->doc_obj->basedoc.task_magic);
 
     return S_OK;
 }
diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c
index c896179..136561c 100644
--- a/dlls/mshtml/task.c
+++ b/dlls/mshtml/task.c
@@ -47,12 +47,18 @@ typedef struct {
     struct list entry;
 } task_timer_t;
 
-void push_task(task_t *task, task_proc_t proc, LONG magic)
+static void default_task_destr(task_t *task)
+{
+    heap_free(task);
+}
+
+void push_task(task_t *task, task_proc_t proc, task_proc_t destr, LONG magic)
 {
     thread_data_t *thread_data = get_thread_data(TRUE);
 
     task->target_magic = magic;
     task->proc = proc;
+    task->destr = destr ? destr : default_task_destr;
     task->next = NULL;
 
     if(thread_data->task_queue_tail)
@@ -266,7 +272,7 @@ static LRESULT WINAPI hidden_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
                 break;
 
             task->proc(task);
-            heap_free(task);
+            task->destr(task);
         }
 
         return 0;




More information about the wine-cvs mailing list