Sha256: fdefa8d05e2e6b73a90f8248fb8c7c67796e90820dc1a22d4c2b36100fb3868b

Contents?: true

Size: 1.34 KB

Versions: 1

Compression:

Stored size: 1.34 KB

Contents

module Mutant
  # Module providing isolation
  module Isolation
    Error = Class.new(RuntimeError)

    module None

      # Call block in isolation
      #
      # @return [Object]
      #
      # @raise [Error]
      #   if block terminates abnormal
      #
      # @api private
      #
      def self.call(&block)
        block.call
      rescue => exception
        fail Error, exception
      end
    end

    module Fork

      # Call block in isolation
      #
      # This isolation implements the fork strategy.
      # Future strategies will probably use a process pool that can
      # handle multiple mutation kills, in-isolation at once.
      #
      # @return [Object]
      #   returns block execution result
      #
      # @raise [Error]
      #   if block terminates abnormal
      #
      # @api private
      #
      def self.call(&block)
        reader, writer = IO.pipe

        pid = Process.fork do
          File.open('/dev/null', 'w') do |file|
            $stderr.reopen(file)
            reader.close
            writer.write(Marshal.dump(block.call))
            writer.close
          end
        end

        writer.close
        result = Marshal.load(reader.read)
        result
      rescue => exception
        fail Error, exception
      ensure
        Process.waitpid(pid) if pid
      end

    end # Fork

  end # Isolator
end # Mutant

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mutant-0.6.7 lib/mutant/isolation.rb