Sha256: d8df2abeac7583828a9f816b137ac8201d70d0f436ddeb510047569c165b13e1

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

module Zeus
  class Server
    class ForkedProcess
      HasNoChildren = Class.new(Exception)

      attr_accessor :name
      attr_reader :pid
      def initialize(server)
        @server = server
      end

      def notify_feature(feature)
        @server.__CHILD__pid_has_feature(Process.pid, feature)
      end

      def descendent_acceptors
        raise NotImplementedError
      end

      def process_type
        raise "NotImplementedError"
      end

      def setup_forked_process(close_parent_sockets)
        @server.__CHILD__close_parent_sockets if close_parent_sockets
        @server.__CHILD__pid_has_ppid(Process.pid, Process.ppid)

        $0 = "zeus #{process_type}: #{@name}"

        Zeus.ui.as_zeus("starting #{process_type} `#{@name}`")
        trap("INT") {
          Zeus.ui.as_zeus("killing #{process_type} `#{@name}`")
          exit 0
        }

        Thread.new {
          $LOADED_FEATURES.each { |f| notify_feature(f) }
        }
      end

      def kill_pid_on_exit(pid)
        currpid = Process.pid
        at_exit { Process.kill(9, pid) if Process.pid == currpid rescue nil }
      end

      def runloop!
        raise NotImplementedError
      end

      def before_setup
      end

      def after_setup
      end

      def run(close_parent_sockets = false)
        @pid = fork {
          before_setup
          setup_forked_process(close_parent_sockets)
          after_setup
          runloop!
        }
        kill_pid_on_exit(@pid)
        @pid
      end

    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
zeus-0.2.6 lib/zeus/server/forked_process.rb