promise_pool 0.9.1 → 0.9.2

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
  SHA256:
3
- metadata.gz: d7d935d5301e4c9b26509720e19768c6c041f17daff13f3a2253e1e568062018
4
- data.tar.gz: 3fe5c84f8a1b85779e8f43486f8b54b4c1705cdaa1400c170e5aaa298b2a7a05
3
+ metadata.gz: d72f3c8230b78d9d0a71cf5c3e6d40afc13d47d45fa298c2d62ba7213fa6794d
4
+ data.tar.gz: f08eda0aac764cba80db426bea6dc3422ab9a1c6fa77d9901d7600740321a3a2
5
5
  SHA512:
6
- metadata.gz: 2a271da072dd2dcd6819b2e0ca3a70e264e469c6ff140ef1de0a3a9bfe4fdee64893ac1ca2036d75662228a1b3cb3641dd55450633b2a6a653e6779069cf4a31
7
- data.tar.gz: 1d8921ad67593e9ebb48eea281eef11d4fea098b70cd0c68de70552126b91fc32f28eb018a81d0ae1ae7f5ebe0578ba54e699d40e3416d72510e9f8fe4e19436
6
+ metadata.gz: 2a15b87acc00a537d50c9c37ef78dbb6197bd9717abdd61799c984943fa9bbf778175f16f837620516dfe80a0a09e9323c7c584a54ab55763c0a6c3472c1ba2c
7
+ data.tar.gz: a918d00de8bea336034b597c5bd64d8de37135e85e0f3df9b8327c653c3b1869cafd07a8232b10ceab85243dab0132a85dde41bc7828a80f4f73e9760afe1867
@@ -2,17 +2,16 @@ sudo: false
2
2
  language: ruby
3
3
 
4
4
  install: 'gem install bundler; bundle install --retry=3'
5
+ before_script: unset CI
5
6
  script: 'ruby -vr bundler/setup -S rake test'
6
7
 
7
8
  matrix:
8
9
  include:
9
- - rvm: 2.2
10
- - rvm: 2.3
11
10
  - rvm: 2.4
11
+ env: RUBYOPT=--enable-frozen-string-literal
12
+ - rvm: 2.5
13
+ env: RUBYOPT=--enable-frozen-string-literal
12
14
  - rvm: ruby-head
15
+ env: RUBYOPT=--enable-frozen-string-literal
13
16
  - rvm: jruby
14
17
  env: JRUBY_OPTS=--debug
15
- - rvm: rbx
16
-
17
- allow_failures:
18
- - rvm: rbx
data/CHANGES.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # CHANGES
2
2
 
3
+ ## promise_pool 0.9.2 -- 2018-07-21
4
+
5
+ * Added `Promise#started?` so we could pick the promise is starting or not.
6
+ * Potentially fixed an exception when the promise is not scheduled yet timed
7
+ out. It's unlikely to happen but it should be fine now.
8
+ * Added `ThreadPool#queue_size` to peek the size of the queue.
9
+
3
10
  ## promise_pool 0.9.1 -- 2018-03-20
4
11
 
5
12
  * Introduced PromisePool::Future.resolve to convert nested futures
data/Gemfile CHANGED
@@ -9,7 +9,3 @@ gem 'muack'
9
9
 
10
10
  gem 'simplecov', :require => false if ENV['COV']
11
11
  gem 'coveralls', :require => false if ENV['CI']
12
-
13
- platforms :rbx do
14
- gem 'rubysl-singleton' # used in rake
15
- end
data/README.md CHANGED
@@ -29,7 +29,7 @@ and improve modularity for both rest-core and promise_pool.
29
29
 
30
30
  ## REQUIREMENTS:
31
31
 
32
- * Tested with MRI (official CRuby), Rubinius and JRuby.
32
+ * Tested with MRI (official CRuby) and JRuby.
33
33
  * gem [timers][]
34
34
 
35
35
  [timers]: https://github.com/celluloid/timers
@@ -99,6 +99,10 @@ module PromisePool
99
99
  resolved
100
100
  end
101
101
 
102
+ def started?
103
+ !!working_thread
104
+ end
105
+
102
106
  protected
103
107
  attr_accessor :value, :error, :result, :resolved, :callbacks,
104
108
  :timer, :condv, :mutex, :task, :thread
@@ -152,7 +156,7 @@ module PromisePool
152
156
  mutex.synchronize do
153
157
  if resolved?
154
158
  # do nothing if it's already done
155
- elsif t = thread || task.thread
159
+ elsif t = working_thread
156
160
  t.raise(timer.error) # raise Timeout::Error to working thread
157
161
  else
158
162
  # task was queued and never started, just cancel it and
@@ -163,6 +167,10 @@ module PromisePool
163
167
  end
164
168
  end
165
169
 
170
+ def working_thread
171
+ thread || (task && task.thread)
172
+ end
173
+
166
174
  # log user callback error, should never raise
167
175
  def log_callback_error err
168
176
  warn "#{self.class}: ERROR: #{err}\n from #{err.backtrace.inspect}"
@@ -24,11 +24,15 @@ module PromisePool
24
24
  workers.size
25
25
  end
26
26
 
27
+ def queue_size
28
+ queue.size
29
+ end
30
+
27
31
  def defer promise_mutex, &job
28
32
  mutex.synchronize do
29
33
  task = Task.new(job, promise_mutex)
30
34
  queue << task
31
- spawn_worker if waiting < queue.size && workers.size < max_size
35
+ spawn_worker if waiting < queue_size && workers.size < max_size
32
36
  task
33
37
  end
34
38
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module PromisePool
3
- VERSION = '0.9.1'
3
+ VERSION = '0.9.2'
4
4
  end
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: promise_pool 0.9.1 ruby lib
2
+ # stub: promise_pool 0.9.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "promise_pool".freeze
6
- s.version = "0.9.1"
6
+ s.version = "0.9.2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Lin Jen-Shin (godfat)".freeze]
11
- s.date = "2018-03-20"
11
+ s.date = "2018-07-21"
12
12
  s.description = "promise_pool is a promise implementation backed by threads or threads pool.".freeze
13
13
  s.email = ["godfat (XD) godfat.org".freeze]
14
14
  s.files = [
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  "test/test_timer.rb".freeze]
39
39
  s.homepage = "https://github.com/godfat/promise_pool".freeze
40
40
  s.licenses = ["Apache-2.0".freeze]
41
- s.rubygems_version = "2.7.6".freeze
41
+ s.rubygems_version = "2.7.7".freeze
42
42
  s.summary = "promise_pool is a promise implementation backed by threads or threads pool.".freeze
43
43
  s.test_files = [
44
44
  "test/test_future.rb".freeze,
@@ -95,11 +95,14 @@ describe PromisePool::Promise do
95
95
  would 'work, fulfill, yield' do
96
96
  value = 'body'
97
97
  flag = 0
98
- promise = Promise.new.defer do
98
+ promise = Promise.new
99
+ promise.should.not.started?
100
+ promise.defer do
99
101
  flag.should.eq 0
100
102
  flag += 1
101
103
  value
102
104
  end
105
+ promise.should.started?
103
106
  promise.yield.should.eq value
104
107
  promise.send(:value).should.eq value
105
108
  promise.send(:result).should.eq value
@@ -26,18 +26,27 @@ describe PromisePool::ThreadPool do
26
26
  would 'call in thread pool if pool_size > 0' do
27
27
  flag = 0
28
28
  rd, wr = IO.pipe
29
+ @promise.should.not.started?
30
+ @pool.queue_size.should.eq 0
29
31
  defer do
32
+ @promise.should.started?
33
+ @pool.queue_size.should.eq 1
30
34
  rd.gets
31
35
  flag.should.eq 0
32
36
  flag += 1
33
37
  raise 'nnf'
34
38
  end
39
+ @pool.queue_size.should.eq 1
35
40
  p1 = Promise.new
36
41
  p1.defer(@pool) do # block until promise #0 is done because max_size == 1
42
+ p1.should.started?
43
+ @pool.queue_size.should.eq 0
37
44
  flag.should.eq 1
38
45
  flag += 1
39
46
  raise 'boom'
40
47
  end
48
+ @pool.queue_size.should.eq 2
49
+ p1.should.not.started?
41
50
  wr.puts # start promise #0
42
51
 
43
52
  # even if we're not yielding, the block should still be resolved,
@@ -46,5 +55,6 @@ describe PromisePool::ThreadPool do
46
55
  expect.raise(RuntimeError){ @promise.yield }.message.should.eq 'nnf'
47
56
 
48
57
  flag.should.eq 2
58
+ @pool.queue_size.should.eq 0
49
59
  end
50
60
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: promise_pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-20 00:00:00.000000000 Z
11
+ date: 2018-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: timers
@@ -76,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
76
  version: '0'
77
77
  requirements: []
78
78
  rubyforge_project:
79
- rubygems_version: 2.7.6
79
+ rubygems_version: 2.7.7
80
80
  signing_key:
81
81
  specification_version: 4
82
82
  summary: promise_pool is a promise implementation backed by threads or threads pool.