Module: wine Branch: master Commit: 7247eaa181eb05e423cdac6944bd62afeb6b91c2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7247eaa181eb05e423cdac6944...
Author: Jacek Caban jacek@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;