Author: cgutman Date: Wed Aug 5 01:51:39 2009 New Revision: 42400
URL: http://svn.reactos.org/svn/reactos?rev=42400&view=rev Log: - Partial rewrite of recursive mutex code - Makes the recursive mutex faster and smaller - Fixes several unprotected accesses to recursive mutex
Modified: trunk/reactos/drivers/network/tcpip/include/lock.h trunk/reactos/drivers/network/tcpip/recmutex/recmutex.c trunk/reactos/drivers/network/tcpip/recmutex/recmutex.h trunk/reactos/drivers/network/tcpip/tcpip/lock.c
Modified: trunk/reactos/drivers/network/tcpip/include/lock.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/inclu... ============================================================================== --- trunk/reactos/drivers/network/tcpip/include/lock.h [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/include/lock.h [iso-8859-1] Wed Aug 5 01:51:39 2009 @@ -13,7 +13,7 @@ extern VOID TcpipAcquireFastMutex( PFAST_MUTEX Mutex ); extern VOID TcpipReleaseFastMutex( PFAST_MUTEX Mutex ); extern VOID TcpipRecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ); -extern UINT TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, +extern VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ); extern VOID TcpipRecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex );
Modified: trunk/reactos/drivers/network/tcpip/recmutex/recmutex.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/recmu... ============================================================================== --- trunk/reactos/drivers/network/tcpip/recmutex/recmutex.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/recmutex/recmutex.c [iso-8859-1] Wed Aug 5 01:51:39 2009 @@ -3,7 +3,6 @@
VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ) { RtlZeroMemory( RecMutex, sizeof(*RecMutex) ); - KeInitializeSpinLock( &RecMutex->SpinLock ); ExInitializeFastMutex( &RecMutex->Mutex ); KeInitializeEvent( &RecMutex->StateLockedEvent, NotificationEvent, FALSE ); @@ -11,76 +10,53 @@
/* NOTE: When we leave, the FAST_MUTEX must have been released. The result * is that we always exit in the same irql as entering */ -SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { +VOID RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex ) { NTSTATUS Status = STATUS_SUCCESS; PVOID CurrentThread = KeGetCurrentThread(); - KIRQL CurrentIrql; + KIRQL CurrentIrql = KeGetCurrentIrql(); + + ASSERT(RecMutex); + ASSERT(CurrentIrql <= APC_LEVEL);
/* Wait for the previous user to unlock the RecMutex state. There might be * multiple waiters waiting to change the state. We need to check each * time we get the event whether somebody still has the state locked */
- if( !RecMutex ) return FALSE; + ExAcquireFastMutex( &RecMutex->Mutex );
- if( CurrentThread == RecMutex->CurrentThread || - (!ToWrite && !RecMutex->Writer) ) { + if( CurrentThread == RecMutex->CurrentThread ) { RecMutex->LockCount++; - return TRUE; + ExReleaseFastMutex( &RecMutex->Mutex ); + return; }
- CurrentIrql = KeGetCurrentIrql(); - - ASSERT(CurrentIrql <= DISPATCH_LEVEL); - - if( CurrentIrql <= APC_LEVEL ) { - ExAcquireFastMutex( &RecMutex->Mutex ); - while( RecMutex->Locked ) { - ExReleaseFastMutex( &RecMutex->Mutex ); - Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent, - UserRequest, - KernelMode, - FALSE, - NULL ); - ExAcquireFastMutex( &RecMutex->Mutex ); - } - RecMutex->OldIrql = CurrentIrql; - RecMutex->Locked = TRUE; - RecMutex->Writer = ToWrite; - RecMutex->CurrentThread = CurrentThread; - RecMutex->LockCount++; - ExReleaseFastMutex( &RecMutex->Mutex ); - } else { - KeAcquireSpinLockAtDpcLevel( &RecMutex->SpinLock ); - RecMutex->OldIrql = DISPATCH_LEVEL; - RecMutex->Locked = TRUE; - RecMutex->Writer = ToWrite; - RecMutex->CurrentThread = CurrentThread; - RecMutex->LockCount++; + while( RecMutex->LockCount != 0 ) { + ExReleaseFastMutex( &RecMutex->Mutex ); + Status = KeWaitForSingleObject( &RecMutex->StateLockedEvent, + UserRequest, + KernelMode, + FALSE, + NULL ); + ExAcquireFastMutex( &RecMutex->Mutex ); } - - return TRUE; + RecMutex->CurrentThread = CurrentThread; + RecMutex->LockCount++; + ExReleaseFastMutex( &RecMutex->Mutex ); }
VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) { + ASSERT(RecMutex); + + ExAcquireFastMutex( &RecMutex->Mutex );
ASSERT(RecMutex->LockCount > 0); RecMutex->LockCount--;
if( !RecMutex->LockCount ) { - RecMutex->CurrentThread = NULL; - if( RecMutex->OldIrql <= APC_LEVEL ) { - ExAcquireFastMutex( &RecMutex->Mutex ); - RecMutex->Locked = FALSE; - RecMutex->Writer = FALSE; - ExReleaseFastMutex( &RecMutex->Mutex ); - } else { - RecMutex->Locked = FALSE; - RecMutex->Writer = FALSE; - KeReleaseSpinLockFromDpcLevel( &RecMutex->SpinLock ); - } - KePulseEvent( &RecMutex->StateLockedEvent, IO_NETWORK_INCREMENT, FALSE ); } + + ExReleaseFastMutex( &RecMutex->Mutex ); }
Modified: trunk/reactos/drivers/network/tcpip/recmutex/recmutex.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/recmu... ============================================================================== --- trunk/reactos/drivers/network/tcpip/recmutex/recmutex.h [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/recmutex/recmutex.h [iso-8859-1] Wed Aug 5 01:51:39 2009 @@ -10,20 +10,12 @@ PVOID CurrentThread; /* Notification event which signals that another thread can take over */ KEVENT StateLockedEvent; - /* IRQL from spin lock */ - KIRQL OldIrql; - /* Is Locked */ - BOOLEAN Locked; - /* Is reader or writer phase */ - BOOLEAN Writer; - /* Spin lock needed for */ - KSPIN_LOCK SpinLock; } RECURSIVE_MUTEX, *PRECURSIVE_MUTEX;
extern VOID RecursiveMutexInit( PRECURSIVE_MUTEX RecMutex ); -extern SIZE_T RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToRead ); +extern VOID RecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex ); extern VOID RecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex );
-#define ASSERT_LOCKED(x) ASSERT((x)->Locked) +#define ASSERT_LOCKED(x)
#endif/*_ROSRTL_RECMUTEX_H*/
Modified: trunk/reactos/drivers/network/tcpip/tcpip/lock.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpip... ============================================================================== --- trunk/reactos/drivers/network/tcpip/tcpip/lock.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/tcpip/tcpip/lock.c [iso-8859-1] Wed Aug 5 01:51:39 2009 @@ -48,11 +48,9 @@ RecursiveMutexInit( RecMutex ); }
-UINT TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { - UINT Ret; +VOID TcpipRecursiveMutexEnter( PRECURSIVE_MUTEX RecMutex, BOOLEAN ToWrite ) { //TI_DbgPrint(DEBUG_LOCK,("Locking\n")); - Ret = RecursiveMutexEnter( RecMutex, ToWrite ); - return Ret; + RecursiveMutexEnter( RecMutex ); }
VOID TcpipRecursiveMutexLeave( PRECURSIVE_MUTEX RecMutex ) {