Piotr Caban : mshtml: Limit number of tasks processed in process_timer.
Module: wine Branch: master Commit: a6fbf560e9d05256a0b2ba5b5c17cc65fb51e00a URL: http://source.winehq.org/git/wine.git/?a=commit;h=a6fbf560e9d05256a0b2ba5b5c... Author: Piotr Caban <piotr(a)codeweavers.com> Date: Fri Apr 26 15:47:36 2013 +0200 mshtml: Limit number of tasks processed in process_timer. --- dlls/mshtml/task.c | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c index bb8b4e0..f9f12d5 100644 --- a/dlls/mshtml/task.c +++ b/dlls/mshtml/task.c @@ -255,17 +255,29 @@ static LRESULT process_timer(void) thread_data_t *thread_data; IDispatch *disp; DWORD tc; - task_timer_t *timer; + task_timer_t *timer=NULL, *last_timer; TRACE("\n"); thread_data = get_thread_data(FALSE); assert(thread_data != NULL); - while(!list_empty(&thread_data->timer_list)) { - timer = LIST_ENTRY(list_head(&thread_data->timer_list), task_timer_t, entry); + if(list_empty(&thread_data->timer_list)) { + KillTimer(thread_data->thread_hwnd, TIMER_ID); + return 0; + } + last_timer = LIST_ENTRY(list_tail(&thread_data->timer_list), task_timer_t, entry); + do { tc = GetTickCount(); + if(timer == last_timer) { + timer = LIST_ENTRY(list_head(&thread_data->timer_list), task_timer_t, entry); + SetTimer(thread_data->thread_hwnd, TIMER_ID, timer->time>tc ? timer->time-tc : 0, NULL); + return 0; + } + + timer = LIST_ENTRY(list_head(&thread_data->timer_list), task_timer_t, entry); + if(timer->time > tc) { SetTimer(thread_data->thread_hwnd, TIMER_ID, timer->time-tc, NULL); return 0; @@ -284,7 +296,7 @@ static LRESULT process_timer(void) call_timer_disp(disp); IDispatch_Release(disp); - } + }while(!list_empty(&thread_data->timer_list)); KillTimer(thread_data->thread_hwnd, TIMER_ID); return 0;
participants (1)
-
Alexandre Julliard