@repeat = opts[:repeat] if opts.include? :repeat
if block_given?
- @block = block
+ @block = block
elsif opts[:code]
@block = opts[:code]
end
end
def stop
- raise 'already stopped' unless @thread
+ unless @thread
+ warning 'trying to stop already stopped timer'
+ return
+ end
debug "stopping timer #{self}..."
@stopping = true
self.synchronize { @tick.signal }
end
def run_actions(now = Time.now)
- nxt = nil
@actions.keys.each do |k|
return -1 if @stopping
- a = @actions[k]
- next if (!a) or a.blocked?
-
- if a.next <= now
- begin
- @current = k
- v = a.run(now)
- ensure
- @current = nil
- end
-
- unless v
- @actions.delete k
- next
- end
- else
- v = a.next
+ a = @actions[k] or next
+ next if a.blocked? || a.next > now
+
+ begin
+ @current = k
+ a.run(now)
+ ensure
+ @current = nil
end
- nxt = v if v and ((!nxt) or (v < nxt))
+ @actions.delete k unless a.next
end
+ nxt = @actions.values.find_all { |v| !v.blocked? }.map{ |v| v.next }.min
+
if nxt
delta = nxt - now
delta = 0 if delta < 0