rbbt-util 5.23.0 → 5.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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