Author: jimtabor Date: Sun Dec 8 22:44:02 2013 New Revision: 61250
URL: http://svn.reactos.org/svn/reactos?rev=61250&view=rev Log: [Win32k] - Fix timer for CORE-4701. Test application now works.
Modified: trunk/reactos/win32ss/user/ntuser/msgqueue.c trunk/reactos/win32ss/user/ntuser/timer.c
Modified: trunk/reactos/win32ss/user/ntuser/msgqueue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/msgqueu... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/msgqueue.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/msgqueue.c [iso-8859-1] Sun Dec 8 22:44:02 2013 @@ -1239,7 +1239,7 @@ Message->dwQEvent = dwQEvent; Message->QS_Flags = MessageBits; Message->pti = pti; - MsqWakeQueue(pti, MessageBits, (MessageBits & QS_TIMER ? FALSE : TRUE)); + MsqWakeQueue(pti, MessageBits, TRUE); }
VOID FASTCALL
Modified: trunk/reactos/win32ss/user/ntuser/timer.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/timer.c... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/timer.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/timer.c [iso-8859-1] Sun Dec 8 22:44:02 2013 @@ -16,8 +16,6 @@ static LIST_ENTRY TimersListHead; static LONG TimeLast = 0;
-#define MAX_ELAPSE_TIME 0x7FFFFFFF - /* Windows 2000 has room for 32768 window-less timers */ #define NUM_WINDOW_LESS_TIMERS 32768
@@ -189,25 +187,25 @@
#if 0 /* Windows NT/2k/XP behaviour */ - if (Elapse > MAX_ELAPSE_TIME) + if (Elapse > USER_TIMER_MAXIMUM) { TRACE("Adjusting uElapse\n"); Elapse = 1; } #else /* Windows XP SP2 and Windows Server 2003 behaviour */ - if (Elapse > MAX_ELAPSE_TIME) + if (Elapse > USER_TIMER_MAXIMUM) { TRACE("Adjusting uElapse\n"); - Elapse = MAX_ELAPSE_TIME; + Elapse = USER_TIMER_MAXIMUM; } #endif
/* Windows 2k/XP and Windows Server 2003 SP1 behaviour */ - if (Elapse < 10) + if (Elapse < USER_TIMER_MINIMUM) { TRACE("Adjusting uElapse\n"); - Elapse = 10; // 1024hz .9765625 ms, set to 10.0 ms (+/-)1 ms + Elapse = USER_TIMER_MINIMUM; // 1024hz .9765625 ms, set to 10.0 ms (+/-)1 ms }
/* Passing an IDEvent of 0 and the SetTimer returns 1. @@ -407,9 +405,9 @@ Msg.wParam = (WPARAM) pTmr->nID; Msg.lParam = (LPARAM) pTmr->pfn;
- MsqPostMessage(pti, &Msg, FALSE, QS_TIMER, 0); + MsqPostMessage(pti, &Msg, FALSE, (QS_POSTMESSAGE|QS_ALLPOSTMESSAGE), 0); pTmr->flags &= ~TMRF_READY; - pti->cTimersReady++; + ClearMsgBitsMask(pti, QS_TIMER); Hit = TRUE; // Now move this entry to the end of the list so it will not be // called again in the next msg loop. @@ -480,10 +478,11 @@ { pTmr->flags |= TMRF_READY; // Set timer ready to be ran. // Set thread message queue for this timer. - if (pTmr->pti->MessageQueue) + if (pTmr->pti) { // Wakeup thread + pTmr->pti->cTimersReady++; ASSERT(pTmr->pti->pEventQueueServer != NULL); - KeSetEvent(pTmr->pti->pEventQueueServer, IO_NO_INCREMENT, FALSE); + MsqWakeQueue(pTmr->pti, QS_TIMER, TRUE); } } }