[ros-diffs] [jimtabor] 35138: Win32k Timers: - This is relative to bugs 3634 and 2393. Please leave additional information in bug report 2393. - Timer code should not be associated with message queues, since theses types of queues are subject to being destroyed. This creates a problem of loosing timers. - This is a first part of a rewrite of the timers. Moving the timers from the message queue to a linked list very similar to our DCE code. This will simplify timer handling too.
jimtabor at svn.reactos.org
jimtabor at svn.reactos.org
Wed Aug 6 04:05:17 CEST 2008
Author: jimtabor
Date: Tue Aug 5 21:05:17 2008
New Revision: 35138
URL: http://svn.reactos.org/svn/reactos?rev=35138&view=rev
Log:
Win32k Timers:
- This is relative to bugs 3634 and 2393. Please leave additional information in bug report 2393.
- Timer code should not be associated with message queues, since theses types of queues are subject to being destroyed. This creates a problem of loosing timers.
- This is a first part of a rewrite of the timers. Moving the timers from the message queue to a linked list very similar to our DCE code. This will simplify timer handling too.
Modified:
trunk/reactos/subsystems/win32/win32k/include/timer.h
trunk/reactos/subsystems/win32/win32k/ntuser/hook.c
trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
Modified: trunk/reactos/subsystems/win32/win32k/include/timer.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/timer.h?rev=35138&r1=35137&r2=35138&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/timer.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/timer.h [iso-8859-1] Tue Aug 5 21:05:17 2008
@@ -1,5 +1,17 @@
#ifndef _WIN32K_TIMER_H
#define _WIN32K_TIMER_H
+
+typedef struct _TIMER
+{
+ LIST_ENTRY ptmrList;
+ PW32THREADINFO pti;
+ PWINDOW_OBJECT pWnd; // hWnd
+ UINT_PTR nID; // Specifies a nonzero timer identifier.
+ INT cmsCountdown; // uElapse
+ INT cmsRate; // uElapse
+ FLONG flags;
+ TIMERPROC pfn; // lpTimerFunc
+} TIMER, *PTIMER;
NTSTATUS FASTCALL InitTimerImpl(VOID);
BOOL FASTCALL IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/hook.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/hook.c?rev=35138&r1=35137&r2=35138&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/hook.c [iso-8859-1] Tue Aug 5 21:05:17 2008
@@ -1131,7 +1131,7 @@
ModuleName.MaximumLength);
if (! NT_SUCCESS(Status))
{
- ExFreePool(Hook->ModuleName.Buffer);
+ ExFreePool(Hook->ModuleName.Buffer);
UserDereferenceObject(Hook);
IntRemoveHook(Hook, WinStaObj, FALSE);
if (NULL != Thread)
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/timer.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/timer.c?rev=35138&r1=35137&r2=35138&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/ntuser/timer.c [iso-8859-1] Tue Aug 5 21:05:17 2008
@@ -16,12 +16,11 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Window timers messages
- * FILE: subsys/win32k/ntuser/timer.c
+ * FILE: subsystems/win32/win32k/ntuser/timer.c
* PROGRAMER: Gunnar
* Thomas Weidenmueller (w3seek at users.sourceforge.net)
* REVISION HISTORY: 10/04/2003 Implemented System Timers
@@ -36,6 +35,8 @@
#include <debug.h>
/* GLOBALS *******************************************************************/
+
+static PTIMER FirstpTmr = NULL;
/* Windows 2000 has room for 32768 window-less timers */
#define NUM_WINDOW_LESS_TIMERS 1024
@@ -148,20 +149,40 @@
BOOL FASTCALL
IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer)
{
+ PWINDOW_OBJECT Window = NULL;
+
DPRINT("IntKillTimer wnd %x id %p systemtimer %s\n",
Wnd, IDEvent, SystemTimer ? "TRUE" : "FALSE");
- if (! MsqKillTimer(PsGetCurrentThreadWin32Thread()->MessageQueue, Wnd,
- IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER))
- {
- DPRINT1("Unable to locate timer in message queue\n");
- SetLastWin32Error(ERROR_INVALID_PARAMETER);
- return FALSE;
+ if (Wnd)
+ {
+ Window = UserGetWindowObject(Wnd);
+
+ if (! MsqKillTimer(PsGetCurrentThreadWin32Thread()->MessageQueue, Wnd,
+ IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER))
+ {
+ // Give it another chance to find the timer.
+ if (Window && !( MsqKillTimer(Window->MessageQueue, Wnd,
+ IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER)))
+ {
+ DPRINT1("Unable to locate timer in message queue for Window.\n");
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ }
}
/* window-less timer? */
if ((Wnd == NULL) && ! SystemTimer)
{
+ if (! MsqKillTimer(PsGetCurrentThreadWin32Thread()->MessageQueue, Wnd,
+ IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER))
+ {
+ DPRINT1("Unable to locate timer in message queue for Window-less timer.\n");
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
/* Release the id */
IntLockWindowlessTimerBitmap();
@@ -194,6 +215,12 @@
/* yes we need this, since ExAllocatePool isn't supposed to zero out allocated memory */
RtlClearAllBits(&WindowLessTimersBitMap);
+
+ if (!FirstpTmr)
+ {
+ FirstpTmr = ExAllocatePoolWithTag(PagedPool, sizeof(TIMER), TAG_TIMERBMP);
+ if (FirstpTmr) InitializeListHead(&FirstpTmr->ptmrList);
+ }
return STATUS_SUCCESS;
}
More information about the Ros-diffs
mailing list