[ros-diffs] [cgutman] 53096: [LWIP] - Optimize reading from the packet queue by trying to fill the caller's buffer with as many packets as we can fit before returning
cgutman at svn.reactos.org
cgutman at svn.reactos.org
Sat Aug 6 09:36:14 UTC 2011
Author: cgutman
Date: Sat Aug 6 09:36:13 2011
New Revision: 53096
URL: http://svn.reactos.org/svn/reactos?rev=53096&view=rev
Log:
[LWIP]
- Optimize reading from the packet queue by trying to fill the caller's buffer with as many packets as we can fit before returning
Modified:
branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c
Modified: branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c
URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c?rev=53096&r1=53095&r2=53096&view=diff
==============================================================================
--- branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c [iso-8859-1] (original)
+++ branches/GSoC_2011/TcpIpDriver/lib/drivers/lwip/src/rostcp.c [iso-8859-1] Sat Aug 6 09:36:13 2011
@@ -69,6 +69,8 @@
PLIST_ENTRY Entry;
PQUEUE_ENTRY qp = NULL;
+ if (IsListEmpty(&Connection->PacketQueue)) return NULL;
+
Entry = RemoveHeadList(&Connection->PacketQueue);
qp = CONTAINING_RECORD(Entry, QUEUE_ENTRY, ListEntry);
@@ -81,23 +83,34 @@
PQUEUE_ENTRY qp;
struct pbuf* p;
NTSTATUS Status = STATUS_PENDING;
+ UINT ReadLength, ExistingDataLength;
+
+ (*Received) = 0;
if (!IsListEmpty(&Connection->PacketQueue))
{
- qp = LibTCPDequeuePacket(Connection);
- p = qp->p;
-
- RecvLen = MIN(p->tot_len, RecvLen);
-
- for ((*Received) = 0; (*Received) < RecvLen; (*Received) += p->len, p = p->next)
+ while ((qp = LibTCPDequeuePacket(Connection)) != NULL)
{
- RtlCopyMemory(RecvBuffer + (*Received), p->payload, p->len);
+ p = qp->p;
+ ExistingDataLength = (*Received);
+
+ ReadLength = MIN(p->tot_len, RecvLen);
+
+ for (; (*Received) < ReadLength + ExistingDataLength; (*Received) += p->len, p = p->next)
+ {
+ RtlCopyMemory(RecvBuffer + (*Received), p->payload, p->len);
+ }
+
+ RecvLen -= ReadLength;
+
+ /* Use this special pbuf free callback function because we're outside tcpip thread */
+ pbuf_free_callback(qp->p);
+
+ ExFreeToNPagedLookasideList(&QueueEntryLookasideList, qp);
+
+ if (!RecvLen)
+ break;
}
-
- /* Use this special pbuf free callback function because we're outside tcpip thread */
- pbuf_free_callback(qp->p);
-
- ExFreeToNPagedLookasideList(&QueueEntryLookasideList, qp);
Status = STATUS_SUCCESS;
}
@@ -107,8 +120,6 @@
Status = STATUS_SUCCESS;
else
Status = STATUS_PENDING;
-
- (*Received) = 0;
}
return Status;
More information about the Ros-diffs
mailing list