polyphony 0.38 → 0.39

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: b952f96f313866e5b61e200093fcb1eb8111b2d48bb2a736e36b62f06772786c
4
- data.tar.gz: 03ffbc7481d3e20cfd5d50cc0c7e1e28749da15a6c9d65c89e83a0370b61b2d2
3
+ metadata.gz: e3be3a6ec277c0c06e1d4b071f7fcee1229bbdde20d6b78b5b585ca9ac5624cd
4
+ data.tar.gz: 27f3e920372dc8ab8e40f07b72444ba08813533e2912c8400fe28ad50ed756c2
5
5
  SHA512:
6
- metadata.gz: 8fb34d135a0ab50a3e3ae722dd3f9ae70ba8ee83534c199f98611f5fa273b424fcedab548929a2dedcdaddec73a9aa6b652fa97a924dd5400155cf57a1cdcaf0
7
- data.tar.gz: caacb6a006f52abf888a9f4a3f1ef2c917a73422abaf1cba7d1ae1b0c7db07a3bc62a5a6b6abbe22e46fd6e679e82d7a048ec2d9ac7ec7dee54453600c688597
6
+ metadata.gz: 6d4267e177eda276b2d643e0262d1475c9f9f0ebaed2dd8573c245127b618dab11b00c05e0ef58ba2f5b8fd88b127feb1cc0f94390e27c66ae8857d0a5eb1a65
7
+ data.tar.gz: 1006b8aa742a9c38bd39512c7f9bfbe3c33b0f07ee1b2e262d8f5f140114066599b9444726c3e9c8cb998326a779da8d14d159ebcf5df226f02eedaa78530f98
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.39 2020-04-13
2
+
3
+ * Prevent timer scheduling a nil fiber
4
+
1
5
  ## 0.38 2020-04-13
2
6
 
3
7
  * Fix post-fork segfault if parent process has multiple threads with active watchers
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- polyphony (0.38)
4
+ polyphony (0.39)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/ext/gyro/timer.c CHANGED
@@ -66,26 +66,28 @@ inline void timer_activate(struct Gyro_Timer *timer) {
66
66
  ev_timer_start(timer->ev_loop, &timer->ev_timer);
67
67
  }
68
68
 
69
- inline void timer_deactivate(struct Gyro_Timer *timer, int non_recurring_only) {
69
+ inline void timer_deactivate(struct Gyro_Timer *timer, int force_deactivate) {
70
70
  if (!timer->active) return;
71
71
 
72
- if (!timer->repeat || !non_recurring_only) {
73
- ev_timer_stop(timer->ev_loop, &timer->ev_timer);
74
- if (RTEST(timer->selector)) {
75
- Gyro_Selector_remove_active_watcher(timer->selector, timer->self);
76
- timer->selector = Qnil;
77
- }
78
- timer->ev_loop = 0;
79
- timer->active = 0;
80
- }
81
-
82
72
  timer->fiber = Qnil;
73
+
74
+ // timer should not be deactivated if
75
+ if (timer->repeat && !force_deactivate) return;
76
+
77
+ ev_timer_stop(timer->ev_loop, &timer->ev_timer);
78
+ if (RTEST(timer->selector)) {
79
+ Gyro_Selector_remove_active_watcher(timer->selector, timer->self);
80
+ timer->selector = Qnil;
81
+ }
82
+ timer->ev_loop = 0;
83
+ timer->active = 0;
83
84
  }
84
85
 
85
86
  void Gyro_Timer_callback(struct ev_loop *ev_loop, struct ev_timer *ev_timer, int revents) {
86
87
  struct Gyro_Timer *timer = (struct Gyro_Timer*)ev_timer;
87
88
 
88
- Fiber_make_runnable(timer->fiber, DBL2NUM(timer->after));
89
+ if (timer->fiber != Qnil)
90
+ Fiber_make_runnable(timer->fiber, DBL2NUM(timer->after));
89
91
  timer_deactivate(timer, 1);
90
92
  }
91
93
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.38'
4
+ VERSION = '0.39'
5
5
  end
data/test/helper.rb CHANGED
@@ -18,6 +18,15 @@ Minitest::Reporters.use! [
18
18
  Minitest::Reporters::SpecReporter.new
19
19
  ]
20
20
 
21
+ module MiniTest::Assertions
22
+ def assert_in_range(range, act)
23
+ msg = message(msg) {
24
+ "Expected #{act.inspect} to be in range #{range.inspect}"
25
+ }
26
+ assert range.include?(act), msg
27
+ end
28
+ end
29
+
21
30
  class MiniTest::Test
22
31
  def setup
23
32
  if Fiber.current.children.size > 0
@@ -106,7 +106,7 @@ class MoveOnAfterTest < MiniTest::Test
106
106
  end
107
107
  t1 = Time.now
108
108
 
109
- assert t1 - t0 < 0.03
109
+ assert_in_range 0..0.03, t1 - t0
110
110
  assert_nil v
111
111
  end
112
112
 
@@ -118,7 +118,7 @@ class MoveOnAfterTest < MiniTest::Test
118
118
  end
119
119
  t1 = Time.now
120
120
 
121
- assert t1 - t0 < 0.02
121
+ assert_in_range 0..0.02, t1 - t0
122
122
  assert_equal :bar, v
123
123
  end
124
124
 
@@ -129,7 +129,7 @@ class MoveOnAfterTest < MiniTest::Test
129
129
  assert_equal Fiber.current, f.parent
130
130
  v = sleep 1
131
131
  t1 = Time.now
132
- assert t1 - t0 < 0.02
132
+ assert_in_range 0..0.02, t1 - t0
133
133
  assert_equal 'foo', v
134
134
  end
135
135
  end
@@ -145,7 +145,7 @@ class CancelAfterTest < MiniTest::Test
145
145
  end
146
146
  end
147
147
  t1 = Time.now
148
- assert t1 - t0 < 0.02
148
+ assert_in_range 0..0.02, t1 - t0
149
149
  end
150
150
 
151
151
  def test_cancel_after_without_block
@@ -157,7 +157,7 @@ class CancelAfterTest < MiniTest::Test
157
157
  sleep 1
158
158
  end
159
159
  t1 = Time.now
160
- assert t1 - t0 < 0.02
160
+ assert_in_range 0..0.02, t1 - t0
161
161
  end
162
162
  end
163
163
 
@@ -204,7 +204,7 @@ class SpinLoopTest < MiniTest::Test
204
204
  f = spin_loop(rate: 50) { buffer << (counter += 1) }
205
205
  sleep 0.1
206
206
  f.stop
207
- assert counter >= 5 && counter <= 6
207
+ assert_in_range 5..6, counter
208
208
  end
209
209
  end
210
210
 
@@ -217,7 +217,7 @@ class ThrottledLoopTest < MiniTest::Test
217
217
  end
218
218
  sleep 0.1
219
219
  f.stop
220
- assert counter >= 5 && counter <= 6
220
+ assert_in_range 5..6, counter
221
221
  end
222
222
 
223
223
  def test_throttled_loop_with_count
@@ -248,14 +248,14 @@ class GlobalAPIEtcTest < MiniTest::Test
248
248
  end
249
249
  sleep 0.05
250
250
  f.stop
251
- assert (4..5).include?(buffer.size)
251
+ assert_in_range 4..5, buffer.size
252
252
  end
253
253
 
254
254
  def test_sleep
255
255
  t0 = Time.now
256
256
  sleep 0.05
257
257
  elapsed = Time.now - t0
258
- assert (0.045..0.08).include? elapsed
258
+ assert_in_range 0.045..0.08, elapsed
259
259
 
260
260
  f = spin { sleep }
261
261
  snooze
data/test/test_io.rb CHANGED
@@ -61,6 +61,13 @@ class IOTest < MiniTest::Test
61
61
  @o.close
62
62
  assert_equal 'foobarbaz', @i.read
63
63
  end
64
+
65
+ def test_big_write
66
+ chunk = '*' * 60000
67
+ @o << chunk
68
+ @o.close
69
+ assert_equal chunk, @i.read
70
+ end
64
71
  end
65
72
 
66
73
  class IOClassMethodsTest < MiniTest::Test
data/test/test_thread.rb CHANGED
@@ -38,7 +38,7 @@ class ThreadTest < MiniTest::Test
38
38
  t0 = Time.now
39
39
  r = t.join(0.01)
40
40
 
41
- assert Time.now - t0 < 0.2
41
+ assert_in_range 0..0.2, Time.now - t0
42
42
  assert_equal [1, 2, 3], buffer
43
43
  assert_nil r
44
44
  ensure
@@ -65,8 +65,8 @@ class ThreadPoolTest < MiniTest::Test
65
65
  end
66
66
  elapsed = Time.now - t0
67
67
 
68
- assert elapsed < 0.007
69
- assert buffer.size < 2
68
+ assert_in_range 0..0.007, elapsed
69
+ assert_in_range 0..1, buffer.size
70
70
 
71
71
  sleep 0.1 # allow time for threads to spawn
72
72
  assert_equal @pool.size, threads.uniq.size
@@ -10,8 +10,7 @@ class ThrottlerTest < MiniTest::Test
10
10
  sleep 0.02
11
11
  f.stop
12
12
  snooze
13
- assert buffer.size >= 2
14
- assert buffer.size <= 3
13
+ assert_in_range 2..3, buffer.size
15
14
  ensure
16
15
  t.stop
17
16
  end
@@ -24,7 +23,7 @@ class ThrottlerTest < MiniTest::Test
24
23
  end
25
24
  sleep 0.25
26
25
  f.stop
27
- assert (2..6).include?(buffer.size)
26
+ assert_in_range 2..6, buffer.size
28
27
  ensure
29
28
  t.stop
30
29
  end
@@ -35,8 +34,7 @@ class ThrottlerTest < MiniTest::Test
35
34
  f = spin { loop { t.process { buffer << 1 } } }
36
35
  sleep 0.02
37
36
  f.stop
38
- assert buffer.size >= 2
39
- assert buffer.size <= 3
37
+ assert_in_range 2..3, buffer.size
40
38
  ensure
41
39
  t.stop
42
40
  end
data/test/test_timer.rb CHANGED
@@ -29,28 +29,4 @@ class TimerTest < MiniTest::Test
29
29
  ensure
30
30
  t.stop
31
31
  end
32
-
33
- def test_that_repeating_timer_compensates_for_drift
34
- count = 0
35
- t = Gyro::Timer.new(0.1, 0.1)
36
- deltas = []
37
- last = nil
38
- spin {
39
- last = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
40
- loop {
41
- t.await
42
- now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
43
- elapsed = (now - last)
44
- deltas << elapsed
45
- last = now
46
- count += 1
47
- sleep 0.05
48
- break if count >= 3
49
- }
50
- }
51
- suspend
52
- assert_equal 0, deltas[1..-1].filter { |d| (d - 0.1).abs >= 0.05 }.size
53
- ensure
54
- t.stop
55
- end
56
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.38'
4
+ version: '0.39'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-13 00:00:00.000000000 Z
11
+ date: 2020-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty