mirror of
https://github.com/reactos/reactos.git
synced 2024-10-20 16:06:27 +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;
|
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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue