uv-rays 0.2.5 → 0.2.6

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: 62df253a515b6fc5dc5168365ffaccc6341e9432
4
- data.tar.gz: 34ece239ae56c171c8a125656ba701b3fc66a9c6
3
+ metadata.gz: 11a2e081253e15248cae96c1f6ddeff70c72898e
4
+ data.tar.gz: d8eb1fec708fcdc68a2fb2d4a09a08e2a5e77c9b
5
5
  SHA512:
6
- metadata.gz: 714f784bf6f21ad6b8098c451564d775e9328bb0a21dc196dfdb9321b50ea31212ea2be292f20515540d5db5a38c93cbfe2ef993345dc4fbdece3a68a6f6ff03
7
- data.tar.gz: c9f9ab7c2fef8a1c0ec1b948f1292f001fd1d2c03727d497ba013423e3dfa6d70bf7e6226a04ff3d9eb3467e3cb2ffcae727e3c9ac1886d745739176bc23fb18
6
+ metadata.gz: 0cb78756f4aa14503eed42df13a0a0cf0b2c1ff69e44ebb6d2104924fdeabb8184937e68b84cb68b85d789ba51bec1088c8e43e40ab22c783f885a23fd0940d7
7
+ data.tar.gz: e0a26a535f56e79edc480624c41a64d251b6ff92d206d6ded3ce9fdac412886785bbc32dfd1b441547dc94f184e26a9af7303b850c41a843edb61c9abda1a94c
@@ -2,6 +2,8 @@
2
2
  module UV
3
3
 
4
4
  class ScheduledEvent < ::Libuv::Q::DeferredPromise
5
+ # Note:: Comparable should not effect Hashes
6
+ # it will however effect arrays
5
7
  include Comparable
6
8
 
7
9
  attr_reader :created
@@ -26,8 +28,15 @@ module UV
26
28
 
27
29
  # Provide relevant inspect information
28
30
  def inspect
29
- "#<#{self.class}:0x#{self.__id__.to_s(16)} next_scheduled=#{@next_scheduled} trigger_count=#{@trigger_count} last_scheduled=#{@last_scheduled} created=#{@created}>"
31
+ insp = "#<#{self.class}:0x#{self.__id__.to_s(16)} "
32
+ insp << "trigger_count=#{@trigger_count} "
33
+ insp << "config=#{info} " if self.respond_to?(:info, true)
34
+ insp << "next_scheduled=#{@next_scheduled} "
35
+ insp << "last_scheduled=#{@last_scheduled} created=#{@created}>"
36
+ insp
30
37
  end
38
+ alias_method :to_s, :inspect
39
+
31
40
 
32
41
  # required for comparable
33
42
  def <=>(anOther)
@@ -56,7 +65,6 @@ module UV
56
65
  # Updates the scheduled time
57
66
  def update(time)
58
67
  @last_scheduled = @loop.now
59
-
60
68
 
61
69
  parsed_time = Scheduler.parse_in(time, :quiet)
62
70
  if parsed_time.nil?
@@ -106,6 +114,7 @@ module UV
106
114
  # can be used to reset a repeating timer
107
115
  def resume
108
116
  @paused = false
117
+ @last_scheduled = @loop.now
109
118
  reschedule
110
119
  end
111
120
 
@@ -134,11 +143,15 @@ module UV
134
143
  end
135
144
 
136
145
  def reschedule
137
- if not @paused
146
+ unless @paused
138
147
  next_time
139
148
  @scheduler.reschedule(self)
140
149
  end
141
150
  end
151
+
152
+ def info
153
+ "repeat:#{@every}"
154
+ end
142
155
  end
143
156
 
144
157
 
@@ -156,6 +169,9 @@ module UV
156
169
  @timer = nil # Reference to the timer
157
170
  @timer_callback = method(:on_timer)
158
171
 
172
+ # Not really required when used correctly
173
+ @critical = Mutex.new
174
+
159
175
  # as the libuv time is taken from an arbitrary point in time we
160
176
  # need to roughly synchronize between it and ruby's Time.now
161
177
  @loop.update_time
@@ -238,41 +254,60 @@ module UV
238
254
  # Check promise is not resolved
239
255
  return if event.resolved?
240
256
 
241
- # Remove the event from the scheduled list and ensure it is in the schedules set
242
- if @schedules.include?(event)
243
- @scheduled.delete(event)
244
- else
245
- @schedules << event
246
- end
247
- @next = nil if @next == event
257
+ @critical.synchronize {
258
+ # Remove the event from the scheduled list and ensure it is in the schedules set
259
+ if @schedules.include?(event)
260
+ remove(event)
261
+ else
262
+ @schedules << event
263
+ end
264
+ @next = nil if @next == event
248
265
 
249
- # optimal algorithm for inserting into an already sorted list
250
- Bisect.insort(@scheduled, event)
266
+ # optimal algorithm for inserting into an already sorted list
267
+ Bisect.insort(@scheduled, event)
251
268
 
252
- # Update the timer
253
- check_timer
269
+ # Update the timer
270
+ check_timer
271
+ }
254
272
  end
255
273
 
256
274
  # Removes an event from the schedule
257
275
  #
258
276
  # @param event [ScheduledEvent]
259
277
  def unschedule(event)
260
- # Only call delete and update the timer when required
261
- if @schedules.include?(event)
262
- @schedules.delete(event)
263
- @scheduled.delete(event)
264
- check_timer
265
- end
278
+ @critical.synchronize {
279
+ # Only call delete and update the timer when required
280
+ if @schedules.include?(event)
281
+ @schedules.delete(event)
282
+ remove(event)
283
+ check_timer
284
+ end
285
+ }
266
286
  end
267
287
 
268
288
 
269
289
  private
270
290
 
271
291
 
292
+ # Remove an element from the array
293
+ def remove(obj)
294
+ position = nil
295
+
296
+ @scheduled.each_index do |i|
297
+ # object level comparison
298
+ if obj.equal? @scheduled[i]
299
+ position = i
300
+ break
301
+ end
302
+ end
303
+
304
+ @scheduled.slice!(position) unless position.nil?
305
+ end
306
+
272
307
  # First time schedule we want to bind to the promise
273
308
  def schedule(event)
274
309
  reschedule(event)
275
-
310
+
276
311
  event.finally do
277
312
  unschedule event
278
313
  end
@@ -288,7 +323,7 @@ module UV
288
323
  if existing != @next
289
324
  # lazy load the timer
290
325
  if @timer.nil?
291
- @timer = @loop.timer @timer_callback
326
+ new_timer
292
327
  else
293
328
  @timer.stop
294
329
  end
@@ -309,19 +344,32 @@ module UV
309
344
 
310
345
  # Is called when the libuv timer fires
311
346
  def on_timer
312
- schedule = @scheduled.shift
313
- @schedules.delete(schedule)
314
- schedule.trigger
315
-
316
- # execute schedules that are within 30ms of this event
317
- # Basic timer coalescing..
318
- now = @loop.now + 30
319
- while @scheduled.first && @scheduled.first.next_scheduled <= now
347
+ @critical.synchronize {
320
348
  schedule = @scheduled.shift
321
349
  @schedules.delete(schedule)
322
350
  schedule.trigger
351
+
352
+ # execute schedules that are within 30ms of this event
353
+ # Basic timer coalescing..
354
+ now = @loop.now + 30
355
+ while @scheduled.first && @scheduled.first.next_scheduled <= now
356
+ schedule = @scheduled.shift
357
+ @schedules.delete(schedule)
358
+ schedule.trigger
359
+ end
360
+ check_timer
361
+ }
362
+ end
363
+
364
+ # Provide some assurances on timer failure
365
+ def new_timer
366
+ @timer = @loop.timer @timer_callback
367
+ @timer.finally do
368
+ new_timer
369
+ unless @next.nil?
370
+ @timer.start(@next)
371
+ end
323
372
  end
324
- check_timer
325
373
  end
326
374
  end
327
375
  end
@@ -1,3 +1,3 @@
1
1
  module UV
2
- VERSION = '0.2.5'
2
+ VERSION = '0.2.6'
3
3
  end
@@ -32,7 +32,8 @@ describe UV::Scheduler do
32
32
  expect(@general_failure).to eq([])
33
33
  expect(@event).to eq(@result)
34
34
  @diff = @triggered_at - @event.last_scheduled
35
- expect((@diff >= 500 && @diff < 750)).to eq(true)
35
+ expect(@diff).to be >= 500
36
+ expect(@diff).to be < 750
36
37
  end
37
38
 
38
39
  it "should be able to schedule a one shot event using 'at'" do
@@ -55,7 +56,8 @@ describe UV::Scheduler do
55
56
  expect(@general_failure).to eq([])
56
57
  expect(@event).to eq(@result)
57
58
  @diff = @triggered_at - @event.last_scheduled
58
- expect((@diff >= 1000 && @diff < 1250)).to eq(true)
59
+ expect(@diff).to be >= 1000
60
+ expect(@diff).to be < 1250
59
61
  end
60
62
 
61
63
  it "should be able to schedule a repeat event" do
@@ -73,6 +75,10 @@ describe UV::Scheduler do
73
75
  @triggered_at = triggered
74
76
  @result = event
75
77
 
78
+ diff = triggered - event.last_scheduled
79
+ expect(diff).to be >= 250
80
+ expect(diff).to be < 500
81
+
76
82
  @run += 1
77
83
  if @run == 2
78
84
  @event.pause
@@ -84,7 +90,53 @@ describe UV::Scheduler do
84
90
  expect(@general_failure).to eq([])
85
91
  expect(@run).to eq(2)
86
92
  expect(@event).to eq(@result)
87
- @diff = @triggered_at - @event.last_scheduled
88
- expect((@diff >= 250 && @diff < 500)).to eq(true)
93
+ end
94
+
95
+ it "should be able to cancel an event" do
96
+ # Also tests events run in order of scheduled
97
+ # Also tests events are not inadvertently canceled by other test
98
+ @loop.run { |logger|
99
+ logger.progress do |level, errorid, error|
100
+ begin
101
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n")}\n"
102
+ rescue Exception
103
+ @general_failure << 'error in logger'
104
+ end
105
+ end
106
+
107
+ @triggered = []
108
+
109
+ @event1 = @scheduler.in('0.5s') do |triggered, event|
110
+ @triggered << 1
111
+ end
112
+
113
+ @event2 = @scheduler.in('0.5s') do |triggered, event|
114
+ @triggered << 2
115
+ end
116
+
117
+ @event3 = @scheduler.in('0.5s') do |triggered, event|
118
+ @triggered << 3
119
+ @loop.stop
120
+ end
121
+
122
+ @scheduled, @schedules = @scheduler.instance_eval {
123
+ [@scheduled, @schedules]
124
+ }
125
+
126
+ expect(@scheduled.size).to eq(3)
127
+ expect(@schedules.size).to eq(3)
128
+
129
+ @event2.cancel
130
+
131
+ @loop.next_tick do
132
+ expect(@scheduled.size).to eq(2)
133
+ expect(@schedules.size).to eq(2)
134
+ end
135
+ }
136
+
137
+ expect(@general_failure).to eq([])
138
+ expect(@triggered).to eq([1, 3])
139
+ expect(@scheduled.size).to eq(0)
140
+ expect(@schedules.size).to eq(0)
89
141
  end
90
142
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uv-rays
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen von Takach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-16 00:00:00.000000000 Z
11
+ date: 2014-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: libuv