- Use a spin lock to protect the port bitmap instead of a fast mutex

svn path=/branches/aicom-network-branch/; revision=45006
This commit is contained in:
Cameron Gutman 2010-01-08 18:21:52 +00:00
parent 05a505aac8
commit 7457359d5d
2 changed files with 17 additions and 12 deletions

View file

@ -16,7 +16,7 @@ typedef struct _PORT_SET {
PVOID ProtoBitBuffer; PVOID ProtoBitBuffer;
UINT StartingPort; UINT StartingPort;
UINT PortsToOversee; UINT PortsToOversee;
FAST_MUTEX Mutex; KSPIN_LOCK Lock;
} PORT_SET, *PPORT_SET; } PORT_SET, *PPORT_SET;
NTSTATUS PortsStartup( PPORT_SET PortSet, NTSTATUS PortsStartup( PPORT_SET PortSet,

View file

@ -24,7 +24,7 @@ NTSTATUS PortsStartup( PPORT_SET PortSet,
PortSet->ProtoBitBuffer, PortSet->ProtoBitBuffer,
PortSet->PortsToOversee ); PortSet->PortsToOversee );
RtlClearAllBits( &PortSet->ProtoBitmap ); RtlClearAllBits( &PortSet->ProtoBitmap );
ExInitializeFastMutex( &PortSet->Mutex ); KeInitializeSpinLock( &PortSet->Lock );
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -33,17 +33,20 @@ VOID PortsShutdown( PPORT_SET PortSet ) {
} }
VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ) { VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ) {
KIRQL OldIrql;
Port = htons(Port); Port = htons(Port);
ASSERT(Port >= PortSet->StartingPort); ASSERT(Port >= PortSet->StartingPort);
ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee); ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee);
ExAcquireFastMutex( &PortSet->Mutex ); KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 ); RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 );
ExReleaseFastMutex( &PortSet->Mutex ); KeReleaseSpinLock( &PortSet->Lock, OldIrql );
} }
BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) { BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
BOOLEAN Clear; BOOLEAN Clear;
KIRQL OldIrql;
Port = htons(Port); Port = htons(Port);
@ -55,32 +58,34 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
Port -= PortSet->StartingPort; Port -= PortSet->StartingPort;
ExAcquireFastMutex( &PortSet->Mutex ); KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 ); Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 );
if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 ); if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 );
ExReleaseFastMutex( &PortSet->Mutex ); KeReleaseSpinLock( &PortSet->Lock, OldIrql );
return Clear; return Clear;
} }
ULONG AllocateAnyPort( PPORT_SET PortSet ) { ULONG AllocateAnyPort( PPORT_SET PortSet ) {
ULONG AllocatedPort; ULONG AllocatedPort;
KIRQL OldIrql;
ExAcquireFastMutex( &PortSet->Mutex ); KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 ); AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 );
if( AllocatedPort != (ULONG)-1 ) { if( AllocatedPort != (ULONG)-1 ) {
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
AllocatedPort += PortSet->StartingPort; AllocatedPort += PortSet->StartingPort;
ExReleaseFastMutex( &PortSet->Mutex ); KeReleaseSpinLock( &PortSet->Lock, OldIrql );
return htons(AllocatedPort); return htons(AllocatedPort);
} }
ExReleaseFastMutex( &PortSet->Mutex ); KeReleaseSpinLock( &PortSet->Lock, OldIrql );
return -1; return -1;
} }
ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) { ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
ULONG AllocatedPort; ULONG AllocatedPort;
KIRQL OldIrql;
if ((Lowest < PortSet->StartingPort) || if ((Lowest < PortSet->StartingPort) ||
(Highest >= PortSet->StartingPort + PortSet->PortsToOversee)) (Highest >= PortSet->StartingPort + PortSet->PortsToOversee))
@ -91,15 +96,15 @@ ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
Lowest -= PortSet->StartingPort; Lowest -= PortSet->StartingPort;
Highest -= PortSet->StartingPort; Highest -= PortSet->StartingPort;
ExAcquireFastMutex( &PortSet->Mutex ); KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest ); AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest );
if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) { if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) {
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort ); RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
AllocatedPort += PortSet->StartingPort; AllocatedPort += PortSet->StartingPort;
ExReleaseFastMutex( &PortSet->Mutex ); KeReleaseSpinLock( &PortSet->Lock, OldIrql );
return htons(AllocatedPort); return htons(AllocatedPort);
} }
ExReleaseFastMutex( &PortSet->Mutex ); KeReleaseSpinLock( &PortSet->Lock, OldIrql );
return -1; return -1;
} }