Module: wine Branch: master Commit: 2f0b93ca134ca68857bef36a3f2a5cf8f620740a URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f0b93ca134ca68857bef36a3f...
Author: Jörg Höhle hoehle@users.sourceforge.net Date: Sun Mar 4 07:30:18 2012 +0100
ntdll: Stabilize CreateTimerQueueTimer callbacks over time.
---
dlls/ntdll/threadpool.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/threadpool.c b/dlls/ntdll/threadpool.c index f246cfb..e33a025 100644 --- a/dlls/ntdll/threadpool.c +++ b/dlls/ntdll/threadpool.c @@ -651,13 +651,21 @@ static void queue_timer_expire(struct timer_queue *q) RtlEnterCriticalSection(&q->cs); if (list_head(&q->timers)) { + ULONGLONG now, next; t = LIST_ENTRY(list_head(&q->timers), struct queue_timer, entry); - if (!t->destroy && t->expire <= queue_current_time()) + if (!t->destroy && t->expire <= ((now = queue_current_time()))) { ++t->runcount; - queue_move_timer( - t, t->period ? queue_current_time() + t->period : EXPIRE_NEVER, - FALSE); + if (t->period) + { + next = t->expire + t->period; + /* avoid trigger cascade if overloaded / hibernated */ + if (next < now) + next = now + t->period; + } + else + next = EXPIRE_NEVER; + queue_move_timer(t, next, FALSE); } else t = NULL;