No functional changes.

Signed-off-by: Rami Ylimäki <[email protected]>
Reviewed-by: Erkki Seppälä <[email protected]>
---
 os/io.c |  126 +++++++++++++++++++++++++++++++++-----------------------------
 1 files changed, 67 insertions(+), 59 deletions(-)

diff --git a/os/io.c b/os/io.c
index 955bf8b..6bfddfc 100644
--- a/os/io.c
+++ b/os/io.c
@@ -190,11 +190,69 @@ YieldControlDeath(void)
     timesThisConnection = 0;
 }
 
+/**
+ * Check whether the previous request indicated that an input buffer
+ * can be reused. If the input buffer belongs to the same client, it
+ * can be trivially reused. If the input buffer belongs to some other
+ * client, it is stolen and marked as free so that clients without
+ * input buffers can reuse it. However, if the input buffer has grown
+ * too large in the latter case, it's just released.
+ *
+ * @param[in] oc connection that requires an input buffer
+ */
+static void FreeAvailableInput(OsCommPtr oc)
+{
+    if (AvailableInput)
+    {
+       if (AvailableInput != oc)
+       {
+           register ConnectionInputPtr aci = AvailableInput->input;
+           if (aci->size > BUFWATERMARK)
+           {
+               free(aci->buffer);
+               free(aci);
+           }
+           else
+           {
+               aci->next = FreeInputs;
+               FreeInputs = aci;
+           }
+           AvailableInput->input = NULL;
+       }
+       AvailableInput = NULL;
+    }
+}
+
+/**
+ * Find an input buffer for a request. If a client already has an
+ * input buffer, nothing needs to be done. Otherwise the buffer is
+ * taken from the list of reusable input buffers. If no input buffers
+ * can be reused, a new one is allocated.
+ *
+ * @param[in,out] oc connection that requires an input buffer
+ *
+ * @return the input buffer that was given for the connection
+ */
+static ConnectionInputPtr ReuseFreeInput(OsCommPtr oc)
+{
+    ConnectionInputPtr oci = oc->input;
+    if (!oci)
+    {
+       if ((oci = FreeInputs))
+           FreeInputs = oci->next;
+       else
+           oci = AllocateInputBuffer();
+    }
+    if (oci)
+       oc->input = oci;
+    return oci;
+}
+
 int
 ReadRequestFromClient(ClientPtr client)
 {
     OsCommPtr oc = (OsCommPtr)client->osPrivate;
-    ConnectionInputPtr oci = oc->input;
+    ConnectionInputPtr oci;
     int fd = oc->fd;
     unsigned int gotnow, needed;
     int result;
@@ -208,40 +266,14 @@ ReadRequestFromClient(ClientPtr client)
      * times).  This was done to save memory.
      */
 
-    if (AvailableInput)
-    {
-       if (AvailableInput != oc)
-       {
-           register ConnectionInputPtr aci = AvailableInput->input;
-           if (aci->size > BUFWATERMARK)
-           {
-               free(aci->buffer);
-               free(aci);
-           }
-           else
-           {
-               aci->next = FreeInputs;
-               FreeInputs = aci;
-           }
-           AvailableInput->input = (ConnectionInputPtr)NULL;
-       }
-       AvailableInput = (OsCommPtr)NULL;
-    }
+    FreeAvailableInput(oc);
 
     /* make sure we have an input buffer */
 
-    if (!oci)
+    if (!(oci = ReuseFreeInput(oc)))
     {
-       if ((oci = FreeInputs))
-       {
-           FreeInputs = oci->next;
-       }
-       else if (!(oci = AllocateInputBuffer()))
-       {
-           YieldControlDeath();
-           return -1;
-       }
-       oc->input = oci;
+        YieldControlDeath();
+        return -1;
     }
 
     /* advance to start of next request */
@@ -501,37 +533,13 @@ Bool
 InsertFakeRequest(ClientPtr client, char *data, int count)
 {
     OsCommPtr oc = (OsCommPtr)client->osPrivate;
-    ConnectionInputPtr oci = oc->input;
+    ConnectionInputPtr oci;
     int fd = oc->fd;
     int gotnow, moveup;
 
-    if (AvailableInput)
-    {
-       if (AvailableInput != oc)
-       {
-           ConnectionInputPtr aci = AvailableInput->input;
-           if (aci->size > BUFWATERMARK)
-           {
-               free(aci->buffer);
-               free(aci);
-           }
-           else
-           {
-               aci->next = FreeInputs;
-               FreeInputs = aci;
-           }
-           AvailableInput->input = (ConnectionInputPtr)NULL;
-       }
-       AvailableInput = (OsCommPtr)NULL;
-    }
-    if (!oci)
-    {
-       if ((oci = FreeInputs))
-           FreeInputs = oci->next;
-       else if (!(oci = AllocateInputBuffer()))
-           return FALSE;
-       oc->input = oci;
-    }
+    FreeAvailableInput(oc);
+    if (!(oci = ReuseFreeInput(oc)))
+        return FALSE;
     oci->bufptr += oci->lenLastReq;
     oci->lenLastReq = 0;
     gotnow = oci->bufcnt + oci->buffer - oci->bufptr;
-- 
1.7.1

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to