costin 00/11/29 20:58:58 Modified: src/facade22/org/apache/tomcat/facade HttpServletRequestFacade.java HttpServletResponseFacade.java src/share/org/apache/tomcat/context ErrorHandler.java src/share/org/apache/tomcat/core ContextManager.java Request.java src/share/org/apache/tomcat/helper RequestUtil.java SessionUtil.java src/share/org/apache/tomcat/modules/server Ajp12.java Ajp13.java Http10Interceptor.java JNIConnectionHandler.java src/share/org/apache/tomcat/request AccessInterceptor.java SimpleMapper1.java src/share/org/apache/tomcat/service/connector Ajp12ConnectionHandler.java Ajp13ConnectorRequest.java JNIConnectionHandler.java src/share/org/apache/tomcat/service/http HttpRequestAdapter.java src/share/org/apache/tomcat/util MessageBytes.java PrefixMapper.java Log: A small round of optimizations - removed few dozens of un-needed allocations and GC. Now we are down to 11 objects per simple request - still not zero, but close enough. I think that concludes the memory tunning for the "common path" ( i.e. the overhead common to all requests ). We can now start doing "real" performance in 3.3 !!! ( from my point of view, nothing so far was more than removing garbage ) ( of course, Cookies and Parameters have to be rewritten after the MimeHeaders model, plus a refactoring of MimeHeaders ) ( BTW, all 11 objects are allocated in interceptors, no change in core will be needed to remove them - one is the Socket and it's not easy to reuse that - so probably we'll have 1 object per request instead of 0. ) Details: - Continue the work on Request - now "serverName" ( the virtual host ) is a reusable MessageByte. There are only few Strings left, most of them not used in most cases. - small optimization in RequestUtil - no need to do the loop if the string is not encoded ( that saves few Strings/request + a loop ) - small optimization in SessionUtil - the string allocation is not needed - small optimization in AccessInterceptor - avoid string allocation ( it'll be further optimized after we're done with the core, I'm working on few better tools for string manipulation ) - small optimization in SimpleMapper1 - use/pass MessageBytes instead of converting to String. - same in PrefixMapper, use unsynchronized Hashtable ( SimpleHashtable - from crimson :-), pass strings - added getChars in MessageBytes Revision Changes Path 1.9 +1 -1 jakarta-tomcat/src/facade22/org/apache/tomcat/facade/HttpServletRequestFacade.java Index: HttpServletRequestFacade.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/HttpServletRequestFacade.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- HttpServletRequestFacade.java 2000/11/02 21:51:34 1.8 +++ HttpServletRequestFacade.java 2000/11/30 04:58:36 1.9 @@ -275,7 +275,7 @@ } public String getServerName() { - return request.getServerName(); + return request.serverName().toString(); } public int getServerPort() { 1.10 +1 -1 jakarta-tomcat/src/facade22/org/apache/tomcat/facade/HttpServletResponseFacade.java Index: HttpServletResponseFacade.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/HttpServletResponseFacade.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- HttpServletResponseFacade.java 2000/11/06 18:17:07 1.9 +++ HttpServletResponseFacade.java 2000/11/30 04:58:38 1.10 @@ -367,7 +367,7 @@ // Does this URL match down to (and including) the context path? if (!request.scheme().equalsIgnoreCase(url.getProtocol())) return (false); - if (!request.getServerName().equalsIgnoreCase(url.getHost())) + if (!request.serverName().equalsIgnoreCase(url.getHost())) return (false); // Set the URL port to HTTP default if not available before comparing int urlPort = url.getPort(); 1.6 +1 -1 jakarta-tomcat/src/share/org/apache/tomcat/context/ErrorHandler.java Index: ErrorHandler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/context/ErrorHandler.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ErrorHandler.java 2000/11/10 21:22:51 1.5 +++ ErrorHandler.java 2000/11/30 04:58:39 1.6 @@ -579,7 +579,7 @@ url.append (scheme); // http, https url.append ("://"); - url.append (req.getServerName()); + url.append (req.serverName().toString()); if ((scheme.equals ("http") && port != 80) || (scheme.equals ("https") && port != 443)) { url.append (':'); 1.150 +1 -1 jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java Index: ContextManager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v retrieving revision 1.149 retrieving revision 1.150 diff -u -r1.149 -r1.150 --- ContextManager.java 2000/11/20 21:00:54 1.149 +++ ContextManager.java 2000/11/30 04:58:40 1.150 @@ -740,7 +740,7 @@ lr.requestURI().setString( urlPath ); lr.queryString().setString(queryString ); - if( host != null) lr.setServerName( host ); + if( host != null) lr.serverName().setString( host ); return lr; } 1.74 +22 -16 jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java Index: Request.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Request.java,v retrieving revision 1.73 retrieving revision 1.74 diff -u -r1.73 -r1.74 --- Request.java 2000/11/20 21:00:54 1.73 +++ Request.java 2000/11/30 04:58:41 1.74 @@ -147,7 +147,7 @@ protected int contentLength = -1; protected String contentType = null; protected String charEncoding = null; - protected String serverName=null; + protected MessageBytes serverNameMB=new MessageBytes(); // auth infor protected String authType; @@ -273,19 +273,28 @@ protoMB.setString(protocol); } - - /** Return the server name. If none was set, - * extract it from the host header. - * + /** Return the buffer holding the server name, if + * any. Use isNull() to check if there is no value + * set. + * This is the "virtual host", derived from the + * Host: header. */ - public String getServerName() { - return serverName; + public MessageBytes serverName() { + return serverNameMB; } - /** Virtual host */ - public void setServerName(String serverName) { - this.serverName = serverName; - } +// /** Return the server name. If none was set, +// * extract it from the host header. +// * +// */ +// public String getServerName() { +// return serverName; +// } + +// /** Virtual host */ +// public void setServerName(String serverName) { +// this.serverName = serverName; +// } public int getServerPort() { @@ -567,10 +576,6 @@ reqI[i].newSessionRequest( this, response ); } - if ( serverSession == null ) { - return null; - } - return serverSession; } @@ -842,7 +847,8 @@ handler=null; jvmRoute = null; headers.clear(); // XXX use recycle pattern - serverName=null; + serverNameMB.recycle(); + //serverName=null; serverPort=-1; sessionIdSource = null; sessionId=null; 1.6 +7 -1 jakarta-tomcat/src/share/org/apache/tomcat/helper/RequestUtil.java Index: RequestUtil.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/helper/RequestUtil.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- RequestUtil.java 2000/10/08 21:28:57 1.5 +++ RequestUtil.java 2000/11/30 04:58:43 1.6 @@ -137,7 +137,13 @@ throws NumberFormatException, StringIndexOutOfBoundsException { if (str == null) return null; - + + // pay for what you use - unencoded requests will not get + // less overhead + // XXX this should be in the caller ? + if( str.indexOf( '+' ) <0 && str.indexOf( '%' ) < 0 ) + return str; + StringBuffer dec = new StringBuffer(); // decoded string output int strPos = 0; int strLen = str.length(); 1.4 +9 -5 jakarta-tomcat/src/share/org/apache/tomcat/helper/SessionUtil.java Index: SessionUtil.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/helper/SessionUtil.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- SessionUtil.java 2000/11/02 21:44:41 1.3 +++ SessionUtil.java 2000/11/30 04:58:43 1.4 @@ -68,7 +68,7 @@ * <code>Session</code> implementations. * * @author Craig R. McClanahan - * @version $Revision: 1.3 $ $Date: 2000/11/02 21:44:41 $ + * @version $Revision: 1.4 $ $Date: 2000/11/30 04:58:43 $ */ public final class SessionUtil { @@ -133,12 +133,16 @@ } // Encode all absolute URLs that return to this hostname - String serverName = req.getServerName(); - String match = "http://" + serverName; - if (url.startsWith("http://" + serverName)) + String serverName = req.serverName().toString(); + if (url.startsWith("http://") && + url.indexOf( serverName )== 7 ) { + // i.e. it starts with http://serverName + // XXX should be "ignoreCase" and should also check for other + // names. A lot of work to do to get this right return (encode(id, url)); - else + } else { return (url); + } } 1.7 +2 -2 jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp12.java Index: Ajp12.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp12.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- Ajp12.java 2000/11/02 21:44:47 1.6 +++ Ajp12.java 2000/11/30 04:58:45 1.7 @@ -135,7 +135,7 @@ dummy=readString(ajpin, null); //Server hostname - req.setServerName( readString(ajpin, null) ); + req.serverName().setString(readString(ajpin, null) ); //Apache document root dummy = readString(ajpin, null); @@ -161,7 +161,7 @@ dummy = readString(ajpin, null); //script name dummy = readString(ajpin, null); - req.setServerName( readString(ajpin, "")); + req.serverName().setString( readString(ajpin, "")); int serverPort=80; try { 1.5 +1 -1 jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp13.java Index: Ajp13.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Ajp13.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Ajp13.java 2000/11/15 11:37:25 1.4 +++ Ajp13.java 2000/11/30 04:58:45 1.5 @@ -193,7 +193,7 @@ req.setRemoteAddr( msg.getString()); req.setRemoteHost( msg.getString()); - req.setServerName( msg.getString()); + req.serverName().setString( msg.getString()); req.setServerPort( msg.getInt()); bsc = msg.getByte(); 1.7 +10 -8 jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Http10Interceptor.java Index: Http10Interceptor.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/Http10Interceptor.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- Http10Interceptor.java 2000/11/10 21:22:52 1.6 +++ Http10Interceptor.java 2000/11/30 04:58:45 1.7 @@ -250,10 +250,10 @@ return localHost; } - public String getServerName(){ - if(serverName!=null) return serverName; + public MessageBytes serverName(){ + if(! serverNameMB.isNull()) return serverNameMB; parseHostHeader(); - return serverName; + return serverNameMB; } public int getServerPort(){ @@ -263,12 +263,14 @@ } protected void parseHostHeader() { - String hostHeader = this.getHeader("host"); + MessageBytes hH=getMimeHeaders().getValue("host"); serverPort = socket.getLocalPort(); - if (hostHeader != null) { + if (hH != null) { + // XXX use MessageBytes + String hostHeader = hH.toString(); int i = hostHeader.indexOf(':'); if (i > -1) { - serverName = hostHeader.substring(0,i); + serverNameMB.setString( hostHeader.substring(0,i)); hostHeader = hostHeader.substring(i+1); try{ serverPort=Integer.parseInt(hostHeader); @@ -278,11 +280,11 @@ return; } if( localHost != null ) { - serverName = localHost; + serverNameMB.setString( localHost ); } // default to localhost - and warn // log("No server name, defaulting to localhost"); - serverName=getLocalHost(); + serverNameMB.setString( getLocalHost() ); } } 1.4 +4 -4 jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java Index: JNIConnectionHandler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- JNIConnectionHandler.java 2000/10/06 05:18:54 1.3 +++ JNIConnectionHandler.java 2000/11/30 04:58:45 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v 1.3 2000/10/06 05:18:54 costin Exp $ - * $Revision: 1.3 $ - * $Date: 2000/10/06 05:18:54 $ + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/server/JNIConnectionHandler.java,v 1.4 2000/11/30 04:58:45 costin Exp $ + * $Revision: 1.4 $ + * $Date: 2000/11/30 04:58:45 $ * * ==================================================================== * @@ -305,7 +305,7 @@ queryMB.setString( env[2] ); remoteAddr = env[3]; remoteHost = env[4]; - serverName = env[5]; + serverNameMB.setString( env[5] ); serverPort = Integer.parseInt(env[6]); authType = env[7]; remoteUser = env[8]; 1.23 +10 -1 jakarta-tomcat/src/share/org/apache/tomcat/request/AccessInterceptor.java Index: AccessInterceptor.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/AccessInterceptor.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- AccessInterceptor.java 2000/11/02 21:44:50 1.22 +++ AccessInterceptor.java 2000/11/30 04:58:48 1.23 @@ -299,7 +299,16 @@ switch( ct.getMapType() ) { case Container.PREFIX_MAP: - return path.startsWith( ctPath.substring(0, ctPathL - 2 )); + // original code: + // return path.startsWith( ctPath.substring(0, ctPathL - 2 )); + // changed to eliminate the allocation ( will be changed again + // when MessageBytes will be used in intercepotrs, now they are + // in core + for( int i=0; i< ctPathL - 2 ; i++ ) { + if( path.charAt( i ) != ctPath.charAt( i )) + return false; + } + return true; case Container.EXTENSION_MAP: return ctPath.substring( 1 ).equals( URLUtil.getExtension( path )); case Container.PATH_MAP: 1.25 +17 -22 jakarta-tomcat/src/share/org/apache/tomcat/request/SimpleMapper1.java Index: SimpleMapper1.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/SimpleMapper1.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- SimpleMapper1.java 2000/11/02 21:44:51 1.24 +++ SimpleMapper1.java 2000/11/30 04:58:48 1.25 @@ -245,38 +245,33 @@ /** First step of request porcessing is finding the Context. */ public int contextMap( Request req ) { - String path = req.requestURI().toString(); - if( path==null) + MessageBytes pathMB = req.requestURI(); + if( pathMB.isNull()) throw new RuntimeException("ASSERT: null path in request URI"); - if( path.indexOf("?") >=0 ) - throw new RuntimeException("ASSERT: ? in requestURI"); + // if( path.indexOf("?") >=0 ) + // throw new RuntimeException("ASSERT: ? in requestURI"); - if (path.indexOf('%') >= 0) { - // XXX rewrite URLDecode to avoid allocation - path = RequestUtil.URLDecode(path); + if (pathMB.indexOf('%') >= 0 || pathMB.indexOf( '+' ) >= 0) { + // XXX rewrite URLDecode to avoid allocation + pathMB.setString( RequestUtil.URLDecode(pathMB.toString()) ); } try { - String host=null; + // String host=null; + MessageBytes hostMB=req.serverName(); -// MimeHeaders headers=req.getMimeHeaders(); -// MimeHeaderField hostH=headers.find("host"); + // host=req.serverName().toString(); - host=req.getServerName(); + if(debug>0) cm.log("Host = " + hostMB.toString()); -// if( hostH==null ) host=req.getLocalHost(); -// if(hostH==null) host="localhost"; + Container container =(Container)map. + getLongestPrefixMatch( hostMB, pathMB); - if(debug>0) cm.log("Host = " + host); - - Container container =(Container)map.getLongestPrefixMatch( host, - path ); - if( container == null ) throw new RuntimeException( "Assertion failed: " + "container==null"); if(debug>0) - cm.log("SM: Prefix match " + path + " -> " + + cm.log("SM: Prefix match " + pathMB.toString() + " -> " + container.getPath() + " " + container.getHandler() + " " + container.getRoles()); @@ -284,7 +279,7 @@ // If cached - we don't need to do it again ( since it is the // final Container, // either prefix or extension ) - fixRequestPaths( path, req, container ); + fixRequestPaths( pathMB.toString() /*XXX*/, req, container ); // if it's default container - try extension match @@ -295,7 +290,7 @@ if( extC != null ) { // change the handler if( extC.getHandler() != null ) { - fixRequestPaths( path, req, extC ); + fixRequestPaths( pathMB.toString(), req, extC ); container=extC; } if( debug > 0 ) @@ -310,7 +305,7 @@ Container ctxDef=req.getContext().getContainer(); Container defC=(Container)ctxDef.getNote( defaultMapNOTE ); if( defC != null && defC.getHandler() !=null ) { - fixRequestPaths( path, req, defC ); + fixRequestPaths( pathMB.toString(), req, defC ); if( debug > 0 ) log("SM: Found default mapping " + 1.43 +7 -4 jakarta-tomcat/src/share/org/apache/tomcat/service/connector/Ajp12ConnectionHandler.java Index: Ajp12ConnectionHandler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/Ajp12ConnectionHandler.java,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- Ajp12ConnectionHandler.java 2000/11/02 21:44:56 1.42 +++ Ajp12ConnectionHandler.java 2000/11/30 04:58:50 1.43 @@ -250,9 +250,11 @@ dummy = readString(ajpin, null); //Servlet - serverName = readString(ajpin, null); //Server hostname - if( doLog ) d("AJP: serverName=" + serverName ); + serverNameMB.setString(readString(ajpin, null)); + //Server hostname + if( doLog ) d("AJP: serverName=" +serverNameMB.toString()); + dummy = readString(ajpin, null); //Apache document root pathInfoMB.setString( readString(ajpin, null)); //Apache parsed path-info @@ -295,8 +297,9 @@ dummy = readString(ajpin, null); //script name // System.out.println("AJP: Script name=" + dummy); - serverName = readString(ajpin, ""); //server name - if( doLog ) d("AJP: serverName=" + serverName ); + serverNameMB.setString( readString(ajpin, "")); + //server name + if( doLog ) d("AJP: serverName=" +serverNameMB.toString()); try { serverPort = Integer.parseInt(readString(ajpin, "80")); //server port } catch (Exception any) { 1.17 +5 -5 jakarta-tomcat/src/share/org/apache/tomcat/service/connector/Ajp13ConnectorRequest.java Index: Ajp13ConnectorRequest.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/Ajp13ConnectorRequest.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- Ajp13ConnectorRequest.java 2000/11/15 11:40:03 1.16 +++ Ajp13ConnectorRequest.java 2000/11/30 04:58:51 1.17 @@ -1,7 +1,7 @@ -/* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/Ajp13ConnectorRequest.java,v 1.16 2000/11/15 11:40:03 hgomez Exp $ - * $Revision: 1.16 $ - * $Date: 2000/11/15 11:40:03 $ + /* + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/Ajp13ConnectorRequest.java,v 1.17 2000/11/30 04:58:51 costin Exp $ + * $Revision: 1.17 $ + * $Date: 2000/11/30 04:58:51 $ * * ==================================================================== * @@ -142,7 +142,7 @@ uriMB.setString( msg.getString()); remoteAddr = msg.getString(); remoteHost = msg.getString(); - serverName = msg.getString(); + serverNameMB.setString( msg.getString()); serverPort = msg.getInt(); bsc = msg.getByte(); if(bsc != 0) { 1.20 +4 -4 jakarta-tomcat/src/share/org/apache/tomcat/service/connector/JNIConnectionHandler.java Index: JNIConnectionHandler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/JNIConnectionHandler.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- JNIConnectionHandler.java 2000/10/06 05:19:13 1.19 +++ JNIConnectionHandler.java 2000/11/30 04:58:52 1.20 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/JNIConnectionHandler.java,v 1.19 2000/10/06 05:19:13 costin Exp $ - * $Revision: 1.19 $ - * $Date: 2000/10/06 05:19:13 $ + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/connector/JNIConnectionHandler.java,v 1.20 2000/11/30 04:58:52 costin Exp $ + * $Revision: 1.20 $ + * $Date: 2000/11/30 04:58:52 $ * * ==================================================================== * @@ -260,7 +260,7 @@ queryMB.setString( env[2] ); remoteAddr = env[3]; remoteHost = env[4]; - serverName = env[5]; + serverNameMB.setString( env[5] ); serverPort = Integer.parseInt(env[6]); authType = env[7]; remoteUser = env[8]; 1.34 +14 -15 jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpRequestAdapter.java Index: HttpRequestAdapter.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpRequestAdapter.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- HttpRequestAdapter.java 2000/10/06 05:19:15 1.33 +++ HttpRequestAdapter.java 2000/11/30 04:58:55 1.34 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpRequestAdapter.java,v 1.33 2000/10/06 05:19:15 costin Exp $ - * $Revision: 1.33 $ - * $Date: 2000/10/06 05:19:15 $ + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/service/http/HttpRequestAdapter.java,v 1.34 2000/11/30 04:58:55 costin Exp $ + * $Revision: 1.34 $ + * $Date: 2000/11/30 04:58:55 $ * * ==================================================================== * @@ -276,27 +276,26 @@ return socket.getLocalPort(); } - public String getServerName() { - if(serverName!=null) return serverName; + public MessageBytes serverName() { + if(! serverNameMB.isNull()) return serverNameMB; // XXX Move to interceptor!!! + // XXX optimize String hostHeader = this.getHeader("host"); if (hostHeader != null) { int i = hostHeader.indexOf(':'); if (i > -1) { hostHeader = hostHeader.substring(0,i); } - serverName=hostHeader; - return serverName; + serverNameMB.setString(hostHeader); + } else { + // XXX + // we need a better solution here + loghelper.log( "Got serverName via localAddress "); + InetAddress localAddress = socket.getLocalAddress(); + serverNameMB.setString( localAddress.getHostName() ); } - - if (hostHeader == null) { - // XXX - // we need a better solution here - InetAddress localAddress = socket.getLocalAddress(); - serverName = localAddress.getHostName(); - } - return serverName; + return serverNameMB; } 1.13 +21 -2 jakarta-tomcat/src/share/org/apache/tomcat/util/MessageBytes.java Index: MessageBytes.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/MessageBytes.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- MessageBytes.java 2000/11/01 21:43:28 1.12 +++ MessageBytes.java 2000/11/30 04:58:57 1.13 @@ -314,14 +314,30 @@ return bytes; } + public char[] getChars() + { + if( hasCharValue ) { + return chars; + } + toString(); + hasCharValue=true; + chars=strValue.toCharArray(); + charsLen=chars.length; + charsOff=0; + return chars; + } + /** * Returns the start offset of the bytes. */ public int getOffset() { if(type==T_BYTES) return bytesOff; - if(type==T_CHARS) + if(type==T_CHARS) { + if( ! hasCharValue ) + getChars(); return charsOff; + } return 0; } @@ -331,8 +347,11 @@ public int getLength() { if(type==T_BYTES) return bytesLen; - if(type==T_CHARS) + if(type==T_CHARS) { + if( ! hasCharValue ) + getChars(); return charsLen; + } if(type==T_STR) return strValue.length(); toString(); 1.4 +17 -12 jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java Index: PrefixMapper.java =================================================================== RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- PrefixMapper.java 2000/06/19 21:53:16 1.3 +++ PrefixMapper.java 2000/11/30 04:58:57 1.4 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java,v 1.3 2000/06/19 21:53:16 costin Exp $ - * $Revision: 1.3 $ - * $Date: 2000/06/19 21:53:16 $ + * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java,v 1.4 2000/11/30 04:58:57 costin Exp $ + * $Revision: 1.4 $ + * $Date: 2000/11/30 04:58:57 $ * * ==================================================================== * @@ -80,16 +80,16 @@ */ public class PrefixMapper { // host -> PrefixMapper for virtual hosts - Hashtable vhostMaps=new Hashtable(); + SimpleHashtable vhostMaps=new SimpleHashtable(); - Hashtable prefixMappedServlets; - Hashtable exactMappedServlets; + SimpleHashtable prefixMappedServlets; + SimpleHashtable exactMappedServlets; // Cache the most recent mappings // Disabled by default ( since we haven't implemented // capacity and remove ). - Hashtable mapCache; + SimpleHashtable mapCache; // By using TreeMap instead of SimpleMap you go from 143 to 161 RPS // ( at least on my machine ) // Interesting - even if SimpleHashtable is faster than Hashtable @@ -105,9 +105,9 @@ public PrefixMapper() { - prefixMappedServlets=new Hashtable(); - exactMappedServlets=new Hashtable(); - mapCache=new Hashtable(); + prefixMappedServlets=new SimpleHashtable(); + exactMappedServlets=new SimpleHashtable(); + mapCache=new SimpleHashtable(); } public void setMapCache( boolean v ) { @@ -141,7 +141,7 @@ vmap.exactMappedServlets.remove( s ); } // reset the cache - mapCache=new Hashtable(); + mapCache=new SimpleHashtable(); } @@ -193,7 +193,12 @@ /** Match a prefix rule - /foo/bar/index.html/abc */ - public Object getLongestPrefixMatch( String host, String path ) { + public Object getLongestPrefixMatch( MessageBytes hostMB, + MessageBytes pathMB ) + { + // XXX fixme + String host=hostMB.toString(); + String path=pathMB.toString(); Object container = null; String s = path;