Temporary tag for this failure. Updated CI spec coming.
[rbx.git] / kernel / core / vm.rb
blob9ecd62909da410e220b63271dfb01b6ebb682b0f
1 class Rubinius::VM
2   def self.spawn(*args)
3     args.unshift "rubinius"
4     ret = spawn_prim(args)
5     return new(*ret)
6   end
8   def self.get_message
9     # This is how we go to sleep until someone sends us something
10     # MESSAGE_IO is a pipe that the environment will send a magic
11     # byte down to tell us that there is a message read.
12     Rubinius::MESSAGE_IO.sysread(1)
13     poll_message
14   end
16   def self.each_message
17     while true
18       yield get_message
19     end
20   end
22   def initialize(id, stdin, stdout, stderr)
23     @id = id
24     @stdin = stdin
25     @stdout = stdout
26     @stderr = stderr
28     @stdin.setup
29     @stdout.setup
30   end
32   attr_reader :id
33   attr_reader :stdin
34   attr_reader :stdout
35   attr_reader :stderr
37   def join
38     self.class.join @id
39   end
41   def <<(obj)
42     self.class.send_message @id, obj
43   end
45   ##
46   # Sets a default VM debug channel to be used for handling yield_debugger
47   # bytecodes. The caller must ensure that a debugger thread is waiting on the
48   # receive end of the debug channel before any yield_debugger ops are hit.
49   #
50   # If no VM debug channel is specified, individual threads must have
51   # #set_debugging called on them before they encounter a yield_debugger op.
52   #
53   # Only one debug channel can be set at any time. Attempts to call this method
54   # with a value other than nil while a debug channel is already set will raise
55   # an ArgumentError.
57   def self.debug_channel=(channel)
58     if channel and @debug_channel
59       raise ArgumentError, "A VM debug channel has already been registered"
60     end
61     @debug_channel = channel
62   end
64   def self.debug_channel
65     @debug_channel
66   end
67 end