mirror of
https://github.com/reactos/reactos.git
synced 2024-10-08 10:24:06 +00:00
- 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:
parent
05a505aac8
commit
7457359d5d
|
@ -16,7 +16,7 @@ typedef struct _PORT_SET {
|
|||
PVOID ProtoBitBuffer;
|
||||
UINT StartingPort;
|
||||
UINT PortsToOversee;
|
||||
FAST_MUTEX Mutex;
|
||||
KSPIN_LOCK Lock;
|
||||
} PORT_SET, *PPORT_SET;
|
||||
|
||||
NTSTATUS PortsStartup( PPORT_SET PortSet,
|
||||
|
|
|
@ -24,7 +24,7 @@ NTSTATUS PortsStartup( PPORT_SET PortSet,
|
|||
PortSet->ProtoBitBuffer,
|
||||
PortSet->PortsToOversee );
|
||||
RtlClearAllBits( &PortSet->ProtoBitmap );
|
||||
ExInitializeFastMutex( &PortSet->Mutex );
|
||||
KeInitializeSpinLock( &PortSet->Lock );
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -33,17 +33,20 @@ VOID PortsShutdown( PPORT_SET PortSet ) {
|
|||
}
|
||||
|
||||
VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ) {
|
||||
KIRQL OldIrql;
|
||||
|
||||
Port = htons(Port);
|
||||
ASSERT(Port >= PortSet->StartingPort);
|
||||
ASSERT(Port < PortSet->StartingPort + PortSet->PortsToOversee);
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
|
||||
RtlClearBits( &PortSet->ProtoBitmap, Port - PortSet->StartingPort, 1 );
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
KeReleaseSpinLock( &PortSet->Lock, OldIrql );
|
||||
}
|
||||
|
||||
BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
|
||||
BOOLEAN Clear;
|
||||
KIRQL OldIrql;
|
||||
|
||||
Port = htons(Port);
|
||||
|
||||
|
@ -55,32 +58,34 @@ BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ) {
|
|||
|
||||
Port -= PortSet->StartingPort;
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
|
||||
Clear = RtlAreBitsClear( &PortSet->ProtoBitmap, Port, 1 );
|
||||
if( Clear ) RtlSetBits( &PortSet->ProtoBitmap, Port, 1 );
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
KeReleaseSpinLock( &PortSet->Lock, OldIrql );
|
||||
|
||||
return Clear;
|
||||
}
|
||||
|
||||
ULONG AllocateAnyPort( PPORT_SET PortSet ) {
|
||||
ULONG AllocatedPort;
|
||||
KIRQL OldIrql;
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
|
||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, 0 );
|
||||
if( AllocatedPort != (ULONG)-1 ) {
|
||||
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
||||
AllocatedPort += PortSet->StartingPort;
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
KeReleaseSpinLock( &PortSet->Lock, OldIrql );
|
||||
return htons(AllocatedPort);
|
||||
}
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
KeReleaseSpinLock( &PortSet->Lock, OldIrql );
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
|
||||
ULONG AllocatedPort;
|
||||
KIRQL OldIrql;
|
||||
|
||||
if ((Lowest < PortSet->StartingPort) ||
|
||||
(Highest >= PortSet->StartingPort + PortSet->PortsToOversee))
|
||||
|
@ -91,15 +96,15 @@ ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ) {
|
|||
Lowest -= PortSet->StartingPort;
|
||||
Highest -= PortSet->StartingPort;
|
||||
|
||||
ExAcquireFastMutex( &PortSet->Mutex );
|
||||
KeAcquireSpinLock( &PortSet->Lock, &OldIrql );
|
||||
AllocatedPort = RtlFindClearBits( &PortSet->ProtoBitmap, 1, Lowest );
|
||||
if( AllocatedPort != (ULONG)-1 && AllocatedPort <= Highest) {
|
||||
RtlSetBit( &PortSet->ProtoBitmap, AllocatedPort );
|
||||
AllocatedPort += PortSet->StartingPort;
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
KeReleaseSpinLock( &PortSet->Lock, OldIrql );
|
||||
return htons(AllocatedPort);
|
||||
}
|
||||
ExReleaseFastMutex( &PortSet->Mutex );
|
||||
KeReleaseSpinLock( &PortSet->Lock, OldIrql );
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue