mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 09:25:44 +00:00
- Fix several bugs in select code and remove some dead code
- Fix a typo - Part 1 of x svn path=/trunk/; revision=42673
This commit is contained in:
parent
987115d431
commit
b12ea8a99d
7 changed files with 37 additions and 57 deletions
|
@ -63,6 +63,9 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
|
||||||
|
|
||||||
if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
|
if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
|
||||||
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,18 +105,13 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
|
||||||
return STATUS_FILE_CLOSED;
|
return STATUS_FILE_CLOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
|
if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
|
||||||
FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
|
FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
|
||||||
AFD_DbgPrint(MID_TRACE,("Going to connected state %d\n", FCB->State));
|
|
||||||
FCB->State = SOCKET_STATE_CONNECTED;
|
|
||||||
} else {
|
|
||||||
FCB->PollState |= AFD_EVENT_CONNECT_FAIL | AFD_EVENT_RECEIVE;
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
|
AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
|
||||||
FCB->State = SOCKET_STATE_BOUND;
|
FCB->State = SOCKET_STATE_BOUND;
|
||||||
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
}
|
}
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
|
||||||
|
|
||||||
/* Succeed pending irps on the FUNCTION_CONNECT list */
|
/* Succeed pending irps on the FUNCTION_CONNECT list */
|
||||||
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
|
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
|
||||||
NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
|
NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
|
||||||
|
|
|
@ -36,11 +36,6 @@ static NTSTATUS SatisfyAccept( PAFD_DEVICE_EXTENSION DeviceExt,
|
||||||
else
|
else
|
||||||
Status = MakeSocketIntoConnection( FCB );
|
Status = MakeSocketIntoConnection( FCB );
|
||||||
|
|
||||||
if( NT_SUCCESS(Status) ) {
|
|
||||||
FCB->PollState |= AFD_EVENT_SEND;
|
|
||||||
PollReeval( DeviceExt, NewFileObject );
|
|
||||||
}
|
|
||||||
|
|
||||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,9 +187,12 @@ static NTSTATUS NTAPI ListenComplete
|
||||||
/* Trigger a select return if appropriate */
|
/* Trigger a select return if appropriate */
|
||||||
if( !IsListEmpty( &FCB->PendingConnections ) ) {
|
if( !IsListEmpty( &FCB->PendingConnections ) ) {
|
||||||
FCB->PollState |= AFD_EVENT_ACCEPT;
|
FCB->PollState |= AFD_EVENT_ACCEPT;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
} else {
|
||||||
|
FCB->PollState &= ~AFD_EVENT_ACCEPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -296,7 +294,11 @@ NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
|
AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
|
||||||
|
|
||||||
FCB->PollState &= ~AFD_EVENT_ACCEPT;
|
if ( IsListEmpty( &FCB->PendingConnections ) )
|
||||||
|
FCB->PollState &= ~AFD_EVENT_ACCEPT;
|
||||||
|
else
|
||||||
|
FCB->PollState |= AFD_EVENT_ACCEPT;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
@ -322,8 +324,6 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||||
|
|
||||||
FCB->EventsFired &= ~AFD_EVENT_ACCEPT;
|
|
||||||
|
|
||||||
if( FCB->NeedsNewListen ) {
|
if( FCB->NeedsNewListen ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("ADDRESSFILE: %x\n", FCB->AddressFile.Handle));
|
AFD_DbgPrint(MID_TRACE,("ADDRESSFILE: %x\n", FCB->AddressFile.Handle));
|
||||||
|
|
||||||
|
@ -412,8 +412,11 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( IsListEmpty( &FCB->PendingConnections ) ) {
|
if( IsListEmpty( &FCB->PendingConnections ) ) {
|
||||||
FCB->PollState &= ~AFD_EVENT_ACCEPT;
|
FCB->PollState &= ~AFD_EVENT_ACCEPT;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
} else {
|
||||||
}
|
FCB->PollState |= AFD_EVENT_ACCEPT;
|
||||||
|
}
|
||||||
|
|
||||||
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
return Status;
|
return Status;
|
||||||
|
|
|
@ -300,6 +300,9 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if (ConnInfo) ExFreePool( ConnInfo );
|
if (ConnInfo) ExFreePool( ConnInfo );
|
||||||
|
|
||||||
|
FCB->PollState |= AFD_EVENT_DISCONNECT;
|
||||||
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -303,9 +303,6 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
FCB->EventsFired &= ~AFD_EVENT_RECEIVE;
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
|
||||||
|
|
||||||
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
|
@ -332,7 +329,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
Status = ReceiveActivity( FCB, Irp );
|
Status = ReceiveActivity( FCB, Irp );
|
||||||
|
|
||||||
if( Status == STATUS_PENDING && RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
if( Status == STATUS_PENDING && (RecvReq->AfdFlags & AFD_IMMEDIATE) ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
Status = STATUS_CANT_WAIT;
|
Status = STATUS_CANT_WAIT;
|
||||||
TotalBytesCopied = 0;
|
TotalBytesCopied = 0;
|
||||||
|
@ -595,8 +592,6 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||||
|
|
||||||
FCB->EventsFired &= ~AFD_EVENT_RECEIVE;
|
|
||||||
|
|
||||||
/* Check that the socket is bound */
|
/* Check that the socket is bound */
|
||||||
if( FCB->State != SOCKET_STATE_BOUND )
|
if( FCB->State != SOCKET_STATE_BOUND )
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
|
@ -660,10 +655,12 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
} else if( RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
} else if( RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
Status = STATUS_CANT_WAIT;
|
Status = STATUS_CANT_WAIT;
|
||||||
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
|
||||||
} else {
|
} else {
|
||||||
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
||||||
}
|
}
|
||||||
|
|
|
@ -205,23 +205,16 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
FileObject = (PFILE_OBJECT)AFD_HANDLES(PollReq)[i].Handle;
|
FileObject = (PFILE_OBJECT)AFD_HANDLES(PollReq)[i].Handle;
|
||||||
FCB = FileObject->FsContext;
|
FCB = FileObject->FsContext;
|
||||||
|
|
||||||
if( (FCB->PollState & AFD_EVENT_CLOSE) ||
|
AFD_DbgPrint(MID_TRACE, ("AFD: Select Events: "));
|
||||||
(PollReq->Handles[i].Status & AFD_EVENT_CLOSE) ) {
|
PrintEvents( PollReq->Handles[i].Events );
|
||||||
PollReq->Handles[i].Events = 0;
|
AFD_DbgPrint(MID_TRACE,("\n"));
|
||||||
PollReq->Handles[i].Status = AFD_EVENT_CLOSE;
|
|
||||||
Signalled++;
|
|
||||||
} else {
|
|
||||||
AFD_DbgPrint(MID_TRACE, ("AFD: Select Events: "));
|
|
||||||
PrintEvents( PollReq->Handles[i].Events );
|
|
||||||
AFD_DbgPrint(MID_TRACE,("\n"));
|
|
||||||
|
|
||||||
PollReq->Handles[i].Status =
|
PollReq->Handles[i].Status =
|
||||||
PollReq->Handles[i].Events & FCB->PollState;
|
PollReq->Handles[i].Events & FCB->PollState;
|
||||||
if( PollReq->Handles[i].Status ) {
|
if( PollReq->Handles[i].Status ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Signalling %x with %x\n",
|
AFD_DbgPrint(MID_TRACE,("Signalling %x with %x\n",
|
||||||
FCB, FCB->PollState));
|
FCB, FCB->PollState));
|
||||||
Signalled++;
|
Signalled++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,7 +279,6 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
EventSelectInfo->EventObject,
|
EventSelectInfo->EventObject,
|
||||||
EventSelectInfo->Events));
|
EventSelectInfo->Events));
|
||||||
|
|
||||||
FCB->EventSelectTriggers = FCB->EventsFired = 0;
|
|
||||||
if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
|
if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
|
||||||
FCB->EventSelect = NULL;
|
FCB->EventSelect = NULL;
|
||||||
|
|
||||||
|
@ -303,8 +295,8 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
FCB->EventSelect = NULL;
|
FCB->EventSelect = NULL;
|
||||||
else
|
else
|
||||||
FCB->EventSelectTriggers = EventSelectInfo->Events;
|
FCB->EventSelectTriggers = EventSelectInfo->Events;
|
||||||
} else /* Work done, cancelling select */
|
} else
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
|
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
|
||||||
|
|
||||||
|
@ -370,7 +362,6 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
|
||||||
PAFD_FCB FCB;
|
PAFD_FCB FCB;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
PAFD_POLL_INFO PollReq;
|
PAFD_POLL_INFO PollReq;
|
||||||
PKEVENT EventSelect = NULL;
|
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Called: DeviceExt %x FileObject %x\n",
|
AFD_DbgPrint(MID_TRACE,("Called: DeviceExt %x FileObject %x\n",
|
||||||
DeviceExt, FileObject));
|
DeviceExt, FileObject));
|
||||||
|
@ -385,16 +376,6 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Not sure if i can do this at DISPATCH_LEVEL ... try it at passive */
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Current State: %x, Events Fired: %x, "
|
|
||||||
"Select Triggers %x\n",
|
|
||||||
FCB->PollState, FCB->EventsFired,
|
|
||||||
FCB->EventSelectTriggers));
|
|
||||||
if( FCB->PollState & ~FCB->EventsFired & FCB->EventSelectTriggers ) {
|
|
||||||
FCB->EventsFired |= FCB->PollState;
|
|
||||||
EventSelect = FCB->EventSelect;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now signal normal select irps */
|
/* Now signal normal select irps */
|
||||||
ThePollEnt = DeviceExt->Polls.Flink;
|
ThePollEnt = DeviceExt->Polls.Flink;
|
||||||
|
|
||||||
|
@ -413,8 +394,10 @@ VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject ) {
|
||||||
|
|
||||||
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
|
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Setting event %x\n", EventSelect));
|
if( FCB->EventSelect && (FCB->PollState & FCB->EventSelectTriggers) ) {
|
||||||
if( EventSelect ) KeSetEvent( EventSelect, IO_NETWORK_INCREMENT, FALSE );
|
AFD_DbgPrint(MID_TRACE,("Setting event %x\n", FCB->EventSelect));
|
||||||
|
KeSetEvent( FCB->EventSelect, IO_NETWORK_INCREMENT, FALSE );
|
||||||
|
}
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
|
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,8 +223,6 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||||
|
|
||||||
FCB->EventsFired &= ~AFD_EVENT_SEND;
|
|
||||||
|
|
||||||
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
||||||
{
|
{
|
||||||
PAFD_SEND_INFO_UDP SendReq;
|
PAFD_SEND_INFO_UDP SendReq;
|
||||||
|
@ -393,7 +391,6 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||||
|
|
||||||
FCB->EventsFired &= ~AFD_EVENT_SEND;
|
|
||||||
FCB->PollState &= ~AFD_EVENT_SEND;
|
FCB->PollState &= ~AFD_EVENT_SEND;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
|
@ -196,7 +196,6 @@ typedef struct _AFD_FCB {
|
||||||
KEVENT StateLockedEvent;
|
KEVENT StateLockedEvent;
|
||||||
PKEVENT EventSelect;
|
PKEVENT EventSelect;
|
||||||
DWORD EventSelectTriggers;
|
DWORD EventSelectTriggers;
|
||||||
DWORD EventsFired;
|
|
||||||
UNICODE_STRING TdiDeviceName;
|
UNICODE_STRING TdiDeviceName;
|
||||||
PVOID Context;
|
PVOID Context;
|
||||||
DWORD PollState;
|
DWORD PollState;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue