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:
Art Yerkes 2004-09-23 06:42:16 +00:00
parent 36cc9bb181
commit 51580f3182
5 changed files with 39 additions and 37 deletions

View file

@ -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 ) { FCB->Locked = FALSE;
ExAcquireFastMutex( &FCB->Mutex );
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 );

View file

@ -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,21 +181,19 @@ 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 ) ExFreePool( FCB->Send.Window );
ExFreePool( FCB->Send.Window ); if( FCB->AddressFrom )
if( FCB->AddressFrom ) ExFreePool( FCB->AddressFrom );
ExFreePool( FCB->AddressFrom ); if( FCB->LocalAddress )
if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
ExFreePool( FCB->LocalAddress );
ExFreePool(FCB->TdiDeviceName.Buffer); ExFreePool(FCB->TdiDeviceName.Buffer);
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"));
} }

View file

@ -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 );
}
} }
} }

View file

@ -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

View file

@ -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