bixby-common 0.6.2 → 0.6.3
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 +4 -4
- data/VERSION +1 -1
- data/bixby-common.gemspec +2 -2
- data/lib/bixby-common/util/thread_pool.rb +16 -5
- data/test/util/thread_pool_test.rb +41 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ef49eaa3aea879b94f4ba4f77fe7e152044f415
|
4
|
+
data.tar.gz: 403008eee8f7dc8e787afceba4a9fe7696ad4b51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5eb86970763068ff7a08fb5f84cad02e910bf6a73e3e419f2c044827fea39e1a55aa69431983d264a65311dc7c8177ed2158d662ed874c4bed54134c735f0cba
|
7
|
+
data.tar.gz: c8dbaf3da89d7243b028c449665f454350f9ec3edb2c13b5252d961b08d60cca75bf857adce8c0e422080ca7a0384fe2cec450a8995afb0fca491ab5b615048a
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.3
|
data/bixby-common.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: bixby-common 0.6.
|
5
|
+
# stub: bixby-common 0.6.3 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "bixby-common"
|
9
|
-
s.version = "0.6.
|
9
|
+
s.version = "0.6.3"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
@@ -32,7 +32,7 @@ module Bixby
|
|
32
32
|
logger.debug { "enqueue new task: #{command}" }
|
33
33
|
@input_queue.push(Task.new(command, block))
|
34
34
|
if command == :perform then
|
35
|
-
|
35
|
+
grow
|
36
36
|
end
|
37
37
|
nil
|
38
38
|
end
|
@@ -125,7 +125,6 @@ module Bixby
|
|
125
125
|
end
|
126
126
|
|
127
127
|
enqueue(:shutdown, callback)
|
128
|
-
@size -= 1
|
129
128
|
end
|
130
129
|
end
|
131
130
|
|
@@ -165,8 +164,8 @@ module Bixby
|
|
165
164
|
exit_handler = lambda { |worker, reason|
|
166
165
|
@lock.synchronize do
|
167
166
|
if reason == :exception or (reason == :timeout && @size > @min_size) then
|
168
|
-
@size -= 1
|
169
167
|
remove_worker(worker)
|
168
|
+
grow
|
170
169
|
return true
|
171
170
|
end
|
172
171
|
false
|
@@ -179,13 +178,15 @@ module Bixby
|
|
179
178
|
end
|
180
179
|
|
181
180
|
# Grow the pool by one if we have more jobs than idle workers
|
182
|
-
def
|
181
|
+
def grow
|
183
182
|
@lock.synchronize do
|
183
|
+
prune
|
184
184
|
logger.debug { "jobs: #{num_jobs}; busy: #{num_working}; idle: #{num_idle}" }
|
185
|
-
if @size < @max_size && num_jobs > 0 && num_jobs > num_idle then
|
185
|
+
if @size == 0 || (@size < @max_size && num_jobs > 0 && num_jobs > num_idle) then
|
186
186
|
space = @max_size-@size
|
187
187
|
jobs = num_jobs-num_idle
|
188
188
|
needed = space < jobs ? space : jobs
|
189
|
+
needed = 1 if needed <= 0
|
189
190
|
expand(needed)
|
190
191
|
else
|
191
192
|
logger.debug "NOT growing the pool!"
|
@@ -195,9 +196,19 @@ module Bixby
|
|
195
196
|
nil
|
196
197
|
end
|
197
198
|
|
199
|
+
# Remove any dead worker threads which may not have been cleaned up properly
|
200
|
+
# (via callback handler)
|
201
|
+
def prune
|
202
|
+
@lock.synchronize do
|
203
|
+
@workers.delete_if { |w| !w.alive? }
|
204
|
+
@size = @workers.size
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
198
208
|
def remove_worker(worker)
|
199
209
|
@lock.synchronize do
|
200
210
|
@workers.delete(worker)
|
211
|
+
@size -= 1
|
201
212
|
end
|
202
213
|
|
203
214
|
nil
|
@@ -2,6 +2,13 @@
|
|
2
2
|
require 'helper'
|
3
3
|
|
4
4
|
module Bixby
|
5
|
+
|
6
|
+
class ThreadPool
|
7
|
+
def workers
|
8
|
+
@workers
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
module Test
|
6
13
|
class TestThreadPool < TestCase
|
7
14
|
|
@@ -78,6 +85,40 @@ class TestThreadPool < TestCase
|
|
78
85
|
assert_equal 1, @pool.size, "pool should shrink to 1"
|
79
86
|
end
|
80
87
|
|
88
|
+
def test_handle_exception
|
89
|
+
@pool.perform do
|
90
|
+
raise "bleh"
|
91
|
+
end
|
92
|
+
|
93
|
+
while @pool.num_busy > 0 || @pool.num_jobs > 0 do
|
94
|
+
sleep 0.1
|
95
|
+
end
|
96
|
+
|
97
|
+
assert_equal 1, @pool.size
|
98
|
+
assert_equal 0, @pool.workers.find_all{ |w| !w.thread.alive? }.size, "no dead threads"
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_handle_killed_thread
|
102
|
+
assert_equal 1, @pool.size
|
103
|
+
assert @pool.workers.find{ |w| w.thread.alive? }
|
104
|
+
@pool.workers.first.thread.kill
|
105
|
+
sleep 0.01
|
106
|
+
assert_equal 1, @pool.size
|
107
|
+
assert_equal 1, @pool.num_idle
|
108
|
+
refute @pool.workers.find{ |w| w.thread.alive? }
|
109
|
+
|
110
|
+
foo = []
|
111
|
+
@pool.perform do
|
112
|
+
foo << "bar"
|
113
|
+
end
|
114
|
+
|
115
|
+
@pool.dispose
|
116
|
+
|
117
|
+
@pool.summary
|
118
|
+
assert_equal 1, foo.size
|
119
|
+
assert_equal "bar", foo.first
|
120
|
+
end
|
121
|
+
|
81
122
|
end # TestThreadPool
|
82
123
|
end # Test
|
83
124
|
end # Bixby
|