Guest User

Untitled

a guest
Dec 12th, 2012
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. TimerThreadInterval = 1
  2.  
  3. class AsyncTimer
  4. include Singleton
  5. include ClassLevelLogger
  6. include StatsWrapper
  7.  
  8.  
  9. def initialize()
  10. @timers = ThreadSafe::Array.new #<--- array of hashes of timers this Timer class is processing
  11. #<--- hash structure of timer:
  12. # :timer_id #<---- random timer id used later for killing this timer
  13. # :timeout #<---- timeout in seconds from timer start that this timer fires
  14. # :lam_block #<---- lambda block to call when this timer fires
  15. # :event #<---- if we have an event associated with the timer
  16.  
  17. @timer_thread = nil #<--- this is the timer thread processing the timers
  18.  
  19. start_timer_thread
  20. end
  21.  
  22. def execute_timer(timer)
  23. AsyncReactor.instance.add_job lambda {
  24. begin
  25.  
  26. timer[:lam_block].call
  27.  
  28. rescue => err
  29. alert_pop("Fire Timer Execution Error: #{err.message}\n#{err.backtrace}")
  30. end
  31. }
  32. end
  33.  
  34. def execute_interval(timer)
  35. AsyncReactor.instance.add_job lambda {
  36. begin
  37.  
  38. timer[:interval_start] = Time.now.to_i
  39. timer[:interval_block].call if timer[:interval_block]
  40.  
  41. rescue => err
  42. alert_pop("Fire Timer Execution Error: #{err.message}\n#{err.backtrace.join("\n")}")
  43. end
  44. }
  45. end
  46.  
  47. def timer_id()
  48. Time.now.to_i + rand(99999999)
  49. end
  50.  
  51. def kill_timer(timer_id)
  52. index = @timers.find_index{ |ele| ele[:timer_id] == timer_id }
  53. return if !index
  54.  
  55. timer_deleted = @timers.delete_at(index)
  56. debug("Deleted Timer: #{timer_deleted.inspect}")
  57. end
  58.  
  59. def start_timer(timeout, lam_block, event=nil, interval=nil, lam_interval_block=nil)
  60.  
  61. @timers.push( {
  62. :timeout => timeout,
  63. :start_time => Time.now.to_i,
  64. :timer_id => timer_id,
  65. :lam_block => lam_block,
  66. :event => event,
  67. :interval => interval,
  68. :interval_block => lam_interval_block,
  69. :interval_start => Time.now.to_i
  70. } )
  71.  
  72. debug("Added Timer: #{@timers.last.inspect}")
  73.  
  74. @timers.last[:timer_id]
  75.  
  76. end
  77.  
  78. def fire_timer?(timer)
  79. time_now = Time.now.to_i
  80. time_start = timer[:start_time]
  81. diff = ( time_now - time_start )
  82. alert_pop("Got Negative Timer!") if diff.negative?
  83. diff >= timer[:timeout]
  84. end
  85.  
  86. def fire_interval?(timer)
  87. return false if !timer[:interval]
  88. time_now = Time.now.to_i
  89. interval_start = timer[:interval_start]
  90. diff = ( time_now - interval_start )
  91. diff >= timer[:interval]
  92. end
  93.  
  94. def dead_event?(timer)
  95. return false if timer[:event].nil?
  96. return true if !timer[:event].share_id_exists?
  97. false
  98. end
  99.  
  100. def check_timers()
  101. return if @timers.empty?
  102.  
  103. timers_to_fire = @timers.find_all{ |timer| fire_timer?(timer) }
  104. intervals_to_fire = @timers.find_all{ |timer| fire_interval?(timer) }
  105.  
  106. #run our intervals to fire first
  107. intervals_to_fire.each do |timer| execute_interval( timer ) end
  108.  
  109. #fire and delete the timers here
  110. timers_to_fire.each do |timer|
  111. execute_timer( @timers.delete(timer) )
  112. end
  113. end
  114.  
  115. def start_timer_thread()
  116. @timer_thread = Thread.new {
  117. loop do
  118. begin
  119. check_timers()
  120. stat_sharemediator_checked_inc
  121. stat_sharemediator_timers_set(@timers.length)
  122. sleep(TimerThreadInterval)
  123. rescue => err
  124. alert_pop("Main Timer Thread Error : #{err.message}\n#{err.backtrace}")
  125. end
  126. end
  127. }
  128. end
  129. end
Advertisement
Add Comment
Please, Sign In to add comment