ione 1.2.1 → 1.2.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
  SHA1:
3
- metadata.gz: e616ec4a5f533a25efb171aa4e6ede4b1ca5de6f
4
- data.tar.gz: 433284b5a259cb2db15f8ac95882d13d1e63507a
3
+ metadata.gz: 941fc3fd59d15b806854ddd8ff0f30f645ff51bf
4
+ data.tar.gz: 1b89b672b8b69eda9561138190aed7d35d677538
5
5
  SHA512:
6
- metadata.gz: f80b6f25ac0192d10eac99cc8e2dd15b373944bb89e3125f378ff17df4a7a07caf0f35955e5772b322911560a8dff3cc42704c4c25dc67c952cd8c15269e5c8b
7
- data.tar.gz: 885562d9eb7bb0cd1e6499a0b975fb2d82dee2298918fef4887ca66b5b9d4959c4bdacdd8c2aa2deb2a8e0f44187017dcc44dd9b801a5432bf0888caa720cac9
6
+ metadata.gz: f26209edcf366c70ac80a913901f4c6db5a7a15e2e4a9c53e0d73f99b9d1e25e98bd4f0533dc4e88d3ec846abd538b6f80cb9d877ae547091a363121d1a05992
7
+ data.tar.gz: 6c5565772dd3994caac71ffd2a63cf25f2c595161eeb501928050123c59b5579cf1d5a45ac4a0e585ca15fd9c82b9c7f1253135c2e6f74cf0e9569a89e66d1dc
data/lib/ione/future.rb CHANGED
@@ -226,7 +226,7 @@ module Ione
226
226
  # @param [Array<Ione::Future>] futures the futures to combine (this argument
227
227
  # can be a splatted array or a regular array passed as sole argument)
228
228
  # @return [Ione::Future] with a nil value once all futures have succeeded
229
- # @since v1.3.0
229
+ # @since v1.2.1
230
230
  def after(*futures)
231
231
  if futures.size == 1 && (fs = futures.first).is_a?(Enumerable)
232
232
  *futures = *fs
@@ -850,7 +850,19 @@ module Ione
850
850
  @futures = nil
851
851
  resolve
852
852
  else
853
- @futures.pop.on_complete(&method(:await_next))
853
+ outer = Thread.current
854
+ looping = more = true
855
+ while more
856
+ more = false
857
+ @futures.pop.on_complete do |v, e|
858
+ if e || @futures.empty? || !looping || !Thread.current.equal?(outer)
859
+ await_next(v, e)
860
+ else
861
+ more = true
862
+ end
863
+ end
864
+ end
865
+ looping = false
854
866
  end
855
867
  end
856
868
  end
@@ -145,6 +145,7 @@ module Ione
145
145
 
146
146
  # @private
147
147
  def flush
148
+ should_close = false
148
149
  if @state == CONNECTED_STATE || @state == DRAINING_STATE
149
150
  @lock.lock
150
151
  begin
@@ -154,11 +155,12 @@ module Ione
154
155
  end
155
156
  @writable = !@write_buffer.empty?
156
157
  if @state == DRAINING_STATE && !@writable
157
- close
158
+ should_close = true
158
159
  end
159
160
  ensure
160
161
  @lock.unlock
161
162
  end
163
+ close if should_close
162
164
  end
163
165
  rescue => e
164
166
  close(e)
@@ -153,20 +153,23 @@ module Ione
153
153
  end
154
154
  Thread.start do
155
155
  @started_promise.fulfill(self)
156
+ error = nil
156
157
  begin
157
158
  while @state == RUNNING_STATE
158
159
  @io_loop.tick
159
160
  @scheduler.tick
160
161
  end
162
+ rescue => e
163
+ error = e
161
164
  ensure
162
165
  begin
163
166
  @io_loop.close_sockets
164
167
  @scheduler.cancel_timers
165
168
  @unblocker = nil
166
169
  ensure
167
- if $!
170
+ if error
168
171
  @state = CRASHED_STATE
169
- @stopped_promise.fail($!)
172
+ @stopped_promise.fail(error)
170
173
  else
171
174
  @state = STOPPED_STATE
172
175
  @stopped_promise.fulfill(self)
data/lib/ione/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Ione
4
- VERSION = '1.2.1'.freeze
5
- end
4
+ VERSION = '1.2.2'.freeze
5
+ end
@@ -1047,6 +1047,12 @@ module Ione
1047
1047
  future = Future.after(ff1, ff2, ff3)
1048
1048
  future.value.should be_nil
1049
1049
  end
1050
+
1051
+ it 'handles a really long list of futures' do
1052
+ futures = Array.new(10000, Future.resolved)
1053
+ future = Future.after(futures)
1054
+ future.value.should be_nil
1055
+ end
1050
1056
  end
1051
1057
  end
1052
1058
 
@@ -90,6 +90,13 @@ shared_examples_for 'a connection' do |options|
90
90
  handler.flush
91
91
  f.should be_completed
92
92
  end
93
+
94
+ it 'does not attempt to acquire the lock multiple times from the same thread' do
95
+ handler.write('hello world')
96
+ f = handler.drain
97
+ handler.flush
98
+ expect { f.value }.to_not raise_error
99
+ end
93
100
  end
94
101
 
95
102
  describe '#write/#flush' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ione
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Theo Hultberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-08 00:00:00.000000000 Z
11
+ date: 2015-10-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Reactive programming framework for Ruby, painless evented IO, futures
14
14
  and an efficient byte buffer