- Nicer solution for the problem fixed in r36102

svn path=/branches/aicom-network-fixes/; revision=36141
This commit is contained in:
Cameron Gutman 2008-09-11 18:17:11 +00:00
parent 4b72cb5e0f
commit 8e9ec3d648

View file

@ -57,7 +57,9 @@ static VOID SignalSocket(
PAFD_ACTIVE_POLL Poll OPTIONAL, PAFD_ACTIVE_POLL Poll OPTIONAL,
PIRP _Irp OPTIONAL, PIRP _Irp OPTIONAL,
PAFD_POLL_INFO PollReq, PAFD_POLL_INFO PollReq,
NTSTATUS Status NTSTATUS Status,
KSPIN_LOCK Lock,
KIRQL OldIrql
) )
{ {
UINT i; UINT i;
@ -86,6 +88,10 @@ static VOID SignalSocket(
} }
UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount ); UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) ); if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
AFD_DbgPrint(MID_TRACE,("Completing\n"));
KeReleaseSpinLock(&Lock, OldIrql);
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
KeAcquireSpinLock(&Lock, &OldIrql);
AFD_DbgPrint(MID_TRACE,("Done\n")); AFD_DbgPrint(MID_TRACE,("Done\n"));
} }
@ -108,11 +114,9 @@ static VOID SelectTimeout( PKDPC Dpc,
ZeroEvents( PollReq->Handles, PollReq->HandleCount ); ZeroEvents( PollReq->Handles, PollReq->HandleCount );
KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql ); KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT ); SignalSocket( Poll, NULL, PollReq, STATUS_TIMEOUT, DeviceExt->Lock, OldIrql );
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
AFD_DbgPrint(MID_TRACE,("Timeout\n")); AFD_DbgPrint(MID_TRACE,("Timeout\n"));
} }
@ -145,10 +149,7 @@ VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
if( (PVOID)HandleArray[i].Handle == FileObject && if( (PVOID)HandleArray[i].Handle == FileObject &&
(!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) { (!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) {
ZeroEvents( PollReq->Handles, PollReq->HandleCount ); ZeroEvents( PollReq->Handles, PollReq->HandleCount );
SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS ); SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS, DeviceExt->Lock, OldIrql );
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
} }
} }
} }
@ -232,10 +233,7 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
if( Signalled ) { if( Signalled ) {
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
SignalSocket( NULL, Irp, PollReq, Status ); SignalSocket( NULL, Irp, PollReq, Status, DeviceExt->Lock, OldIrql );
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
return Status;
} else { } else {
PAFD_ACTIVE_POLL Poll = NULL; PAFD_ACTIVE_POLL Poll = NULL;
@ -426,10 +424,7 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
if( UpdatePollWithFCB( Poll, FileObject ) ) { if( UpdatePollWithFCB( Poll, FileObject ) ) {
ThePollEnt = ThePollEnt->Flink; ThePollEnt = ThePollEnt->Flink;
AFD_DbgPrint(MID_TRACE,("Signalling socket\n")); AFD_DbgPrint(MID_TRACE,("Signalling socket\n"));
SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS ); SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS, DeviceExt->Lock, OldIrql );
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
} else } else
ThePollEnt = ThePollEnt->Flink; ThePollEnt = ThePollEnt->Flink;
} }