-impl. process and thread cleanup

svn path=/trunk/; revision=4847
This commit is contained in:
Gunnar Dalsnes 2003-06-05 22:47:47 +00:00
parent 9b53ffc03a
commit aba6a902a2
6 changed files with 150 additions and 9 deletions

View file

@ -0,0 +1,6 @@
#ifndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H
#define _SUBSYS_WIN32K_INCLUDE_CLEANUP_H
NTSTATUS FASTCALL InitCleanupImpl(VOID);
#endif /* ndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H */

View file

@ -2,5 +2,6 @@
#define _SUBSYS_WIN32K_INCLUDE_TIMER_H
NTSTATUS FASTCALL InitTimerImpl(VOID);
VOID FASTCALL RemoveTimersThread(HANDLE ThreadID);
#endif /* ndef _SUBSYS_WIN32K_INCLUDE_TIMER_H */

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: dllmain.c,v 1.35 2003/05/18 17:16:17 ea Exp $
/* $Id: dllmain.c,v 1.36 2003/06/05 22:47:47 gdalsnes Exp $
*
* Entry Point for win32k.sys
*/
@ -38,6 +38,7 @@
#include <include/input.h>
#include <include/timer.h>
#include <include/text.h>
#include <include/cleanup.h>
#define NDEBUG
#include <win32k/debug1.h>
@ -120,6 +121,13 @@ DllMain (
return(Status);
}
Status = InitCleanupImpl();
if (!NT_SUCCESS(Status))
{
DbgPrint("Failed to initialize cleanup implementation.\n");
return(Status);
}
return STATUS_SUCCESS;
}

View file

@ -1,4 +1,4 @@
# $Id: makefile,v 1.64 2003/06/03 22:25:53 ekohl Exp $
# $Id: makefile,v 1.65 2003/06/05 22:47:47 gdalsnes Exp $
PATH_TO_TOP = ../..
@ -50,7 +50,7 @@ NTUSER_OBJECTS = ntuser/class.o ntuser/guicheck.o ntuser/hook.o \
ntuser/input.o ntuser/keyboard.o ntuser/callback.o \
ntuser/winpos.o ntuser/painting.o ntuser/metric.o \
ntuser/windc.o ntuser/prop.o ntuser/scrollbar.o \
ntuser/timer.o ntuser/misc.o
ntuser/timer.o ntuser/misc.o ntuser/cleanup.o
OBJECTS_OBJECTS = objects/bitmaps.o objects/brush.o objects/cliprgn.o \
objects/color.o objects/coord.o objects/dc.o \

View file

@ -0,0 +1,88 @@
/*
* ReactOS W32 Subsystem
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* PURPOSE: Thread/process cleanup
* FILE: subsys/win32k/ntuser/cleanup.c
* PROGRAMER: Gunnar
* REVISION HISTORY:
*
*/
/* INCLUDES ******************************************************************/
#include <ddk/ntddk.h>
#include <include/timer.h>
#define NDEBUG
#include <debug.h>
/* FUNCTIONS *****************************************************************/
VOID STDCALL
W32kCreateProcessNotify(
IN HANDLE ParentId,
IN HANDLE ProcessId,
IN BOOLEAN Create
)
{
if (Create){
return;
}
}
VOID STDCALL
W32kCreateThreadNotify(
IN HANDLE ProcessId,
IN HANDLE ThreadId,
IN BOOLEAN Create
)
{
if (Create){
return;
}
RemoveTimersThread(ThreadId);
}
NTSTATUS FASTCALL
InitCleanupImpl()
{
NTSTATUS Status;
Status = PsSetCreateThreadNotifyRoutine(W32kCreateThreadNotify);
if (!NT_SUCCESS(Status))
{
return Status;
}
Status = PsSetCreateProcessNotifyRoutine(W32kCreateProcessNotify,
FALSE);
return Status;
}

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: timer.c,v 1.3 2003/05/22 02:07:22 gdalsnes Exp $
/* $Id: timer.c,v 1.4 2003/06/05 22:47:47 gdalsnes Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -69,6 +69,7 @@ typedef struct _MSG_TIMER_ENTRY{
//return true if the new timer became the first entry
//must hold mutex while calling this
BOOL
FASTCALL
InsertTimerAscendingOrder(PMSG_TIMER_ENTRY NewTimer)
@ -101,6 +102,7 @@ InsertTimerAscendingOrder(PMSG_TIMER_ENTRY NewTimer)
}
//must hold mutex while calling this
PMSG_TIMER_ENTRY
FASTCALL
RemoveTimer(HWND hWnd, UINT_PTR IDEvent, HANDLE ThreadID)
@ -113,20 +115,55 @@ RemoveTimer(HWND hWnd, UINT_PTR IDEvent, HANDLE ThreadID)
while (EnumEntry != &TimerListHead)
{
MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry);
EnumEntry = EnumEntry->Flink;
if (MsgTimer->Msg.hwnd == hWnd &&
MsgTimer->Msg.wParam == (WPARAM)IDEvent &&
MsgTimer->ThreadID == ThreadID)
{
RemoveEntryList(EnumEntry);
RemoveEntryList(&MsgTimer->ListEntry);
return MsgTimer;
}
EnumEntry = EnumEntry->Flink;
}
return NULL;
}
/*
* NOTE: It doesn't kill timers. It just removes them from the list.
*/
VOID
FASTCALL
RemoveTimersThread(HANDLE ThreadID)
{
PMSG_TIMER_ENTRY MsgTimer;
PLIST_ENTRY EnumEntry;
ExAcquireFastMutex(&Mutex);
EnumEntry = TimerListHead.Flink;
while (EnumEntry != &TimerListHead)
{
MsgTimer = CONTAINING_RECORD(EnumEntry, MSG_TIMER_ENTRY, ListEntry);
EnumEntry = EnumEntry->Flink;
if (MsgTimer->ThreadID == ThreadID)
{
if (MsgTimer->Msg.hwnd == NULL)
{
RtlClearBits(&HandleLessTimersBitMap, ((UINT_PTR)MsgTimer->Msg.wParam) - 1, 1);
}
RemoveEntryList(&MsgTimer->ListEntry);
ExFreePool(MsgTimer);
}
}
ExReleaseFastMutex(&Mutex);
}
NTSTATUS
@ -163,6 +200,7 @@ NtUserSetTimer(
Index = RtlFindClearBitsAndSet(&HandleLessTimersBitMap, 1, HintIndex);
if (Index == -1)
{
ExReleaseFastMutex(&Mutex);
return STATUS_UNSUCCESSFUL;
}
@ -266,7 +304,9 @@ NtUserSetSystemTimer(
static NTSTATUS STDCALL
TimerThreadMain(VOID)
TimerThreadMain(
PVOID StartContext
)
{
NTSTATUS Status;
LARGE_INTEGER CurrentTime;
@ -305,12 +345,10 @@ TimerThreadMain(VOID)
/*
* FIXME: 1) Find a faster way of getting the thread message queue? (lookup by id is slow)
* 2) Kill all timers for thread when the thread exits?
*/
if (!NT_SUCCESS(PsLookupThreadByThreadId(MsgTimer->ThreadID, &Thread)))
{
//FIXME: remove all other timers for this thread also?
ExFreePool(MsgTimer);
continue;
}