Sha256: 92dcde05b4338dab968f2a734fb9b9f5e8ebc768a58a4c3ae2fed9543a852f96

Contents?: true

Size: 1.74 KB

Versions: 2

Compression:

Stored size: 1.74 KB

Contents

module Backport
  # The Backport server controller.
  #
  class Machine
    def initialize
      @stopped = true
      @mutex = Mutex.new
    end

    # Run the machine. If a block is provided, it gets executed before the
    # maching starts its main loop. The main loop blocks program execution
    # until the machine is stopped.
    #
    # @yieldparam [self]
    # @return [void]
    def run
      return unless stopped?
      servers.clear
      @stopped = false
      yield self if block_given?
      run_server_thread
    end

    # Stop the machine.
    #
    # @return [void]
    def stop
      servers.map(&:stop)
      servers.clear
      @stopped = true
    end

    # True if the machine is stopped.
    #
    def stopped?
      @stopped ||= false
    end

    # Add a server to the machine. The server will be started when the machine
    # starts. If the machine is already running, the server will be started
    # immediately.
    #
    # @param server [Server::Base]
    # @return [void]
    def prepare server
      server.add_observer self
      servers.push server
      server.start unless stopped?
    end

    # @return [Array<Server::Base>]
    def servers
      @servers ||= []
    end

    # @param server [Server::Base]
    # @return [void]
    def update server
      if server.stopped?
        servers.delete server
        stop if servers.empty?
      else
        mutex.synchronize { server.tick }
      end
    end

    private

    # @return [Mutex]
    attr_reader :mutex

    # Start the thread that updates servers via the #tick method.
    #
    # @return [void]
    def run_server_thread
      servers.map(&:start)
      sleep 0.1 until stopped?
    end
  end
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
getargv-0.3.3-universal-darwin vendor/bundle/ruby/3.3.0/gems/backport-1.2.0/lib/backport/machine.rb
backport-1.2.0 lib/backport/machine.rb