From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: * X-Spam-ASN: AS14383 205.234.109.0/24 X-Spam-Status: No, score=1.0 required=3.0 tests=AWL,HK_RANDOM_FROM, MSGID_FROM_MTA_HEADER shortcircuit=no autolearn=no version=3.3.2 Path: news.gmane.org!not-for-mail From: Eric Wong Newsgroups: gmane.comp.lang.ruby.rainbows.general Subject: [RFC/PATCH] event_machine: lazily set async env keys Date: Thu, 15 Jul 2010 06:03:38 +0000 Message-ID: <20100715060338.GA2561@dcvr.yhbt.net> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Trace: dough.gmane.org 1279173996 23318 80.91.229.12 (15 Jul 2010 06:06:36 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Thu, 15 Jul 2010 06:06:36 +0000 (UTC) To: rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Original-X-From: rainbows-talk-bounces-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Thu Jul 15 08:06:34 2010 Return-path: Envelope-to: gclrrg-rainbows-talk@m.gmane.org X-Original-To: rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Delivered-To: rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-BeenThere: rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: rainbows-talk-bounces-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Errors-To: rainbows-talk-bounces-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org Xref: news.gmane.org gmane.comp.lang.ruby.rainbows.general:101 Archived-At: Received: from rubyforge.org ([205.234.109.19]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1OZHac-0003sh-3o for gclrrg-rainbows-talk@m.gmane.org; Thu, 15 Jul 2010 08:06:34 +0200 Received: from rubyforge.org (rubyforge.org [127.0.0.1]) by rubyforge.org (Postfix) with ESMTP id 42A3A1858373; Thu, 15 Jul 2010 02:06:33 -0400 (EDT) Received: from dcvr.yhbt.net (dcvr.yhbt.net [64.71.152.64]) by rubyforge.org (Postfix) with ESMTP id EA9701858373 for ; Thu, 15 Jul 2010 02:03:39 -0400 (EDT) Received: from localhost (unknown [127.0.2.5]) by dcvr.yhbt.net (Postfix) with ESMTP id 8842E1F505; Thu, 15 Jul 2010 06:03:38 +0000 (UTC) This has the small likelyhood of breaking apps that check via: env.include?("async.callback") Or any of member?/has_key?/key?, as they're all the same method. >>From all the async examples I see, I just see apps just use env["async.callback"]. Worth it? >>From 40ef059dfc99c7daad1b1829713727b86c8fc9a0 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 15 Jul 2010 05:48:29 +0000 Subject: [PATCH] event_machine: lazily set async env keys This is a micro-optimization when running a 'hello world' benchmark and also reduces the strength of a memory leak under 1.9.2-rc2: http://redmine.ruby-lang.org/issues/show/3466 --- lib/rainbows/ev_core.rb | 1 - lib/rainbows/event_machine.rb | 17 ++++++++++++----- lib/rainbows/rev/client.rb | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/rainbows/ev_core.rb b/lib/rainbows/ev_core.rb index 5ca693b..357042b 100644 --- a/lib/rainbows/ev_core.rb +++ b/lib/rainbows/ev_core.rb @@ -16,7 +16,6 @@ module Rainbows def post_init @remote_addr = Rainbows.addr(@_io) - @env = {} @hp = HttpParser.new @state = :headers # [ :body [ :trailers ] ] :app_call :close @buf = "" diff --git a/lib/rainbows/event_machine.rb b/lib/rainbows/event_machine.rb index 173340e..14da118 100644 --- a/lib/rainbows/event_machine.rb +++ b/lib/rainbows/event_machine.rb @@ -54,6 +54,17 @@ module Rainbows G = Rainbows::G def initialize(io) + @env = Hash.new do |hash,key| + case key + when ASYNC_CALLBACK + hash[ASYNC_CALLBACK] = method(:em_write_response) + when ASYNC_CLOSE + # we're not sure if anybody uses this, but Thin sets it, too + hash[ASYNC_CLOSE] = EM::DefaultDeferrable.new + else + nil + end + end @_io = io @body = nil end @@ -71,10 +82,6 @@ module Rainbows begin @env[RACK_INPUT] = @input @env[REMOTE_ADDR] = @remote_addr - @env[ASYNC_CALLBACK] = method(:em_write_response) - - # we're not sure if anybody uses this, but Thin sets it, too - @env[ASYNC_CLOSE] = EM::DefaultDeferrable.new response = catch(:async) { APP.call(@env.update(RACK_DEFAULTS)) } @@ -143,7 +150,7 @@ module Rainbows end def unbind - async_close = @env[ASYNC_CLOSE] and async_close.succeed + @env.include?(ASYNC_CLOSE) and @env[ASYNC_CLOSE].succeed @body.respond_to?(:fail) and @body.fail @_io.close end diff --git a/lib/rainbows/rev/client.rb b/lib/rainbows/rev/client.rb index d08992b..0df7415 100644 --- a/lib/rainbows/rev/client.rb +++ b/lib/rainbows/rev/client.rb @@ -15,6 +15,7 @@ module Rainbows CONN[self] = false super(io) post_init + @env = {} @deferred_bodies = [] # for (fast) regular files only end -- Eric Wong _______________________________________________ Rainbows! mailing list - rainbows-talk-GrnCvJ7WPxnNLxjTenLetw@public.gmane.org http://rubyforge.org/mailman/listinfo/rainbows-talk Do not quote signatures (like this one) or top post when replying