You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2012/11/11 16:49:11 UTC

svn commit: r1408032 - in /qpid/proton/trunk/proton-c/src: dispatcher/dispatcher.c dispatcher/dispatcher.h driver.c messenger.c

Author: rhs
Date: Sun Nov 11 15:49:10 2012
New Revision: 1408032

URL: http://svn.apache.org/viewvc?rev=1408032&view=rev
Log:
avoid copying input stream unless necessary for defragmentation purposes

Modified:
    qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c
    qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h
    qpid/proton/trunk/proton-c/src/driver.c
    qpid/proton/trunk/proton-c/src/messenger.c

Modified: qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c?rev=1408032&r1=1408031&r2=1408032&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c Sun Nov 11 15:49:10 2012
@@ -38,6 +38,7 @@ pn_dispatcher_t *pn_dispatcher(uint8_t f
   disp->trace = PN_TRACE_OFF;
 
   disp->input = pn_buffer(1024);
+  disp->fragment = 0;
 
   disp->channel = 0;
   disp->code = 0;
@@ -158,6 +159,12 @@ int pn_dispatch_frame(pn_dispatcher_t *d
 
 ssize_t pn_dispatcher_input(pn_dispatcher_t *disp, const char *bytes, size_t available)
 {
+  size_t offered = available;
+
+  if (offered == disp->fragment) {
+    return 0;
+  }
+
   size_t leftover = pn_buffer_size(disp->input);
   if (leftover) {
     int e = pn_buffer_append(disp->input, bytes, available);
@@ -168,6 +175,7 @@ ssize_t pn_dispatcher_input(pn_dispatche
   }
 
   size_t read = 0;
+  bool fragment = false;
 
   while (!disp->halt) {
     pn_frame_t frame;
@@ -179,19 +187,34 @@ ssize_t pn_dispatcher_input(pn_dispatche
       read += n;
     } else {
       if (leftover) {
-        pn_buffer_trim(disp->input, read, 0);
+        if (read > leftover) {
+          pn_buffer_clear(disp->input);
+          fragment = true;
+        } else {
+          read = available;
+        }
       } else {
-        int e = pn_buffer_append(disp->input, bytes + read, available - read);
-        if (e) return e;
+        if (!read) {
+          int e = pn_buffer_append(disp->input, bytes + read, available - read);
+          if (e) return e;
+          read = available;
+        } else {
+          fragment = true;
+        }
       }
-      read = available;
       break;
     }
 
     if (!disp->batch) break;
   }
 
-  return read - leftover;
+  size_t consumed = read - leftover;
+  if (consumed && fragment) {
+    disp->fragment = offered - consumed;
+  } else {
+    disp->fragment = 0;
+  }
+  return consumed;
 }
 
 int pn_scan_args(pn_dispatcher_t *disp, const char *fmt, ...)

Modified: qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h?rev=1408032&r1=1408031&r2=1408032&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h Sun Nov 11 15:49:10 2012
@@ -40,6 +40,7 @@ struct pn_dispatcher_t {
   uint8_t frame_type;
   pn_trace_t trace;
   pn_buffer_t *input;
+  size_t fragment;
   uint16_t channel;
   uint8_t code;
   pn_data_t *args;

Modified: qpid/proton/trunk/proton-c/src/driver.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/driver.c?rev=1408032&r1=1408031&r2=1408032&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/driver.c (original)
+++ qpid/proton/trunk/proton-c/src/driver.c Sun Nov 11 15:49:10 2012
@@ -71,7 +71,7 @@ struct pn_listener_t {
   void *context;
 };
 
-#define IO_BUF_SIZE (4*1024)
+#define IO_BUF_SIZE (64*1024)
 #define PN_NAME_MAX (256)
 
 struct pn_connector_t {

Modified: qpid/proton/trunk/proton-c/src/messenger.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger.c?rev=1408032&r1=1408031&r2=1408032&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger.c Sun Nov 11 15:49:10 2012
@@ -912,6 +912,8 @@ static pn_status_t disp2status(pn_dispos
   default:
     assert(0);
   }
+
+  return 0;
 }
 
 pn_status_t pn_messenger_status(pn_messenger_t *messenger, pn_tracker_t tracker)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org