Sha256: 48f9b4d00fa972031971c80ca12fbbb7d3167fd7048ffc7a2b6eccf6f2d3f6bc

Contents?: true

Size: 1.57 KB

Versions: 16

Compression:

Stored size: 1.57 KB

Contents

module Merb
  class Worker
    
    # :api: private
    attr_accessor :thread
    
    class << self
      # ==== Returns
      # Merb::Worker:: instance of a worker.
      # 
      # :api: private
      def start
        @worker ||= new
        Merb.at_exit do 
          if Merb::Dispatcher.work_queue.empty?
            @worker.thread.abort_on_exception = false
            @worker.thread.raise
          else
            @worker.thread.join
          end
        end
        @worker
      end      
    end
    
    # Creates a new worker thread that loops over the work queue.
    # 
    # :api: private
    def initialize
      @thread = Thread.new do
        loop do
          process_queue
          break if Merb::Dispatcher.work_queue.empty? && Merb.exiting
        end
      end
    end
    
    # Processes tasks in the Merb::Dispatcher.work_queue.
    # 
    # :api: private
    def process_queue
      begin
        while blk = Merb::Dispatcher.work_queue.pop
           # we've been blocking on the queue waiting for an item sleeping.
           # when someone pushes an item it wakes up this thread so we 
           # immediately pass execution to the scheduler so we don't 
           # accidentally run this block before the action finishes 
           # it's own processing
          Thread.pass
          blk.call
          break if Merb::Dispatcher.work_queue.empty? && Merb.exiting
        end
      rescue Exception => e
        Merb.logger.warn! %Q!Worker Thread Crashed with Exception:\n#{Merb.exception(e)}\nRestarting Worker Thread!
        retry
      end
    end
    
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
merb-core-1.0.12 lib/merb-core/dispatch/worker.rb
merb-core-1.0.2 lib/merb-core/dispatch/worker.rb
merb-core-1.0.10 lib/merb-core/dispatch/worker.rb
merb-core-1.0.11 lib/merb-core/dispatch/worker.rb
merb-core-1.0.1 lib/merb-core/dispatch/worker.rb
merb-core-1.0.3 lib/merb-core/dispatch/worker.rb
merb-core-1.0.5 lib/merb-core/dispatch/worker.rb
merb-core-1.0.4 lib/merb-core/dispatch/worker.rb
merb-core-1.0.6.1 lib/merb-core/dispatch/worker.rb
merb-core-1.0.8.1 lib/merb-core/dispatch/worker.rb
merb-core-1.0.7.1 lib/merb-core/dispatch/worker.rb
merb-core-1.0.6 lib/merb-core/dispatch/worker.rb
merb-core-1.0.7 lib/merb-core/dispatch/worker.rb
merb-core-1.0 lib/merb-core/dispatch/worker.rb
merb-core-1.0.8 lib/merb-core/dispatch/worker.rb
merb-core-1.0.9 lib/merb-core/dispatch/worker.rb