fsevent 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fsevent.gemspec +1 -1
- data/lib/fsevent/framework.rb +30 -13
- data/lib/fsevent/schedulemerger.rb +6 -0
- data/test/test_failsafedevice.rb +1 -1
- data/test/test_framework.rb +63 -1
- data/test/test_watch.rb +2 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c80e06a6aa6324c5a9d77f57fea9c837d34c335c
|
4
|
+
data.tar.gz: 0522ec2031f9b54b06719c7c97dc7d6fb7d5a31c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 655e1f86025488fa852eadb61f5df04c604d062e7aa2e7019e9b12c2b2919b92489c4f3d132b923fd10d9eacdde7815fa7b443842c89f38e3686cd63cfe04dba
|
7
|
+
data.tar.gz: b1f09c8e4526f7c1c0550a2d623d72469312ce0ce916098b20a7f13ba4f4de38a9f7d963ef6f13f58d69d911cacb36eb8ef1199172ce03760ce6a9b0dff233b1
|
data/fsevent.gemspec
CHANGED
data/lib/fsevent/framework.rb
CHANGED
@@ -51,8 +51,7 @@ class FSEvent
|
|
51
51
|
raise ArgumentError, "invalid device name: #{device_name.inspect}"
|
52
52
|
end
|
53
53
|
if !Thread.current[:fsevent_buffer]
|
54
|
-
|
55
|
-
@schedule_locator[device_name] = @q.insert value, @current_time
|
54
|
+
internal_register_device(device_name, device)
|
56
55
|
else
|
57
56
|
value = [:register_device, device_name, device]
|
58
57
|
Thread.current[:fsevent_buffer] << value
|
@@ -185,7 +184,7 @@ class FSEvent
|
|
185
184
|
private :at_register_end
|
186
185
|
|
187
186
|
def at_run_start(loc, device_name)
|
188
|
-
time =
|
187
|
+
time = @current_time
|
189
188
|
device = @devices[device_name]
|
190
189
|
|
191
190
|
watched_status, changed_status = notifications(device_name, @device_last_run_count[device_name])
|
@@ -224,7 +223,7 @@ class FSEvent
|
|
224
223
|
|
225
224
|
def at_run_end(loc, device_name, run_start_count, buffer)
|
226
225
|
@device_last_run_count[device_name] = run_start_count
|
227
|
-
run_end_time =
|
226
|
+
run_end_time = @current_time
|
228
227
|
|
229
228
|
wakeup_immediate = false
|
230
229
|
unregister_self = false
|
@@ -242,7 +241,7 @@ class FSEvent
|
|
242
241
|
when :del_watch
|
243
242
|
internal_del_watch(device_name, *rest)
|
244
243
|
when :register_device
|
245
|
-
internal_register_device(
|
244
|
+
internal_register_device(*rest)
|
246
245
|
when :unregister_device
|
247
246
|
unregister_self |= internal_unregister_device(device_name, *rest)
|
248
247
|
else
|
@@ -257,10 +256,11 @@ class FSEvent
|
|
257
256
|
end
|
258
257
|
private :at_run_end
|
259
258
|
|
260
|
-
def internal_register_device(
|
259
|
+
def internal_register_device(target_device_name, device)
|
261
260
|
value = [:register_start, target_device_name, device]
|
262
261
|
@schedule_locator[target_device_name] = @q.insert value, @current_time
|
263
262
|
end
|
263
|
+
private :internal_register_device
|
264
264
|
|
265
265
|
def internal_define_status(device_name, run_end_time, status_name, value)
|
266
266
|
internal_define_status2(device_name, run_end_time, status_name, value)
|
@@ -293,7 +293,11 @@ class FSEvent
|
|
293
293
|
@status_time[device_name][status_name] = @current_time
|
294
294
|
@status_count[device_name][status_name] = @current_count
|
295
295
|
lookup_watchers(device_name, status_name).each {|watcher_device_name, reaction|
|
296
|
-
|
296
|
+
if reaction_immediate_at_beginning? reaction
|
297
|
+
if watcher_device_name != device_name
|
298
|
+
set_wakeup_if_possible(watcher_device_name, run_end_time)
|
299
|
+
end
|
300
|
+
end
|
297
301
|
}
|
298
302
|
end
|
299
303
|
private :internal_define_status2
|
@@ -314,7 +318,11 @@ class FSEvent
|
|
314
318
|
@status_time[device_name][status_name] = @current_time
|
315
319
|
@status_count[device_name][status_name] = @current_count
|
316
320
|
lookup_watchers(device_name, status_name).each {|watcher_device_name, reaction|
|
317
|
-
|
321
|
+
if watcher_device_name != device_name
|
322
|
+
if reaction_immediate_at_subsequent? reaction
|
323
|
+
set_wakeup_if_possible(watcher_device_name, run_end_time)
|
324
|
+
end
|
325
|
+
end
|
318
326
|
}
|
319
327
|
end
|
320
328
|
private :internal_modify_status2
|
@@ -330,7 +338,11 @@ class FSEvent
|
|
330
338
|
@status_time[device_name][status_name] = @current_time
|
331
339
|
@status_count[device_name][status_name] = @current_count
|
332
340
|
lookup_watchers(device_name, status_name).each {|watcher_device_name, reaction|
|
333
|
-
|
341
|
+
if watcher_device_name != device_name
|
342
|
+
if reaction_immediate_at_subsequent? reaction
|
343
|
+
set_wakeup_if_possible(watcher_device_name, run_end_time)
|
344
|
+
end
|
345
|
+
end
|
334
346
|
}
|
335
347
|
internal_update_status(device_name, run_end_time, "_status_undefined_#{status_name}", run_end_time)
|
336
348
|
end
|
@@ -407,8 +419,13 @@ class FSEvent
|
|
407
419
|
end
|
408
420
|
case event_type = loc.value.first
|
409
421
|
when :run_start # The device is sleeping now.
|
410
|
-
if time
|
411
|
-
loc.
|
422
|
+
if time != loc.priority
|
423
|
+
if time < loc.priority
|
424
|
+
@devices[device_name].schedule.merge_schedule([loc.priority])
|
425
|
+
loc.update_priority time
|
426
|
+
else
|
427
|
+
@devices[device_name].schedule.merge_schedule([time])
|
428
|
+
end
|
412
429
|
end
|
413
430
|
when :run_end # The device is working now.
|
414
431
|
# Nothing to do. at_run_end itself checks arrived events at last.
|
@@ -424,10 +441,10 @@ class FSEvent
|
|
424
441
|
if wakeup_immediate
|
425
442
|
run_start_time = run_end_time
|
426
443
|
elsif run_start_time = device.schedule.shift
|
427
|
-
if run_start_time
|
444
|
+
if run_start_time <= run_end_time
|
428
445
|
run_start_time = run_end_time
|
429
446
|
end
|
430
|
-
while device.schedule.first && device.schedule.first
|
447
|
+
while device.schedule.first && device.schedule.first <= run_end_time
|
431
448
|
device.schedule.shift
|
432
449
|
end
|
433
450
|
end
|
data/test/test_failsafedevice.rb
CHANGED
@@ -24,7 +24,7 @@ class TestFSEventFailSafeDevice < Test::Unit::TestCase
|
|
24
24
|
super device_name
|
25
25
|
@init = init
|
26
26
|
@elapsed = 1
|
27
|
-
@schedule
|
27
|
+
@schedule.merge_schedule pairs.map {|t, v| t-@elapsed }
|
28
28
|
@values = pairs.map {|t, v| v }
|
29
29
|
@test_result = []
|
30
30
|
end
|
data/test/test_framework.rb
CHANGED
@@ -80,7 +80,7 @@ class TestFSEventFramework < Test::Unit::TestCase
|
|
80
80
|
device.schedule.merge_schedule(schedule)
|
81
81
|
def device.run(watched_status, changed_status)
|
82
82
|
@test_result << @framework.current_time
|
83
|
-
@schedule
|
83
|
+
@schedule.clear if 2 < @test_result.length
|
84
84
|
end
|
85
85
|
fsevent.register_device(device)
|
86
86
|
assert_nothing_raised { fsevent.start }
|
@@ -340,4 +340,66 @@ class TestFSEventFramework < Test::Unit::TestCase
|
|
340
340
|
assert_equal([t+20], result)
|
341
341
|
end
|
342
342
|
|
343
|
+
def test_too_long_run
|
344
|
+
t = Time.utc(2000)
|
345
|
+
fse = FSEvent.new(t)
|
346
|
+
result = []
|
347
|
+
d1 = FSEvent::SimpleDevice.new("d2", {}, [], 1, [t+10, t+20, t+30]) {|watched_status, changed_status|
|
348
|
+
fse.set_elapsed_time(15)
|
349
|
+
result << fse.current_time
|
350
|
+
}
|
351
|
+
fse.register_device d1
|
352
|
+
fse.start
|
353
|
+
assert_equal([t+10, t+25, t+40], result)
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_too_long_run_2
|
357
|
+
t = Time.utc(2000)
|
358
|
+
fse = FSEvent.new(t)
|
359
|
+
result = []
|
360
|
+
d1 = FSEvent::SimpleDevice.new("d2", {}, [], 1, [t+10, t+20, t+30]) {|watched_status, changed_status|
|
361
|
+
fse.set_elapsed_time(25)
|
362
|
+
result << fse.current_time
|
363
|
+
}
|
364
|
+
fse.register_device d1
|
365
|
+
fse.start
|
366
|
+
assert_equal([t+10, t+35], result)
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_immediate_and_scheduled_event
|
370
|
+
t = Time.utc(2000)
|
371
|
+
fse = FSEvent.new(t)
|
372
|
+
d1 = FSEvent::SimpleDevice.new("d1", {"s"=>0}, [], 0, [t+10]) {|watched_status, changed_status|
|
373
|
+
fse.modify_status("s", 1)
|
374
|
+
fse.set_elapsed_time(10)
|
375
|
+
}
|
376
|
+
result = []
|
377
|
+
d2 = FSEvent::SimpleDevice.new("d2", {}, [["d1", "s", :immediate]], 0, [t+300]) {|watched_status, changed_status|
|
378
|
+
fse.set_elapsed_time(0)
|
379
|
+
result << fse.current_time
|
380
|
+
}
|
381
|
+
fse.register_device d1
|
382
|
+
fse.register_device d2
|
383
|
+
fse.start
|
384
|
+
assert_equal([t, t+20, t+300], result)
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_self_watch
|
388
|
+
t = Time.utc(2000)
|
389
|
+
fse = FSEvent.new(t)
|
390
|
+
result = []
|
391
|
+
n = 0
|
392
|
+
d1 = FSEvent::SimpleDevice.new("d1", {"s"=>n}, [["d1", "s", :immediate]], 0, []) {|watched_status, changed_status|
|
393
|
+
result << fse.current_time
|
394
|
+
if n < 4
|
395
|
+
n += 1
|
396
|
+
fse.modify_status("s", n)
|
397
|
+
end
|
398
|
+
fse.set_elapsed_time(4)
|
399
|
+
}
|
400
|
+
fse.register_device d1
|
401
|
+
fse.start
|
402
|
+
assert_equal([t, t+4, t+8, t+12, t+16], result)
|
403
|
+
end
|
404
|
+
|
343
405
|
end
|
data/test/test_watch.rb
CHANGED