about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/rainbows/never_block.rb107
-rw-r--r--lib/rainbows/never_block/core.rb15
-rw-r--r--lib/rainbows/never_block/event_machine.rb11
3 files changed, 60 insertions, 73 deletions
diff --git a/lib/rainbows/never_block.rb b/lib/rainbows/never_block.rb
index 308398e..bcdaa3c 100644
--- a/lib/rainbows/never_block.rb
+++ b/lib/rainbows/never_block.rb
@@ -1,75 +1,42 @@
 # -*- encoding: binary -*-
 
-module Rainbows
-
-  # {NeverBlock}[www.espace.com.eg/neverblock/] library that combines
-  # the EventMachine library with Ruby Fibers.  This includes use of
-  # Thread-based Fibers under Ruby 1.8.  It currently does NOT support
-  # a streaming "rack.input" but is compatible with everything else
-  # EventMachine supports.
-  #
-  # In your Rainbows! config block, you may specify a Fiber pool size
-  # to limit your application concurrency (without using Rainbows::AppPool)
-  #
-  #   Rainbows! do
-  #     use :NeverBlock, :pool_size => 50
-  #     worker_connections 100
-  #   end
-  #
-  module NeverBlock
-
-    # :stopdoc:
-    DEFAULTS = {
-      :pool_size => 20, # same default size used by NB
-      :backend => :EventMachine, # NeverBlock doesn't support Rev yet
-    }
-
-    # same pool size NB core itself uses
-    def self.setup # :nodoc:
-      DEFAULTS.each { |k,v| O[k] ||= v }
-      Integer === O[:pool_size] && O[:pool_size] > 0 or
-        raise ArgumentError, "pool_size must a be an Integer > 0"
-      mod = Rainbows.const_get(O[:backend])
-      require "never_block" # require EM first since we need a higher version
-    end
-
-    def self.extended(klass)
-      klass.extend(Rainbows.const_get(O[:backend])) # EventMachine
-      klass.extend(Core)
-    end
-
-    module Core  # :nodoc: all
-      def self.setup
-        self.const_set(:POOL, ::NB::Pool::FiberPool.new(O[:pool_size]))
-        base = O[:backend].to_s.gsub!(/([a-z])([A-Z])/, '\1_\2').downcase!
-        require "rainbows/never_block/#{base}"
-        Rainbows::NeverBlock.const_get(:Client).class_eval do
-          self.superclass.const_set(:APP, G.server.app)
-          include Rainbows::NeverBlock::Core
-          alias _app_call app_call
-          undef_method :app_call
-          alias app_call nb_app_call
-        end
-      end
-
-      def nb_app_call
-        POOL.spawn do
-          begin
-            _app_call
-          rescue => e
-            handle_error(e)
-          end
-        end
-      end
-
-      def init_worker_process(worker)
-        super
-        Core.setup
-        logger.info "NeverBlock/#{O[:backend]} pool_size=#{O[:pool_size]}"
-      end
-    end
-
-    # :startdoc:
+# {NeverBlock}[www.espace.com.eg/neverblock/] library that combines
+# the EventMachine library with Ruby Fibers.  This includes use of
+# Thread-based Fibers under Ruby 1.8.  It currently does NOT support
+# a streaming "rack.input" but is compatible with everything else
+# EventMachine supports.
+#
+# In your Rainbows! config block, you may specify a Fiber pool size
+# to limit your application concurrency (without using Rainbows::AppPool)
+#
+#   Rainbows! do
+#     use :NeverBlock, :pool_size => 50
+#     worker_connections 100
+#   end
+#
+module Rainbows::NeverBlock
+
+  # :stopdoc:
+  DEFAULTS = {
+    :pool_size => 20, # same default size used by NB
+    :backend => :EventMachine, # NeverBlock doesn't support Rev yet
+  }
+
+  # same pool size NB core itself uses
+  def self.setup # :nodoc:
+    o = Rainbows::O
+    DEFAULTS.each { |k,v| o[k] ||= v }
+    Integer === o[:pool_size] && o[:pool_size] > 0 or
+      raise ArgumentError, "pool_size must a be an Integer > 0"
+    mod = Rainbows.const_get(o[:backend])
+    require "never_block" # require EM first since we need a higher version
+  end
 
+  def self.extended(klass)
+    klass.extend(Rainbows.const_get(Rainbows::O[:backend])) # EventMachine
+    klass.extend(Rainbows::NeverBlock::Core)
   end
+  # :startdoc:
 end
+# :enddoc:
+require 'rainbows/never_block/core'
diff --git a/lib/rainbows/never_block/core.rb b/lib/rainbows/never_block/core.rb
new file mode 100644
index 0000000..7188f75
--- /dev/null
+++ b/lib/rainbows/never_block/core.rb
@@ -0,0 +1,15 @@
+# -*- encoding: binary -*-
+# :enddoc:
+module Rainbows::NeverBlock::Core
+  def init_worker_process(worker)
+    super
+    o = Rainbows::O
+    pool = NB::Pool::FiberPool.new(o[:pool_size])
+    base = o[:backend].to_s.gsub!(/([a-z])([A-Z])/, '\1_\2').downcase!
+    require "rainbows/never_block/#{base}"
+    client_class = Rainbows::NeverBlock::Client
+    client_class.superclass.const_set(:APP, Rainbows::G.server.app)
+    client_class.const_set(:POOL, pool)
+    logger.info "NeverBlock/#{o[:backend]} pool_size=#{o[:pool_size]}"
+  end
+end
diff --git a/lib/rainbows/never_block/event_machine.rb b/lib/rainbows/never_block/event_machine.rb
index 0cfaa21..e201492 100644
--- a/lib/rainbows/never_block/event_machine.rb
+++ b/lib/rainbows/never_block/event_machine.rb
@@ -1,8 +1,13 @@
 # -*- encoding: binary -*-
 # :enddoc:
-module Rainbows
-  module NeverBlock
-    class Client < Rainbows::EventMachine::Client
+class Rainbows::NeverBlock::Client < Rainbows::EventMachine::Client
+  def app_call
+    POOL.spawn do
+      begin
+        super
+      rescue => e
+        handle_error(e)
+      end
     end
   end
 end