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;