From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Eric Wong Newsgroups: gmane.comp.lang.ruby.mongrel.devel Subject: Re: [PATCH] http11: ~6% performance increase in header parsing Date: Sat, 8 Mar 2008 14:02:20 -0800 Message-ID: <20080308220220.GA27749@mayonaise> References: <20080229015309.GA9080@untitled> <20080303044659.5a550c19.zedshaw@zedshaw.com> <20080302123712.GA13979@hand.yhbt.net> <20080306075421.GA1583@hand.yhbt.net> <3ae7f4480803060153v18e955a5j9038f93e558f81d1@mail.gmail.com> <20080308081210.GA30702@hand.yhbt.net> Reply-To: mongrel-development-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1205014334 6061 80.91.229.12 (8 Mar 2008 22:12:14 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 8 Mar 2008 22:12:14 +0000 (UTC) To: mongrel-development-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Original-X-From: mongrel-development-bounces-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Sat Mar 08 23:12:41 2008 Return-path: Envelope-to: gclrmd-mongrel-development@m.gmane.org Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.13 (2006-08-11) X-BeenThere: mongrel-development-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org X-Mailman-Version: 2.1.9 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: mongrel-development-bounces-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Errors-To: mongrel-development-bounces-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Xref: news.gmane.org gmane.comp.lang.ruby.mongrel.devel:5 Archived-At: Received: from rubyforge.org ([205.234.109.19]) by lo.gmane.org with esmtp (Exim 4.50) id 1JY7HR-0001Sh-AD for gclrmd-mongrel-development@m.gmane.org; Sat, 08 Mar 2008 23:12:37 +0100 Received: from rubyforge.org (rubyforge.org [127.0.0.1]) by rubyforge.org (Postfix) with ESMTP id 22FDE18586B6; Sat, 8 Mar 2008 17:12:02 -0500 (EST) Received: from hand.yhbt.net (hand.yhbt.net [66.150.188.102]) by rubyforge.org (Postfix) with ESMTP id 60ACC1858677 for ; Sat, 8 Mar 2008 17:02:22 -0500 (EST) Received: from hand.yhbt.net (localhost [127.0.0.1]) by hand.yhbt.net (Postfix) with SMTP id 5E3537F41C9; Sat, 8 Mar 2008 14:02:20 -0800 (PST) Received: by hand.yhbt.net (sSMTP sendmail emulation); Sat, 08 Mar 2008 14:02:20 -0800 List-Post: Evan Weaver wrote: > Upgrading ragel is fine with me. Here's my work-in-progress. The changes below are pretty much copied from ry's changes in ebb. I haven't been able to figure out why test_horrible_queries(HttpParserTest) is failing, so any help here would be appreciated. Thanks. diff --git a/Rakefile b/Rakefile index f47d7a2..07a89c2 100644 --- a/Rakefile +++ b/Rakefile @@ -55,13 +55,15 @@ task :ragel do Dir.chdir "ext/http11" do target = "http11_parser.c" File.unlink target if File.exist? target - sh "ragel http11_parser.rl | rlgen-cd -G2 -o #{target}" + # sh "ragel http11_parser.rl | rlgen-cd -G2 -o #{target}" # ragel 5.x + sh "ragel -G2 http11_parser.rl" # ragel 6.0 raise "Failed to build C source" unless File.exist? target end Dir.chdir "ext/http11" do target = "../../ext/http11_java/org/jruby/mongrel/Http11Parser.java" File.unlink target if File.exist? target - sh "ragel -J http11_parser.java.rl | rlgen-java -o #{target}" + # sh "ragel -J http11_parser.java.rl | rlgen-java -o #{target}" # ragel 5.x + sh "ragel -J -o #{target} http11_parser.java.rl" # ragel 6.0 raise "Failed to build Java source" unless File.exist? target end end diff --git a/ext/http11/http11_parser.rl b/ext/http11/http11_parser.rl index a418605..0c4e2d4 100644 --- a/ext/http11/http11_parser.rl +++ b/ext/http11/http11_parser.rl @@ -114,7 +114,7 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, p = buffer+off; pe = buffer+len; - assert(*pe == '\0' && "pointer does not end on NUL"); + /* assert(*pe == '\0' && "pointer does not end on NUL"); */ assert(pe - p == len - off && "pointers aren't same distance"); @@ -130,23 +130,11 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, assert(parser->field_len <= len && "field has length longer than whole buffer"); assert(parser->field_start < len && "field starts after buffer end"); - if(parser->body_start) { - /* final \r\n combo encountered so stop right here */ - %%write eof; - parser->nread++; - } - return(parser->nread); } int http_parser_finish(http_parser *parser) { - int cs = parser->cs; - - %%write eof; - - parser->cs = cs; - if (http_parser_has_error(parser) ) { return -1; } else if (http_parser_is_finished(parser) ) { @@ -161,5 +149,5 @@ int http_parser_has_error(http_parser *parser) { } int http_parser_is_finished(http_parser *parser) { - return parser->cs == http_parser_first_final; + return parser->cs >= http_parser_first_final; } -- Eric Wong