Class: Opal::Builder::Scheduler::Prefork::Fork

Inherits:
Object
  • Object
show all
Defined in:
opal/lib/opal/builder/scheduler/prefork.rb

Instance Method Summary collapse

Constructor Details

#initialize(forkset) ⇒ Fork

Returns a new instance of Fork.



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 134

def initialize(forkset)
  @parent_read, @child_write = IO.pipe(binmode: true)
  @child_read, @parent_write = IO.pipe(binmode: true)
  @forkset = forkset
  @in_fork = false

  @pid = fork do
    @in_fork = true

    begin
      @parent_read.close
      @parent_write.close

      yield(self)
    rescue => error
      send(:exception, error)
    ensure
      send(:close) unless write_io.closed?
      @child_write.close
    end
  end

  @child_read.close
  @child_write.close
end

Instance Method Details

#closeObject



160
161
162
163
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 160

def close
  send(:close)
  @parent_write.close
end

#eof?Boolean

Returns:

  • (Boolean)


191
192
193
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 191

def eof?
  write_io.closed?
end

#fork?Boolean

Returns:

  • (Boolean)


179
180
181
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 179

def fork?
  @in_fork
end

#goodbyeObject



165
166
167
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 165

def goodbye
  read_io.close unless read_io.closed?
end

#read_ioObject



183
184
185
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 183

def read_io
  fork? ? @child_read : @parent_read
end

#recvObject



199
200
201
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 199

def recv
  recv_message(read_io)
end

#recv_message(io) ⇒ Object



174
175
176
177
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 174

def recv_message(io)
  length, = *io.read(8).unpack('Q')
  Marshal.load(io.read(length)) # rubocop:disable Security/MarshalLoad
end

#send(*msg) ⇒ Object



195
196
197
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 195

def send(*msg)
  send_message(write_io, msg)
end

#send_message(io, msg) ⇒ Object



169
170
171
172
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 169

def send_message(io, msg)
  msg = Marshal.dump(msg)
  io.write([msg.length].pack('Q') + msg)
end

#waitObject



203
204
205
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 203

def wait
  Process.waitpid(@pid, Process::WNOHANG)
end

#write_ioObject



187
188
189
# File 'opal/lib/opal/builder/scheduler/prefork.rb', line 187

def write_io
  fork? ? @child_write : @parent_write
end