From 810701d939114a5fcdacc55ec383de112c5e3fa4 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 17 Jan 2011 03:42:33 +0000 Subject: [PATCH] ev_core: reuse buffer to avoid GC thrashing Single-threaded concurrency models can reuse a single buffer to avoid thrashing memory and causing unnecessary GC activity. --- lib/rainbows/coolio/client.rb | 2 +- lib/rainbows/ev_core.rb | 1 + lib/rainbows/event_machine/response_chunk_pipe.rb | 2 +- lib/rainbows/event_machine/response_pipe.rb | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/rainbows/coolio/client.rb b/lib/rainbows/coolio/client.rb index f44d2aa..2947462 100644 --- a/lib/rainbows/coolio/client.rb +++ b/lib/rainbows/coolio/client.rb @@ -44,7 +44,7 @@ class Rainbows::Coolio::Client < Coolio::IO end def on_readable - buf = @_io.kgio_tryread(16384) + buf = @_io.kgio_tryread(16384, RBUF) case buf when :wait_readable when nil # eof diff --git a/lib/rainbows/ev_core.rb b/lib/rainbows/ev_core.rb index a3bf50f..b9b3381 100644 --- a/lib/rainbows/ev_core.rb +++ b/lib/rainbows/ev_core.rb @@ -7,6 +7,7 @@ module Rainbows::EvCore NULL_IO = Unicorn::HttpRequest::NULL_IO HttpParser = Rainbows::HttpParser autoload :CapInput, 'rainbows/ev_core/cap_input' + RBUF = "" # Apps may return this Rack response: AsyncResponse = [ -1, {}, [] ] ASYNC_CALLBACK = "async.callback".freeze diff --git a/lib/rainbows/event_machine/response_chunk_pipe.rb b/lib/rainbows/event_machine/response_chunk_pipe.rb index 5caf250..af9393a 100644 --- a/lib/rainbows/event_machine/response_chunk_pipe.rb +++ b/lib/rainbows/event_machine/response_chunk_pipe.rb @@ -10,7 +10,7 @@ module Rainbows::EventMachine::ResponseChunkPipe def notify_readable begin - data = @io.read_nonblock(16384, BUF) + data = @io.read_nonblock(16384, RBUF) @client.write("#{data.size.to_s(16)}\r\n") @client.write(data) @client.write("\r\n") diff --git a/lib/rainbows/event_machine/response_pipe.rb b/lib/rainbows/event_machine/response_pipe.rb index 3b584c7..0ea1eae 100644 --- a/lib/rainbows/event_machine/response_pipe.rb +++ b/lib/rainbows/event_machine/response_pipe.rb @@ -3,7 +3,7 @@ module Rainbows::EventMachine::ResponsePipe # garbage avoidance, EM always uses this in a single thread, # so a single buffer for all clients will work safely - BUF = '' + RBUF = Rainbows::EvCore::RBUF def initialize(client) @client = client @@ -11,7 +11,7 @@ module Rainbows::EventMachine::ResponsePipe def notify_readable begin - @client.write(@io.read_nonblock(16384, BUF)) + @client.write(@io.read_nonblock(16384, RBUF)) rescue Errno::EINTR rescue Errno::EAGAIN return -- 2.11.4.GIT