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, exception_class = nil) ⇒ Object



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

def add_timer(interval_in_seconds, exception_class=nil)
  new_timer = register_timer(Time.now.to_f + interval_in_seconds, Thread.current, exception_class)
  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:



81
82
83
84
85
# File 'lib/system_timer/concurrent_timer_pool.rb', line 81

def log_registered_timers          #:nodoc:
  puts <<-EOS
        Registered Timers: #{registered_timers.map {|t| t.to_s}.join("\n                               ")}
  EOS
end

#log_timeout_received(thread_timer) ⇒ Object

:nodoc:



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

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
51
52
53
54
# File 'lib/system_timer/concurrent_timer_pool.rb', line 45

def next_expired_timer(now_in_seconds_since_epoch)
  candidate_timer = next_timer
  if SystemTimer.debug_enabled?
    puts "Candidate timer at #{now_in_seconds_since_epoch} : " +
         candidate_timer.inspect
  end
  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_f)].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, exception_class = nil) ⇒ Object



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

def register_timer(trigger_time, thread, exception_class=nil)
  new_timer = ThreadTimer.new(trigger_time, thread, exception_class)
  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



66
67
68
69
# File 'lib/system_timer/concurrent_timer_pool.rb', line 66

def trigger_next_expired_timer
  puts "Trigger next expired timer" if SystemTimer.debug_enabled?
  trigger_next_expired_timer_at Time.now.to_f
end

#trigger_next_expired_timer_at(now_in_seconds_since_epoch) ⇒ Object



56
57
58
59
60
61
62
63
64
# File 'lib/system_timer/concurrent_timer_pool.rb', line 56

def trigger_next_expired_timer_at(now_in_seconds_since_epoch)
  timer = next_expired_timer(now_in_seconds_since_epoch)
  puts "Next expired timer : #{timer.inspect}" if SystemTimer.debug_enabled?
  return if timer.nil?

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