diff --git a/reactos/subsystems/win32/win32k/include/ntuser.h b/reactos/subsystems/win32/win32k/include/ntuser.h index eb71cc711fc..256aa6b85eb 100644 --- a/reactos/subsystems/win32/win32k/include/ntuser.h +++ b/reactos/subsystems/win32/win32k/include/ntuser.h @@ -1,58 +1,23 @@ #ifndef _WIN32K_NTUSER_H #define _WIN32K_NTUSER_H - -extern char* _file; -extern DWORD _line; -extern DWORD _locked; - -extern FAST_MUTEX UserLock; - #define DECLARE_RETURN(type) type _ret_ #define RETURN(value) { _ret_ = value; goto _cleanup_; } #define CLEANUP /*unreachable*/ ASSERT(FALSE); _cleanup_ #define END_CLEANUP return _ret_; -#define UserEnterCo() UserEnterExclusive() -#define UserLeaveCo() UserLeave() - -#define UserEnterShared() UserEnterExclusive() - -#define UserEnterExclusive() \ -{ \ - /* DPRINT1("try xlock, %s, %i (%i)\n",__FILE__,__LINE__, _locked);*/ \ - if (UserLock.Owner == KeGetCurrentThread()){ \ - DPRINT1("file %s, line %i\n",_file, _line); \ - ASSERT(FALSE); \ - } \ - UUserEnterExclusive(); \ - ASSERT(InterlockedIncrement((PLONG)(&_locked)) == 1 /*> 0*/); \ - _file = __FILE__; _line = __LINE__; \ - /* DPRINT("got lock, %s, %i (%i)\n",__FILE__,__LINE__, _locked);*/ \ -} - -#define UserLeave() \ -{ \ - ASSERT(InterlockedDecrement((PLONG)(&_locked)) == 0/*>= 0*/); \ - /*DPRINT("unlock, %s, %i (%i)\n",__FILE__,__LINE__, _locked);*/ \ - if (UserLock.Owner != KeGetCurrentThread()) { \ - DPRINT1("file %s, line %i\n",_file, _line); \ - ASSERT(FALSE); \ - } \ - _file = __FILE__; _line = __LINE__; \ - UUserLeave(); \ -} - +#define UserEnterCo UserEnterExclusive +#define UserLeaveCo UserLeave NTSTATUS FASTCALL InitUserImpl(VOID); -VOID FASTCALL UninitUser(VOID); -VOID FASTCALL UUserEnterShared(VOID); -VOID FASTCALL UUserEnterExclusive(VOID); -VOID FASTCALL UUserLeave(VOID); +VOID FASTCALL CleanupUserImpl(VOID); +VOID FASTCALL UserEnterShared(VOID); +VOID FASTCALL UserEnterExclusive(VOID); +VOID FASTCALL UserLeave(VOID); BOOL FASTCALL UserIsEntered(); - +BOOL FASTCALL UserIsEnteredExclusive(); #endif /* _WIN32K_NTUSER_H */ diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index 1e4be17713c..d77b115321a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -220,8 +220,8 @@ IntGetClassWndProc(IN PWINDOWCLASS Class, IN BOOL Ansi, IN BOOL UseCallProc2) { - /* FIXME - assert for exclusive lock! */ - + ASSERT(UserIsEnteredExclusive() == TRUE); + if (Class->System) { return (Ansi ? Class->WndProcExtra : Class->WndProc); diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index ca45604dd48..0ddba1eb5bc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -33,25 +33,16 @@ #define NDEBUG #include - -FAST_MUTEX UserLock; - -char* _file; -DWORD _line; -DWORD _locked=0; +ERESOURCE UserLock; /* FUNCTIONS **********************************************************/ NTSTATUS FASTCALL InitUserImpl(VOID) { - //PVOID mem; NTSTATUS Status; - // DPRINT("Enter InitUserImpl\n"); - // ExInitializeResourceLite(&UserLock); - - ExInitializeFastMutex(&UserLock); + ExInitializeResourceLite(&UserLock); if (!ObmCreateHandleTable()) { @@ -75,41 +66,31 @@ RETURN */ BOOL FASTCALL UserIsEntered() { - return (UserLock.Owner == KeGetCurrentThread()); + return ExIsResourceAcquiredExclusiveLite(&UserLock) + || ExIsResourceAcquiredSharedLite(&UserLock); } - -VOID FASTCALL CleanupUser(VOID) +BOOL FASTCALL UserIsEnteredExclusive() { - // ExDeleteResourceLite(&UserLock); + return ExIsResourceAcquiredExclusiveLite(&UserLock); } -VOID FASTCALL UUserEnterShared(VOID) +VOID FASTCALL CleanupUserImpl(VOID) { - // DPRINT("Enter IntLockUserShared\n"); - // KeDumpStackFrames((PULONG)__builtin_frame_address(0)); - //DPRINT("%x\n",__builtin_return_address(0)); - // KeEnterCriticalRegion(); - // ExAcquireResourceSharedLite(&UserLock, TRUE); - ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&UserLock); + ExDeleteResourceLite(&UserLock); } -VOID FASTCALL UUserEnterExclusive(VOID) +VOID FASTCALL UserEnterShared(VOID) { - // DPRINT("Enter UserEnterExclusive\n"); - // KeDumpStackFrames((PULONG)__builtin_frame_address(0)); - //DPRINT("%x\n",__builtin_return_address(0)); - // KeEnterCriticalRegion(); - // ExAcquireResourceExclusiveLite(&UserLock, TRUE); - ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&UserLock); + ExAcquireResourceSharedLite(&UserLock, TRUE); } -VOID FASTCALL UUserLeave(VOID) +VOID FASTCALL UserEnterExclusive(VOID) { - // DPRINT("Enter UserLeave\n"); - // KeDumpStackFrames((PULONG)__builtin_frame_address(0)); - //DPRINT("%x\n",__builtin_return_address(0)); - // ExReleaseResourceLite(&UserLock); - // KeLeaveCriticalRegion(); - ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&UserLock); + ExAcquireResourceExclusiveLite(&UserLock, TRUE); +} + +VOID FASTCALL UserLeave(VOID) +{ + ExReleaseResourceLite(&UserLock); }