mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
[AFD]
- Wait to signal a graceful receive shutdown until all buffered transport data is read by the application svn path=/trunk/; revision=52774
This commit is contained in:
parent
5965cf4895
commit
2e54713de3
2 changed files with 27 additions and 9 deletions
|
@ -28,27 +28,32 @@
|
|||
|
||||
static VOID HandleEOFOnIrp( PAFD_FCB FCB, NTSTATUS Status, ULONG_PTR Information )
|
||||
{
|
||||
if( ( Status == STATUS_SUCCESS && !Information ) ||
|
||||
( !NT_SUCCESS( Status ) ) )
|
||||
if (Status != STATUS_SUCCESS)
|
||||
{
|
||||
/* The socket has been closed by the remote side */
|
||||
FCB->TdiReceiveClosed = TRUE;
|
||||
|
||||
/* Signal unexpected termination immediately */
|
||||
FCB->PollState |= AFD_EVENT_ABORT;
|
||||
FCB->PollStatus[FD_CLOSE_BIT] = Status;
|
||||
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
}
|
||||
else if (Status == STATUS_SUCCESS && !Information)
|
||||
{
|
||||
/* Wait to signal graceful close until all data is read */
|
||||
FCB->TdiReceiveClosed = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static BOOLEAN CantReadMore( PAFD_FCB FCB ) {
|
||||
UINT BytesAvailable = FCB->Recv.Content - FCB->Recv.BytesUsed;
|
||||
|
||||
return !BytesAvailable &&
|
||||
(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT));
|
||||
return !BytesAvailable && FCB->TdiReceiveClosed;
|
||||
}
|
||||
|
||||
static VOID RefillSocketBuffer( PAFD_FCB FCB ) {
|
||||
if( !FCB->ReceiveIrp.InFlightRequest &&
|
||||
!(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT)) ) {
|
||||
!FCB->TdiReceiveClosed ) {
|
||||
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
||||
|
||||
TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
||||
|
@ -225,9 +230,22 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
|
|||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||
FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
} else
|
||||
}
|
||||
else if (CantReadMore(FCB) && !(FCB->PollState & (AFD_EVENT_ABORT | AFD_EVENT_CLOSE)))
|
||||
{
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
|
||||
/* Signal delayed close event */
|
||||
FCB->PollState |= AFD_EVENT_ABORT;
|
||||
FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS;
|
||||
|
||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||
}
|
||||
else
|
||||
{
|
||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||
}
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("RetStatus for irp %x is %x\n", Irp, RetStatus));
|
||||
|
||||
/* Sometimes we're called with a NULL Irp */
|
||||
|
|
|
@ -173,7 +173,7 @@ typedef struct _AFD_STORED_DATAGRAM {
|
|||
} AFD_STORED_DATAGRAM, *PAFD_STORED_DATAGRAM;
|
||||
|
||||
typedef struct _AFD_FCB {
|
||||
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline;
|
||||
BOOLEAN Locked, Critical, Overread, NonBlocking, OobInline, TdiReceiveClosed;
|
||||
UINT State, Flags, GroupID, GroupType;
|
||||
KIRQL OldIrql;
|
||||
UINT LockCount;
|
||||
|
|
Loading…
Reference in a new issue