mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 09:23:06 +00:00
Fixes: Lock does not need to acquire a spinlock in the non-passive-level
case because we can't contend with outselves in passive level. Realized subtle bug in select. Select needs a referenced file object rather than a handle. Will change this when i get time. svn path=/trunk/; revision=10993
This commit is contained in:
parent
36cc9bb181
commit
51580f3182
5 changed files with 39 additions and 37 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: lock.c,v 1.2 2004/07/18 22:49:17 arty Exp $
|
/* $Id: lock.c,v 1.3 2004/09/23 06:42:16 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/lock.c
|
* FILE: drivers/net/afd/afd/lock.c
|
||||||
|
@ -100,6 +100,7 @@ VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count ) {
|
||||||
UINT SocketAcquireStateLock( PAFD_FCB FCB ) {
|
UINT SocketAcquireStateLock( PAFD_FCB FCB ) {
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PVOID CurrentThread = KeGetCurrentThread();
|
PVOID CurrentThread = KeGetCurrentThread();
|
||||||
|
KIRQL CurrentIrql = KeGetCurrentIrql();
|
||||||
|
|
||||||
AFD_DbgPrint(MAX_TRACE,("Called on %x, attempting to lock\n", FCB));
|
AFD_DbgPrint(MAX_TRACE,("Called on %x, attempting to lock\n", FCB));
|
||||||
|
|
||||||
|
@ -120,7 +121,8 @@ UINT SocketAcquireStateLock( PAFD_FCB FCB ) {
|
||||||
CurrentThread, FCB->CurrentThread));
|
CurrentThread, FCB->CurrentThread));
|
||||||
}
|
}
|
||||||
|
|
||||||
if( KeGetCurrentIrql() == PASSIVE_LEVEL ) {
|
|
||||||
|
if( CurrentIrql == PASSIVE_LEVEL ) {
|
||||||
ExAcquireFastMutex( &FCB->Mutex );
|
ExAcquireFastMutex( &FCB->Mutex );
|
||||||
while( FCB->Locked ) {
|
while( FCB->Locked ) {
|
||||||
AFD_DbgPrint
|
AFD_DbgPrint
|
||||||
|
@ -139,8 +141,7 @@ UINT SocketAcquireStateLock( PAFD_FCB FCB ) {
|
||||||
FCB->CurrentThread = CurrentThread;
|
FCB->CurrentThread = CurrentThread;
|
||||||
FCB->LockCount++;
|
FCB->LockCount++;
|
||||||
ExReleaseFastMutex( &FCB->Mutex );
|
ExReleaseFastMutex( &FCB->Mutex );
|
||||||
} else {
|
} else { /* Nothing since we're not at PASSIVE_LEVEL */
|
||||||
KeAcquireSpinLock( &FCB->SpinLock, &FCB->OldIrql );
|
|
||||||
FCB->Locked = TRUE;
|
FCB->Locked = TRUE;
|
||||||
FCB->CurrentThread = CurrentThread;
|
FCB->CurrentThread = CurrentThread;
|
||||||
FCB->LockCount++;
|
FCB->LockCount++;
|
||||||
|
@ -156,14 +157,7 @@ VOID SocketStateUnlock( PAFD_FCB FCB ) {
|
||||||
|
|
||||||
if( !FCB->LockCount ) {
|
if( !FCB->LockCount ) {
|
||||||
FCB->CurrentThread = NULL;
|
FCB->CurrentThread = NULL;
|
||||||
if( KeGetCurrentIrql() == PASSIVE_LEVEL ) {
|
|
||||||
ExAcquireFastMutex( &FCB->Mutex );
|
|
||||||
FCB->Locked = FALSE;
|
FCB->Locked = FALSE;
|
||||||
ExReleaseFastMutex( &FCB->Mutex );
|
|
||||||
} else {
|
|
||||||
FCB->Locked = FALSE;
|
|
||||||
KeReleaseSpinLock( &FCB->SpinLock, FCB->OldIrql );
|
|
||||||
}
|
|
||||||
|
|
||||||
AFD_DbgPrint(MAX_TRACE,("Unlocked.\n"));
|
AFD_DbgPrint(MAX_TRACE,("Unlocked.\n"));
|
||||||
KePulseEvent( &FCB->StateLockedEvent, IO_NETWORK_INCREMENT, FALSE );
|
KePulseEvent( &FCB->StateLockedEvent, IO_NETWORK_INCREMENT, FALSE );
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: main.c,v 1.6 2004/09/05 04:26:29 arty Exp $
|
/* $Id: main.c,v 1.7 2004/09/23 06:42:16 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/main.c
|
* FILE: drivers/net/afd/afd/main.c
|
||||||
|
@ -139,7 +139,6 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
VOID DestroySocket( PAFD_FCB FCB ) {
|
VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
UINT i;
|
UINT i;
|
||||||
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
|
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
|
||||||
BOOLEAN DontDeleteYet = FALSE;
|
|
||||||
|
|
||||||
AFD_DbgPrint(MIN_TRACE,("Called (%x)\n", FCB));
|
AFD_DbgPrint(MIN_TRACE,("Called (%x)\n", FCB));
|
||||||
|
|
||||||
|
@ -151,6 +150,7 @@ VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
InFlightRequest[1] = &FCB->ReceiveIrp;
|
InFlightRequest[1] = &FCB->ReceiveIrp;
|
||||||
InFlightRequest[2] = &FCB->SendIrp;
|
InFlightRequest[2] = &FCB->SendIrp;
|
||||||
|
|
||||||
|
/* Return early here because we might be called in the mean time. */
|
||||||
if( FCB->ListenIrp.InFlightRequest ||
|
if( FCB->ListenIrp.InFlightRequest ||
|
||||||
FCB->ReceiveIrp.InFlightRequest ||
|
FCB->ReceiveIrp.InFlightRequest ||
|
||||||
FCB->SendIrp.InFlightRequest ) {
|
FCB->SendIrp.InFlightRequest ) {
|
||||||
|
@ -158,7 +158,8 @@ VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
FCB->ListenIrp.InFlightRequest,
|
FCB->ListenIrp.InFlightRequest,
|
||||||
FCB->ReceiveIrp.InFlightRequest,
|
FCB->ReceiveIrp.InFlightRequest,
|
||||||
FCB->SendIrp.InFlightRequest));
|
FCB->SendIrp.InFlightRequest));
|
||||||
DontDeleteYet = TRUE;
|
SocketStateUnlock( FCB );
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCB->PollState |= AFD_EVENT_CLOSE;
|
FCB->PollState |= AFD_EVENT_CLOSE;
|
||||||
|
@ -180,7 +181,6 @@ VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
|
||||||
if( !DontDeleteYet ) {
|
|
||||||
if( FCB->Recv.Window )
|
if( FCB->Recv.Window )
|
||||||
ExFreePool( FCB->Recv.Window );
|
ExFreePool( FCB->Recv.Window );
|
||||||
if( FCB->Send.Window )
|
if( FCB->Send.Window )
|
||||||
|
@ -194,7 +194,6 @@ VOID DestroySocket( PAFD_FCB FCB ) {
|
||||||
|
|
||||||
ExFreePool(FCB);
|
ExFreePool(FCB);
|
||||||
AFD_DbgPrint(MIN_TRACE,("Deleted (%x)\n", FCB));
|
AFD_DbgPrint(MIN_TRACE,("Deleted (%x)\n", FCB));
|
||||||
}
|
|
||||||
|
|
||||||
AFD_DbgPrint(MIN_TRACE,("Leaving\n"));
|
AFD_DbgPrint(MIN_TRACE,("Leaving\n"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: select.c,v 1.3 2004/09/05 04:26:29 arty Exp $
|
/* $Id: select.c,v 1.4 2004/09/23 06:42:16 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/select.c
|
* FILE: drivers/net/afd/afd/select.c
|
||||||
|
@ -58,11 +58,13 @@ ScanForImmediateTrigger( PAFD_HANDLE HandleArray,
|
||||||
/* Check select bits */
|
/* Check select bits */
|
||||||
if( !SocketAcquireStateLock( FCB ) )
|
if( !SocketAcquireStateLock( FCB ) )
|
||||||
Status = STATUS_UNSUCCESSFUL;
|
Status = STATUS_UNSUCCESSFUL;
|
||||||
if( NT_SUCCESS(Status) )
|
if( NT_SUCCESS(Status) ) {
|
||||||
HandleArray[i].Status =
|
HandleArray[i].Status =
|
||||||
FCB->PollState & HandleArray[i].Events;
|
FCB->PollState & HandleArray[i].Events;
|
||||||
if( HandleArray[i].Status ) ShouldReturnNow = TRUE;
|
if( HandleArray[i].Status ) ShouldReturnNow = TRUE;
|
||||||
ObDereferenceObject( (PVOID)HandleArray[i].Handle );
|
ObDereferenceObject( (PVOID)HandleArray[i].Handle );
|
||||||
|
SocketStateUnlock( FCB );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1024,7 +1024,7 @@ NTSTATUS TdiSendDatagram(
|
||||||
* TransportObject = Pointer to transport object
|
* TransportObject = Pointer to transport object
|
||||||
* From = Send filter (NULL if none)
|
* From = Send filter (NULL if none)
|
||||||
* Address = Address of buffer to place remote address
|
* Address = Address of buffer to place remote address
|
||||||
* Buffer = Address of buffer to place sendd data
|
* Buffer = Address of buffer to place send data
|
||||||
* BufferSize = Address of buffer with length of Buffer (updated)
|
* BufferSize = Address of buffer with length of Buffer (updated)
|
||||||
* RETURNS:
|
* RETURNS:
|
||||||
* Status of operation
|
* Status of operation
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: write.c,v 1.5 2004/09/05 04:26:29 arty Exp $
|
/* $Id: write.c,v 1.6 2004/09/23 06:42:16 arty Exp $
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: drivers/net/afd/afd/write.c
|
* FILE: drivers/net/afd/afd/write.c
|
||||||
|
@ -286,6 +286,13 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL, FALSE );
|
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL, FALSE );
|
||||||
|
|
||||||
|
AFD_DbgPrint
|
||||||
|
(MID_TRACE,("RemoteAddress #%d Type %d\n",
|
||||||
|
((PTRANSPORT_ADDRESS)SendReq->RemoteAddress)->
|
||||||
|
TAAddressCount,
|
||||||
|
((PTRANSPORT_ADDRESS)SendReq->RemoteAddress)->
|
||||||
|
Address[0].AddressType));
|
||||||
|
|
||||||
/* Check the size of the Address given ... */
|
/* Check the size of the Address given ... */
|
||||||
|
|
||||||
Status = TdiSendDatagram
|
Status = TdiSendDatagram
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue