Class: SystemTimer::ConcurrentTimerPool

Inherits:
Object
  • Object
show all
Defined in:
lib/system_timer/concurrent_timer_pool.rb

Instance Method Summary collapse

Instance Method Details

#add_timer(interval_in_seconds) ⇒ Object



17
18
19
20
21
# File 'lib/system_timer/concurrent_timer_pool.rb', line 17

def add_timer(interval_in_seconds)
  new_timer = register_timer(Time.now.to_i + interval_in_seconds, Thread.current)
  log_registered_timers if SystemTimer.debug_enabled?
  new_timer
end

#cancel(registered_timer) ⇒ Object



23
24
25
# File 'lib/system_timer/concurrent_timer_pool.rb', line 23

def cancel(registered_timer)
  registered_timers.delete registered_timer
end

#first_timer?Boolean

Returns:

  • (Boolean)


27
28
29
# File 'lib/system_timer/concurrent_timer_pool.rb', line 27

def first_timer?
  registered_timers.size == 1
end

#log_registered_timersObject

:nodoc:



75
76
77
78
79
# File 'lib/system_timer/concurrent_timer_pool.rb', line 75

def log_registered_timers          #:nodoc:
  puts <<-EOS
        Registered Timers: #{registered_timers.collect do |t| t.to_s end} 
  EOS
end

#log_timeout_received(thread_timer) ⇒ Object

:nodoc:



65
66
67
68
69
70
71
72
73
# File 'lib/system_timer/concurrent_timer_pool.rb', line 65

def log_timeout_received(thread_timer)          #:nodoc:
  puts <<-EOS
    ==== Triger Timer ==== #{thread_timer}
        Main thread  : #{Thread.main}
        Timed_thread : #{thread_timer.thread}
        All Threads  : #{Thread.list.inspect}
  EOS
  log_registered_timers
end

#next_expired_timer(now_in_seconds_since_epoch) ⇒ Object



45
46
47
48
49
50
# File 'lib/system_timer/concurrent_timer_pool.rb', line 45

def next_expired_timer(now_in_seconds_since_epoch)
  candidate_timer = next_timer
  return nil if candidate_timer.nil? || 
                candidate_timer.trigger_time > now_in_seconds_since_epoch
  candidate_timer
end

#next_timerObject



31
32
33
# File 'lib/system_timer/concurrent_timer_pool.rb', line 31

def next_timer
  registered_timers.sort {|x,y| x.trigger_time <=> y.trigger_time}.first
end

#next_trigger_interval_in_secondsObject



40
41
42
43
# File 'lib/system_timer/concurrent_timer_pool.rb', line 40

def next_trigger_interval_in_seconds
  timer = next_timer
  [0, (timer.trigger_time - Time.now.to_i)].max unless timer.nil?
end

#next_trigger_timeObject



35
36
37
38
# File 'lib/system_timer/concurrent_timer_pool.rb', line 35

def next_trigger_time
  timer = next_timer
  timer.trigger_time unless timer.nil?
end

#register_timer(trigger_time, thread) ⇒ Object



11
12
13
14
15
# File 'lib/system_timer/concurrent_timer_pool.rb', line 11

def register_timer(trigger_time, thread)
  new_timer = ThreadTimer.new(trigger_time, thread)
  registered_timers << new_timer
  new_timer
end

#registered_timersObject



7
8
9
# File 'lib/system_timer/concurrent_timer_pool.rb', line 7

def registered_timers
  @timers ||= []
end

#trigger_next_expired_timerObject



61
62
63
# File 'lib/system_timer/concurrent_timer_pool.rb', line 61

def trigger_next_expired_timer
  trigger_next_expired_timer_at Time.now.to_i
end

#trigger_next_expired_timer_at(now_in_seconds_since_epoch) ⇒ Object



52
53
54
55
56
57
58
59
# File 'lib/system_timer/concurrent_timer_pool.rb', line 52

def trigger_next_expired_timer_at(now_in_seconds_since_epoch)
  timer = next_expired_timer(now_in_seconds_since_epoch)
  return if timer.nil?

  cancel timer
  log_timeout_received(timer) if SystemTimer.debug_enabled?
  timer.thread.raise Timeout::Error.new("time's up!")
end