Jacek Caban : mshtml: Use standard list to store task queue.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Dec 24 13:40:37 CST 2014


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Dec 24 13:09:59 2014 +0100

mshtml: Use standard list to store task queue.

---

 dlls/mshtml/mshtml_private.h |  5 ++---
 dlls/mshtml/task.c           | 38 +++++++++++---------------------------
 2 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 8529231..5553bf2 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1018,7 +1018,7 @@ struct task_t {
     LONG target_magic;
     task_proc_t proc;
     task_proc_t destr;
-    struct task_t *next;
+    struct list entry;
 };
 
 typedef struct {
@@ -1028,8 +1028,7 @@ typedef struct {
 
 typedef struct {
     HWND thread_hwnd;
-    task_t *task_queue_head;
-    task_t *task_queue_tail;
+    struct list task_list;
     struct list timer_list;
 } thread_data_t;
 
diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c
index 6baac63..d0c888f 100644
--- a/dlls/mshtml/task.c
+++ b/dlls/mshtml/task.c
@@ -69,14 +69,8 @@ HRESULT push_task(task_t *task, task_proc_t proc, task_proc_t destr, LONG magic)
     task->target_magic = magic;
     task->proc = proc;
     task->destr = destr ? destr : default_task_destr;
-    task->next = NULL;
 
-    if(thread_data->task_queue_tail)
-        thread_data->task_queue_tail->next = task;
-    else
-        thread_data->task_queue_head = task;
-
-    thread_data->task_queue_tail = task;
+    list_add_tail(&thread_data->task_list, &task->entry);
 
     PostMessageW(thread_data->thread_hwnd, WM_PROCESSTASK, 0, 0);
     return S_OK;
@@ -91,14 +85,11 @@ static task_t *pop_task(void)
     if(!thread_data)
         return NULL;
 
-    task = thread_data->task_queue_head;
-    if(!task)
+    if(list_empty(&thread_data->task_list))
         return NULL;
 
-    thread_data->task_queue_head = task->next;
-    if(!thread_data->task_queue_head)
-        thread_data->task_queue_tail = NULL;
-
+    task = LIST_ENTRY(thread_data->task_list.next, task_t, entry);
+    list_remove(&task->entry);
     return task;
 }
 
@@ -116,7 +107,7 @@ void remove_target_tasks(LONG target)
     thread_data_t *thread_data = get_thread_data(FALSE);
     struct list *liter, *ltmp;
     task_timer_t *timer;
-    task_t *iter, *tmp;
+    task_t *task;
 
     if(!thread_data)
         return;
@@ -134,20 +125,12 @@ void remove_target_tasks(LONG target)
         SetTimer(thread_data->thread_hwnd, TIMER_ID, max( (int)(timer->time - tc), 0 ), NULL);
     }
 
-    while(thread_data->task_queue_head && thread_data->task_queue_head->target_magic == target) {
-        iter = pop_task();
-        iter->destr(iter);
-    }
-
-    for(iter = thread_data->task_queue_head; iter; iter = iter->next) {
-        while(iter->next && iter->next->target_magic == target) {
-            tmp = iter->next;
-            iter->next = tmp->next;
-            tmp->destr(tmp);
+    LIST_FOR_EACH_SAFE(liter, ltmp, &thread_data->task_list) {
+        task = LIST_ENTRY(liter, task_t, entry);
+        if(task->target_magic == target) {
+            list_remove(&task->entry);
+            task->destr(task);
         }
-
-        if(!iter->next)
-            thread_data->task_queue_tail = iter;
     }
 }
 
@@ -390,6 +373,7 @@ thread_data_t *get_thread_data(BOOL create)
             return NULL;
 
         TlsSetValue(mshtml_tls, thread_data);
+        list_init(&thread_data->task_list);
         list_init(&thread_data->timer_list);
     }
 




More information about the wine-cvs mailing list