$20 GRAYBYTE WORDPRESS FILE MANAGER $14

SERVER : premium201.web-hosting.com #1 SMP Wed Mar 26 12:08:09 UTC 2025
SERVER IP : 172.67.217.254 | ADMIN IP 216.73.216.23
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/opt/alt/ruby22/lib64/ruby/2.2.0/rake/

HOME
Current File : /opt/alt/ruby22/lib64/ruby/2.2.0/rake//thread_pool.rb
require 'thread'
require 'set'

require 'rake/promise'

module Rake

  class ThreadPool # :nodoc: all

    # Creates a ThreadPool object.  The +thread_count+ parameter is the size
    # of the pool.
    def initialize(thread_count)
      @max_active_threads = [thread_count, 0].max
      @threads = Set.new
      @threads_mon = Monitor.new
      @queue = Queue.new
      @join_cond = @threads_mon.new_cond

      @history_start_time = nil
      @history = []
      @history_mon = Monitor.new
      @total_threads_in_play = 0
    end

    # Creates a future executed by the +ThreadPool+.
    #
    # The args are passed to the block when executing (similarly to
    # Thread#new) The return value is an object representing
    # a future which has been created and added to the queue in the
    # pool. Sending #value to the object will sleep the
    # current thread until the future is finished and will return the
    # result (or raise an exception thrown from the future)
    def future(*args, &block)
      promise = Promise.new(args, &block)
      promise.recorder = lambda { |*stats| stat(*stats) }

      @queue.enq promise
      stat :queued, :item_id => promise.object_id
      start_thread
      promise
    end

    # Waits until the queue of futures is empty and all threads have exited.
    def join
      @threads_mon.synchronize do
        begin
          stat :joining
          @join_cond.wait unless @threads.empty?
          stat :joined
        rescue Exception => e
          stat :joined
          $stderr.puts e
          $stderr.print "Queue contains #{@queue.size} items. " +
            "Thread pool contains #{@threads.count} threads\n"
          $stderr.print "Current Thread #{Thread.current} status = " +
            "#{Thread.current.status}\n"
          $stderr.puts e.backtrace.join("\n")
          @threads.each do |t|
            $stderr.print "Thread #{t} status = #{t.status}\n"
            # 1.8 doesn't support Thread#backtrace
            $stderr.puts t.backtrace.join("\n") if t.respond_to? :backtrace
          end
          raise e
        end
      end
    end

    # Enable the gathering of history events.
    def gather_history          #:nodoc:
      @history_start_time = Time.now if @history_start_time.nil?
    end

    # Return a array of history events for the thread pool.
    #
    # History gathering must be enabled to be able to see the events
    # (see #gather_history). Best to call this when the job is
    # complete (i.e. after ThreadPool#join is called).
    def history                 # :nodoc:
      @history_mon.synchronize { @history.dup }.
        sort_by { |i| i[:time] }.
        each { |i| i[:time] -= @history_start_time }
    end

    # Return a hash of always collected statistics for the thread pool.
    def statistics              #  :nodoc:
      {
        :total_threads_in_play => @total_threads_in_play,
        :max_active_threads => @max_active_threads,
      }
    end

    private

    # processes one item on the queue. Returns true if there was an
    # item to process, false if there was no item
    def process_queue_item      #:nodoc:
      return false if @queue.empty?

      # Even though we just asked if the queue was empty, it
      # still could have had an item which by this statement
      # is now gone. For this reason we pass true to Queue#deq
      # because we will sleep indefinitely if it is empty.
      promise = @queue.deq(true)
      stat :dequeued, :item_id => promise.object_id
      promise.work
      return true

      rescue ThreadError # this means the queue is empty
      false
    end

    def safe_thread_count
      @threads_mon.synchronize do
        @threads.count
      end
    end

    def start_thread # :nodoc:
      @threads_mon.synchronize do
        next unless @threads.count < @max_active_threads

        t = Thread.new do
          begin
            while safe_thread_count <= @max_active_threads
              break unless process_queue_item
            end
          ensure
            @threads_mon.synchronize do
              @threads.delete Thread.current
              stat :ended, :thread_count => @threads.count
              @join_cond.broadcast if @threads.empty?
            end
          end
        end

        @threads << t
        stat(
          :spawned,
          :new_thread   => t.object_id,
          :thread_count => @threads.count)
        @total_threads_in_play = @threads.count if
          @threads.count > @total_threads_in_play
      end
    end

    def stat(event, data=nil) # :nodoc:
      return if @history_start_time.nil?
      info = {
        :event  => event,
        :data   => data,
        :time   => Time.now,
        :thread => Thread.current.object_id,
      }
      @history_mon.synchronize { @history << info }
    end

    # for testing only

    def __queue__ # :nodoc:
      @queue
    end
  end

end


Current_dir [ NOT WRITEABLE ] Document_root [ NOT WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
3 Mar 2024 10.53 PM
root / root
0755
contrib
--
3 Mar 2024 10.53 PM
root / linksafe
0755
ext
--
3 Mar 2024 10.53 PM
root / linksafe
0755
lib
--
26 Jul 2023 2.31 PM
root / linksafe
0755
loaders
--
3 Mar 2024 10.53 PM
root / linksafe
0755
alt_system.rb
3.168 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
application.rb
23.143 KB
6 Dec 2014 12.22 AM
root / linksafe
0644
backtrace.rb
0.848 KB
16 Aug 2014 3.56 AM
root / linksafe
0644
clean.rb
1.931 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
cloneable.rb
0.408 KB
6 Sep 2014 9.31 AM
root / linksafe
0644
cpu_counter.rb
2.828 KB
5 Nov 2014 5.19 AM
root / linksafe
0644
default_loader.rb
0.229 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
dsl_definition.rb
5.643 KB
6 Dec 2014 12.22 AM
root / linksafe
0644
early_time.rb
0.332 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
file_creation_task.rb
0.654 KB
23 Jun 2011 10.11 PM
root / linksafe
0644
file_list.rb
12.129 KB
6 Sep 2014 9.31 AM
root / linksafe
0644
file_task.rb
1.26 KB
25 Nov 2014 7.03 AM
root / linksafe
0644
file_utils.rb
3.662 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
file_utils_ext.rb
4.052 KB
11 Oct 2013 9.35 PM
root / linksafe
0644
gempackagetask.rb
0.141 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
invocation_chain.rb
1.156 KB
27 Aug 2014 12.21 PM
root / linksafe
0644
invocation_exception_mixin.rb
0.421 KB
23 Jun 2011 10.11 PM
root / linksafe
0644
late_time.rb
0.259 KB
25 Nov 2014 7.03 AM
root / linksafe
0644
linked_list.rb
2.268 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
multi_task.rb
0.308 KB
15 Nov 2012 9.59 PM
root / linksafe
0644
name_space.rb
0.657 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
packagetask.rb
5.28 KB
25 Nov 2014 7.03 AM
root / linksafe
0644
pathmap.rb
0.052 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
phony.rb
0.343 KB
15 Nov 2012 10.32 PM
root / linksafe
0644
private_reader.rb
0.355 KB
15 Nov 2012 10.01 PM
root / linksafe
0644
promise.rb
2.282 KB
11 Oct 2013 9.35 PM
root / linksafe
0644
pseudo_status.rb
0.366 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
rake_module.rb
0.752 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
rake_test_loader.rb
0.333 KB
28 Jun 2011 2.45 AM
root / linksafe
0644
rdoctask.rb
0.149 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
ruby182_test_unit_fix.rb
0.876 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
rule_recursion_overflow_error.rb
0.345 KB
23 Jun 2011 10.11 PM
root / linksafe
0644
runtest.rb
0.58 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
scope.rb
0.861 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
task.rb
11.02 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
task_argument_error.rb
0.116 KB
23 Jun 2011 10.11 PM
root / linksafe
0644
task_arguments.rb
2.146 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
task_manager.rb
8.837 KB
25 Nov 2014 7.03 AM
root / linksafe
0644
tasklib.rb
0.604 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
testtask.rb
5.549 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
thread_history_display.rb
1.106 KB
11 Oct 2013 9.35 PM
root / linksafe
0644
thread_pool.rb
4.776 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
trace_output.rb
0.53 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
version.rb
0.152 KB
15 Jul 2014 3.07 AM
root / linksafe
0644
win32.rb
1.551 KB
15 Jul 2014 3.07 AM
root / linksafe
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2025 CONTACT ME
Static GIF