Sha256: 1486f6eb95d278b099781eae26795ae1b3a3cfc51aa0712259756870c634da8e

Contents?: true

Size: 1.76 KB

Versions: 29

Compression:

Stored size: 1.76 KB

Contents

require 'thread'

module Skylight
  class GC
    METHODS   = [ :enable, :total_time ]
    TH_KEY    = :SK_GC_CURR_WINDOW
    MAX_COUNT = 1000
    MAX_TIME  = 30_000_000

    include Util::Logging

    attr_reader :config

    def initialize(config, profiler)
      @listeners = []
      @config    = config
      @lock      = Mutex.new
      @time      = 0

      if METHODS.all? { |m| profiler.respond_to?(m) }
        @profiler = profiler
        @time = @profiler.total_time
      else
        debug "disabling GC profiling"
      end
    end

    def enable
      @profiler.enable if @profiler
    end

    def track
      unless @profiler
        win = Window.new(nil)
      else
        win = Window.new(self)

        @lock.synchronize do
          __update
          @listeners << win

          # Cleanup any listeners that might have leaked
          until @listeners[0].time < MAX_TIME
            @listeners.shift
          end

          if @listeners.length > MAX_COUNT
            @listeners.shift
          end
        end
      end

      win
    end

    def release(win)
      @lock.synchronize do
        @listeners.delete(win)
      end
    end

    def update
      @lock.synchronize do
        __update
      end

      nil
    end

  private

    def __update
      time  = @profiler.total_time
      diff  = time - @time
      @time = time

      if diff > 0
        @listeners.each do |l|
          l.add(diff)
        end
      end
    end

    class Window
      attr_reader :time

      def initialize(global)
        @global = global
        @time   = 0
      end

      def update
        @global.update if @global
      end

      def add(time)
        @time += time
      end

      def release
        @global.release(self) if @global
      end
    end

  end
end

Version data entries

29 entries across 29 versions & 1 rubygems

Version Path
skylight-0.3.10 lib/skylight/gc.rb
skylight-0.3.8 lib/skylight/gc.rb
skylight-0.3.7 lib/skylight/gc.rb
skylight-0.3.6 lib/skylight/gc.rb
skylight-0.3.3 lib/skylight/gc.rb
skylight-0.3.2 lib/skylight/gc.rb
skylight-0.3.1 lib/skylight/gc.rb
skylight-0.3.0 lib/skylight/gc.rb
skylight-0.2.7 lib/skylight/gc.rb
skylight-0.2.6 lib/skylight/gc.rb
skylight-0.3.0.rc.6 lib/skylight/gc.rb
skylight-0.2.5 lib/skylight/gc.rb
skylight-0.2.4 lib/skylight/gc.rb
skylight-0.3.0.rc.5 lib/skylight/gc.rb
skylight-0.3.0.rc.4 lib/skylight/gc.rb
skylight-0.3.0.rc.3 lib/skylight/gc.rb
skylight-0.2.3 lib/skylight/gc.rb
skylight-0.2.2 lib/skylight/gc.rb
skylight-0.2.1 lib/skylight/gc.rb
skylight-0.2.0 lib/skylight/gc.rb