promise_pool 0.9.1 → 0.9.2

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
  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.