Sha256: 53f7452530c6e58a0084bfe276c0e4e9f94c0b7aea48b9fc491b76470fcdf398

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

# frozen_string_literal: true

require 'lounger/version'

# The Lounger class is the main class which will allow to handle traps
# in simple way.
class Lounger
  SIGNALS = %w[INT TERM EXIT USR1 QUIT].freeze

  def initialize(include_signals: [], exclude_signals: [])
    @lock            = Mutex.new
    @condition       = ConditionVariable.new
    @pending_signals = 0
    @buffer          = []
    @idle            = false

    (SIGNALS + include_signals - exclude_signals).each do |s|
      Signal.trap(s) { @condition.signal }
    end
  end

  def idle(ignore_pending: false)
    result = nil
    @lock.synchronize do
      @pending_signals = 0 if ignore_pending
      @idle = true

      if @pending_signals.positive?
        @pending_signals -= 1
      else
        @condition.wait(@lock)
        @pending_signals -= 1
      end

      @idle = false
      result = @buffer.shift
    end

    result
  end

  def idle?
    @idle
  end

  def wakeup!(value = nil)
    @lock.synchronize do
      @pending_signals += 1
      @buffer << value
      @condition.signal
    end
  end

  def self.idle
    Lounger.new.idle
  end

  alias_method :waiting?, :idle?
  alias_method :wait, :idle
  alias_method :signal, :wakeup!
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lounger-0.3.4 lib/lounger.rb