Class: DeepConnect::DeepFork

Inherits:
Object
  • Object
show all
Defined in:
lib/deep-connect/deep-fork.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dc1, service = 0, except_closing_io = [STDIN, STDOUT, STDERR], &block) ⇒ DeepFork

Returns a new instance of DeepFork.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/deep-connect/deep-fork.rb', line 17

def initialize(dc1, service = 0, except_closing_io = [STDIN, STDOUT, STDERR], &block)
  @dc1 = dc1

  @peer_pid = nil
  @peer_deep_space = nil
  @peer_deep_space_mx = Mutex.new
  @peer_deep_space_cv = ConditionVariable.new

  exp = "DeepFork_#{format("%0xd", self.object_id)}"
  @dc1.export(exp, self)

  @peer_pid = Process.fork {
	ionos = except_closing_io.collect{|io| io.fileno}

	ObjectSpace.each_object(IO) do |io|
	  begin
 unless ionos.include?(io.fileno)
   io.close
 end
	  rescue
	  end
	end
	dc2 = DeepConnect.start(service)
	ds2 = dc2.open_deepspace("localhost", @dc1.local_id)
	df1 = ds2.import(exp)
	df1.connect(self, $$)
	block.call(dc2, ds2)
  }

  @peer_deep_space_mx.synchronize do
	until @peer_deep_space
	  @peer_deep_space_cv.wait(@peer_deep_space_mx)
	end
  end
  self
end

Instance Attribute Details

#peer_deep_spaceObject (readonly)

Returns the value of attribute peer_deep_space.



54
55
56
# File 'lib/deep-connect/deep-fork.rb', line 54

def peer_deep_space
  @peer_deep_space
end

#peer_pidObject (readonly)

Returns the value of attribute peer_pid.



55
56
57
# File 'lib/deep-connect/deep-fork.rb', line 55

def peer_pid
  @peer_pid
end

Instance Method Details

#connect(df2, peer_pid) ⇒ Object



57
58
59
60
61
62
63
64
# File 'lib/deep-connect/deep-fork.rb', line 57

def connect(df2, peer_pid)
  @peer_deep_space_mx.synchronize do
	if @peer_pid == peer_pid
	  @peer_deep_space = df2.deep_space
	  @peer_deep_space_cv.signal
	end
  end
end