rbbt-util 5.23.0 → 5.23.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7397119676c0da57371a52797ef8a3f4dc2bc0a
4
- data.tar.gz: 973e8a7c4e2cb6eb960ed2b7c782dae0a615c0ac
3
+ metadata.gz: 1387c90c7d1b469409501f758b509242302e74b1
4
+ data.tar.gz: 8a8c064c4bb2d8ef569c6d6caa23804cec847f81
5
5
  SHA512:
6
- metadata.gz: 26497c36b05b98961b845562930dceb399c720ab399c5a71c16ccbefb6e5b9756c407ca4fd1ca5b679ef1fca5ea1c989fd1cd4b28b33d8ae983d82cdcfa99aa8
7
- data.tar.gz: 37a2aa35faac67658a57ef32d2ab662968a4a11ba44a6a1174d79cdfd86a4315f8ee2b57b3f870b928a4e7b1138ceb5f81f12b513beff95bf00171839083bc9b
6
+ metadata.gz: 0beeca3f823da88c8cfc94cbc8eefd30692a736eff13ac648a7592985ca4585dc4b7ba72ca2ce990e915b8ee5307e87b920b6bc835bd469807654a0b41b710d5
7
+ data.tar.gz: 851277c016a171d1db79e3f16d33ef8f967fff05eaba1c33d70d73c7851a3a19153de0ae01902d9d4903ef0e93ecf57c7ddd920ca1a60516aca84e066aa2f21e
@@ -3,16 +3,19 @@ require 'rbbt/util/concurrency/processes/socket'
3
3
 
4
4
  class RbbtProcessQueue
5
5
 
6
- attr_accessor :num_processes, :processes, :queue, :process_monitor, :cleanup, :join, :reswpan, :offset
6
+ attr_accessor :num_processes, :queue, :process_monitor, :cleanup, :join, :reswpan, :offset
7
7
  def initialize(num_processes, cleanup = nil, join = nil, reswpan = nil, offset = false)
8
8
  @num_processes = num_processes
9
- @processes = []
10
9
  @cleanup = cleanup
11
10
  @join = join
12
11
  @respawn = reswpan
13
12
  @offset = offset
14
13
  @queue = RbbtProcessSocket.new
15
- @process_mutex = Mutex.new
14
+
15
+ key = "/" << rand(1000000000).to_s << '.' << Process.pid.to_s;
16
+ @sem = key + '.process'
17
+ Log.debug "Creating process semaphore: #{@sem}"
18
+ RbbtSemaphore.create_semaphore(@sem,1)
16
19
  end
17
20
 
18
21
 
@@ -66,16 +69,25 @@ class RbbtProcessQueue
66
69
  def init(&block)
67
70
  @init_block = block
68
71
 
72
+ RbbtSemaphore.wait_semaphore(@sem)
69
73
  @master_pid = Process.fork do
70
74
  @close_up = false
75
+ processes_initiated = false
76
+ process_mutex = Mutex.new
71
77
 
72
78
  Signal.trap(CLOSE_SIGNAL) do
73
- @close_up = true unless @closing_thread
74
- Misc.insist([0,0.01,0.1,0.2,0.5]) do
75
- raise TryAgain unless @manager_thread
76
- if @manager_thread.alive?
77
- raise "Manager thread for #{Process.pid} Not working yet" unless @manager_thread["working"]
78
- @manager_thread.raise TryAgain
79
+ if ! @closing_thread
80
+ @close_up = true
81
+ Misc.insist([0,0.01,0.1,0.2,0.5]) do
82
+ if ! @manager_thread
83
+ Thread.pass
84
+ raise "Manager thread for #{Process.pid} not found yet"
85
+ end
86
+
87
+ if @manager_thread.alive?
88
+ raise "Manager thread for #{Process.pid} not working yet" unless @manager_thread["working"]
89
+ @manager_thread.raise TryAgain
90
+ end
79
91
  end
80
92
  end
81
93
  end
@@ -91,23 +103,20 @@ class RbbtProcessQueue
91
103
  end
92
104
 
93
105
  Signal.trap(ABORT_SIGNAL) do
94
- begin
95
- @monitor_thread.raise Aborted
96
- rescue Exception
97
- Log.exception $!
106
+ Misc.insist([0,0.01,0.1,0.2,0.5]) do
107
+ @monitor_thread.raise Aborted if @monitor_thread && @monitor_thread.alive?
98
108
  end
99
109
  end
100
110
 
101
-
102
111
  if @callback_queue
103
- Misc.purge_pipes(@queue.swrite,@queue.sread,@callback_queue.swrite, @callback_queue.sread)
112
+ Misc.purge_pipes(@queue.swrite, @queue.sread, @callback_queue.swrite, @callback_queue.sread)
104
113
  else
105
- Misc.purge_pipes(@queue.swrite,@queue.sread)
114
+ Misc.purge_pipes(@queue.swrite, @queue.sread)
106
115
  end
107
116
 
108
- @total = num_processes
117
+ @total = 0
109
118
  @count = 0
110
- @processes = []
119
+ processes = []
111
120
 
112
121
  @manager_thread = Thread.new do
113
122
  begin
@@ -115,15 +124,19 @@ class RbbtProcessQueue
115
124
  begin
116
125
  Thread.current["working"] = true
117
126
  if @close_up
118
- @close_up = false
119
- Log.debug "Closing up process queue #{Process.pid}"
120
- @count = 0
121
- @closing_thread = Thread.new do
122
- Log.debug "Pushing closed stream #{Process.pid}"
123
- while true
124
- @queue.push ClosedStream.new unless @queue.cleaned
125
- break if @processes.empty?
126
- end unless @processes.empty?
127
+ Thread.handle_interrupt(TryAgain => :never) do
128
+ Log.debug "Closing up process queue #{Process.pid}"
129
+ @count = 0
130
+ @closing_thread = Thread.new do
131
+ Thread.handle_interrupt(TryAgain => :never) do
132
+ Log.debug "Pushing closed stream #{Process.pid}"
133
+ while true
134
+ @queue.push ClosedStream.new unless @queue.cleaned
135
+ break if processes_initiated && processes.empty?
136
+ end unless processes_initiated && processes.empty?
137
+ end
138
+ end
139
+ @close_up = false
127
140
  end
128
141
  end
129
142
 
@@ -134,20 +147,22 @@ class RbbtProcessQueue
134
147
 
135
148
  raise TryAgain if @close_up
136
149
 
137
- @process_mutex.synchronize do
138
- while @count > 0
139
- @count -= 1
140
- @total += 1
141
- @processes << RbbtProcessQueueWorker.new(@queue, @callback_queue, @cleanup, @respawn, @offset, &@init_block)
142
- Log.warn "Added process #{@processes.last.pid} to #{Process.pid} (#{@processes.length})"
143
- end
144
-
145
- while @count < 0
146
- @count += 1
147
- next unless @processes.length > 1
148
- first = @processes.shift
149
- first.stop
150
- Log.warn "Removed process #{first.pid} from #{Process.pid} (#{@processes.length})"
150
+ process_mutex.synchronize do
151
+ Thread.handle_interrupt(TryAgain => :never) do
152
+ while @count > 0
153
+ @count -= 1
154
+ @total += 1
155
+ processes << RbbtProcessQueueWorker.new(@queue, @callback_queue, @cleanup, @respawn, @offset, &@init_block)
156
+ Log.warn "Added process #{processes.last.pid} to #{Process.pid} (#{processes.length})"
157
+ end
158
+
159
+ while @count < 0
160
+ @count += 1
161
+ next unless processes.length > 1
162
+ first = processes.shift
163
+ first.stop
164
+ Log.warn "Removed process #{first.pid} from #{Process.pid} (#{processes.length})"
165
+ end
151
166
  end
152
167
  end
153
168
  rescue TryAgain
@@ -169,34 +184,38 @@ class RbbtProcessQueue
169
184
  @callback_queue.close_read if @callback_queue
170
185
 
171
186
  num_processes.times do |i|
172
- @process_mutex.synchronize do
173
- @processes << RbbtProcessQueueWorker.new(@queue, @callback_queue, @cleanup, @respawn, @offset, &@init_block)
187
+ @total += 1
188
+ process_mutex.synchronize do
189
+ processes << RbbtProcessQueueWorker.new(@queue, @callback_queue, @cleanup, @respawn, @offset, &@init_block)
174
190
  end
175
191
  end
176
192
 
193
+ processes_initiated = true
194
+
177
195
  @monitor_thread = Thread.new do
178
196
  begin
179
- while @processes.any?
180
- @processes[0].join
181
- @processes.shift
197
+ while processes.any?
198
+ processes[0].join
199
+ processes.shift
182
200
  end
183
201
  rescue Aborted
184
202
  Log.warn "Aborting process monitor"
185
- @processes.each{|p| p.abort_and_join}
186
- @processes.clear
203
+ processes.each{|p| p.abort_and_join}
204
+ processes.clear
187
205
 
188
206
  @callback_thread.kill if @callback_thread && @callback_thread.alive?
189
207
  @manager_thread.kill if @manager_thread.alive?
190
208
  rescue Exception
191
209
  Log.warn "Process monitor exception: #{$!.message}"
192
- @processes.each{|p| p.abort_and_join}
193
- @processes.clear
210
+ processes.each{|p| p.abort_and_join}
211
+ processes.clear
194
212
 
195
213
  @callback_thread.kill if @callback_thread && @callback_thread.alive?
196
214
  @manager_thread.kill if @manager_thread.alive?
197
215
  end
198
216
  end
199
217
 
218
+ RbbtSemaphore.post_semaphore(@sem)
200
219
 
201
220
  begin
202
221
 
@@ -233,7 +252,7 @@ class RbbtProcessQueue
233
252
  Log.warn "Error closing callback: #{$!.message}"
234
253
  end
235
254
  @callback_thread.join if @callback_thread && @callback_thread.alive?
236
- t.join
255
+ t.join if t && t.alive?
237
256
  end
238
257
 
239
258
  def _join
@@ -265,7 +284,9 @@ class RbbtProcessQueue
265
284
 
266
285
  def join
267
286
  begin
268
- Process.kill CLOSE_SIGNAL, @master_pid
287
+ RbbtSemaphore.synchronize(@sem) do
288
+ Process.kill CLOSE_SIGNAL, @master_pid
289
+ end
269
290
  rescue Errno::ECHILD, Errno::ESRCH
270
291
  Log.debug "Cannot kill #{@master_pid}: #{$!.message}"
271
292
  end
@@ -296,6 +317,7 @@ class RbbtProcessQueue
296
317
  end
297
318
 
298
319
  def clean
320
+ RbbtSemaphore.delete_semaphore(@sem)
299
321
  begin
300
322
  self.abort if Misc.pid_exists?(@master_pid)
301
323
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbbt-util
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.23.0
4
+ version: 5.23.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-02 00:00:00.000000000 Z
11
+ date: 2018-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake