You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/10/24 00:03:23 UTC

svn commit: r1026695 - in /trafficserver/traffic/trunk: libinktomi++/ink_string.h proxy/hdrs/MIME.cc proxy/hdrs/URL.cc proxy/hdrs/URL.h proxy/http2/remap/RemapPlugins.cc

Author: zwoop
Date: Sat Oct 23 22:03:22 2010
New Revision: 1026695

URL: http://svn.apache.org/viewvc?rev=1026695&view=rev
Log:
TS-497 Move / create some "fast" itoa to ink_string.h

Modified:
    trafficserver/traffic/trunk/libinktomi++/ink_string.h
    trafficserver/traffic/trunk/proxy/hdrs/MIME.cc
    trafficserver/traffic/trunk/proxy/hdrs/URL.cc
    trafficserver/traffic/trunk/proxy/hdrs/URL.h
    trafficserver/traffic/trunk/proxy/http2/remap/RemapPlugins.cc

Modified: trafficserver/traffic/trunk/libinktomi++/ink_string.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/libinktomi%2B%2B/ink_string.h?rev=1026695&r1=1026694&r2=1026695&view=diff
==============================================================================
--- trafficserver/traffic/trunk/libinktomi++/ink_string.h (original)
+++ trafficserver/traffic/trunk/libinktomi++/ink_string.h Sat Oct 23 22:03:22 2010
@@ -694,4 +694,87 @@ ptr_len_pbrk(const char *p1, int l1, con
   return NULL;
 }
 
+// Specialized "itoa", that is optimized for small integers, and use snprintf() otherwise.
+// On error, we'll return 0, and nothing is written to the buffer.
+// TODO: Do these really need to be inline?
+inline int
+ink_small_itoa(int32 val, char* buf, int buf_len)
+{
+  ink_assert(buf_len > 5);
+  ink_assert((val >= 0) && (val < 100000));
+
+  if (val < 10) {               // 0 - 9
+    buf[0] = '0' + val;
+    return 1;
+  } else if (val < 100) {       // 10 - 99
+    buf[1] = '0' + (val % 10);
+    val /= 10;
+    buf[0] = '0' + (val % 10);
+    return 2;
+  } else if (val < 1000) {      // 100 - 999
+    buf[2] = '0' + (val % 10);
+    val /= 10;
+    buf[1] = '0' + (val % 10);
+    val /= 10;
+    buf[0] = '0' + (val % 10);
+    return 3;
+  } else if (val < 10000) {     // 1000 - 9999
+    buf[3] = '0' + (val % 10);
+    val /= 10;
+    buf[2] = '0' + (val % 10);
+    val /= 10;
+    buf[1] = '0' + (val % 10);
+    val /= 10;
+    buf[0] = '0' + (val % 10);
+    return 4;
+  } else {                      // 10000 - 99999
+    buf[4] = '0' + (val % 10);
+    val /= 10;
+    buf[3] = '0' + (val % 10);
+    val /= 10;
+    buf[2] = '0' + (val % 10);
+    val /= 10;
+    buf[1] = '0' + (val % 10);
+    val /= 10;
+    buf[0] = '0' + (val % 10);
+    return 5;
+  }
+}
+
+inline int
+ink_fast_itoa(int32 val, char* buf, int buf_len)
+{
+  if ((val < 0) || (val > 99999)) {
+    int ret = snprintf(buf, buf_len, "%d", val);
+
+    return (ret >= 0 ? ret : 0);
+  }
+
+  return ink_small_itoa(val, buf, buf_len);
+}
+
+inline int
+ink_fast_uitoa(uint32 val, char* buf, int buf_len)
+{
+  if (val > 99999) {
+    int ret = snprintf(buf, buf_len, "%u", val);
+
+    return (ret >= 0 ? ret : 0);
+  }
+
+  return ink_small_itoa(val, buf, buf_len);
+}
+
+inline int
+ink_fast_ltoa(int64 val, char* buf, int buf_len)
+{
+  if ((val < 0) || (val > 99999)) {
+    int ret = snprintf(buf, buf_len, "%lld", val);
+
+    return (ret >= 0 ? ret : 0);
+  }
+
+  return ink_small_itoa(val, buf, buf_len);
+}
+
 #endif

Modified: trafficserver/traffic/trunk/proxy/hdrs/MIME.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/MIME.cc?rev=1026695&r1=1026694&r2=1026695&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/MIME.cc (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/MIME.cc Sat Oct 23 22:03:22 2010
@@ -3192,64 +3192,10 @@ mime_field_length_get(MIMEField * field)
 
 /*-------------------------------------------------------------------------
   -------------------------------------------------------------------------*/
-
-// This is a little helper for the INT formatting, don't use directly!
-inline
-int format_small_int(char* buf, int32 val, size_t buf_len)
-{
-  ink_assert(val >= 0 && val < 100000);
-
-  if (val < 10) {              // 0 - 9
-    buf[0] = '0' + val;
-    return 1;
-  } else if (val < 100) {              // 10 - 99
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return 2;
-  } else if (val < 1000) {             // 100 - 999
-      buf[2] = '0' + (val % 10);
-      val = val / 10;
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return 3;
-  } else if (val < 10000) {    // 1000 - 9999
-      buf[3] = '0' + (val % 10);
-      val = val / 10;
-      buf[2] = '0' + (val % 10);
-      val = val / 10;
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return 4;
-  } else {                     // 10000 - 99999
-      buf[4] = '0' + (val % 10);
-      val = val / 10;
-      buf[3] = '0' + (val % 10);
-      val = val / 10;
-      buf[2] = '0' + (val % 10);
-      val = val / 10;
-      buf[1] = '0' + (val % 10);
-      val = val / 10;
-      buf[0] = '0' + (val % 10);
-      return 5;
-  }
-
-  return 0;
-}
-
-/*-------------------------------------------------------------------------
-  -------------------------------------------------------------------------*/
 int
 mime_format_int(char *buf, int32 val, size_t buf_len)
 {
-  if ((val<0) || (val>= 100000)) {
-    int ret = snprintf(buf, buf_len, "%d", val);
-    return (ret >= 0 ? ret : 0);
-  }
-
-  return format_small_int(buf, val, buf_len);
+  return ink_fast_itoa(val, buf, buf_len);
 }
 
 /*-------------------------------------------------------------------------
@@ -3258,12 +3204,7 @@ mime_format_int(char *buf, int32 val, si
 int
 mime_format_uint(char *buf, uint32 val, size_t buf_len)
 {
-  if (val >= 100000) {
-    int ret = snprintf(buf, buf_len, "%u", val);
-    return (ret >= 0 ? ret : 0);
-  }
-
-  return format_small_int(buf, val, buf_len);
+  return ink_fast_uitoa(val, buf, buf_len);
 }
 
 /*-------------------------------------------------------------------------
@@ -3272,12 +3213,7 @@ mime_format_uint(char *buf, uint32 val, 
 int
 mime_format_int64(char *buf, int64 val, size_t buf_len)
 {
-  if ((val<0) || (val>= 100000)) {
-    int ret = snprintf(buf, buf_len, "%lld", val);
-    return (ret >= 0 ? ret : 0);
-  }
-
-  return format_small_int(buf, val, buf_len);
+  return ink_fast_ltoa(val, buf, buf_len);
 }
 
 /*-------------------------------------------------------------------------

Modified: trafficserver/traffic/trunk/proxy/hdrs/URL.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/URL.cc?rev=1026695&r1=1026694&r2=1026695&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/URL.cc (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/URL.cc Sat Oct 23 22:03:22 2010
@@ -87,6 +87,7 @@ int URL_LEN_MMST;
 
 int url_hash_method = 0;
 
+
 /*-------------------------------------------------------------------------
   -------------------------------------------------------------------------*/
 
@@ -363,14 +364,6 @@ url_scheme_set(HdrHeap * heap, URLImpl *
 
   if (scheme_wks == URL_SCHEME_HTTP)
     url->m_url_type = URL_TYPE_HTTP;
-  else if (scheme_wks == URL_SCHEME_MMS)
-    url->m_url_type = URL_TYPE_MMS;
-  else if (scheme_wks == URL_SCHEME_MMSU)
-    url->m_url_type = URL_TYPE_MMSU;
-  else if (scheme_wks == URL_SCHEME_MMST)
-    url->m_url_type = URL_TYPE_MMST;
-  else if (scheme_wks == URL_SCHEME_RTSP)
-    url->m_url_type = URL_TYPE_RTSP;
   else if (scheme_wks == URL_SCHEME_HTTPS)
     url->m_url_type = URL_TYPE_HTTPS;
   else
@@ -439,10 +432,11 @@ url_port_set(HdrHeap * heap, URLImpl * u
 void
 url_port_set(HdrHeap * heap, URLImpl * url, unsigned int port)
 {
-  char value[32];
+  char value[6];
   int length;
+
   url_called_set(url);
-  length = snprintf(value, sizeof(value), "%u", port);
+  length = ink_fast_itoa(port, value, sizeof(value));
   mime_str_u16_set(heap, value, length, &(url->m_ptr_port), &(url->m_len_port), true);
   url->m_port = port;
 }

Modified: trafficserver/traffic/trunk/proxy/hdrs/URL.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/hdrs/URL.h?rev=1026695&r1=1026694&r2=1026695&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/hdrs/URL.h (original)
+++ trafficserver/traffic/trunk/proxy/hdrs/URL.h Sat Oct 23 22:03:22 2010
@@ -37,10 +37,6 @@ enum URLType
   URL_TYPE_NONE,
   URL_TYPE_HTTP,
   URL_TYPE_HTTPS,
-  URL_TYPE_MMS,
-  URL_TYPE_MMSU,
-  URL_TYPE_MMST,
-  URL_TYPE_RTSP
 };
 
 struct URLImpl:public HdrHeapObjImpl
@@ -217,10 +213,6 @@ url_canonicalize_port(int type, int port
       port = 80;
     else if (type == URL_TYPE_HTTPS)
       port = 443;
-    else if (type == URL_TYPE_MMS || type == URL_TYPE_MMSU || type == URL_TYPE_MMST)
-      port = 1755;
-    else if (type == URL_TYPE_RTSP)
-      port = 554;
   }
   return (port);
 }

Modified: trafficserver/traffic/trunk/proxy/http2/remap/RemapPlugins.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/http2/remap/RemapPlugins.cc?rev=1026695&r1=1026694&r2=1026695&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/http2/remap/RemapPlugins.cc (original)
+++ trafficserver/traffic/trunk/proxy/http2/remap/RemapPlugins.cc Sat Oct 23 22:03:22 2010
@@ -328,8 +328,12 @@ RemapPlugins::run_single_remap()
     _request_url->host_set(toHost, toHostLen);
   }
 
-  if (!plugin_modified_port)
-    _request_url->port_set(map_to->port_get_raw());
+  if (!plugin_modified_port) { // Only explicitly set the port if it's not the canonicalized port
+    int to_port = map_to->port_get_raw();
+
+    if (to_port != _request_url->port_get_raw())
+      _request_url->port_set(to_port);
+  }
 
   // Extra byte is potentially needed for prefix path '/'.
   // Added an extra 3 so that TS wouldn't crash in the field.
@@ -362,7 +366,6 @@ RemapPlugins::run_single_remap()
     // requestPathLen,fromPathLen,toPathLen are all 0; in this case, we never
     // initialize newPath, but still de-ref it in *newPath == '/' comparison.
     // The memset fixes that problem.
-
     if (toPath) {
       memcpy(newPath, toPath, toPathLen);
       newPathLen += toPathLen;