module Redwood
$exception = nil
+def reporting_thread
+ ::Thread.new do
+ begin
+ yield
+ rescue Exception => e
+ $exception ||= e
+ raise
+ end
+ end
+end
+module_function :reporting_thread
global_keymap = Keymap.new do |k|
k.add :quit, "Quit Redwood", 'q'
bm.draw_screen
imode.load_more_threads ibuf.content_height
- ::Thread.new { sleep 3; PollManager.poll }
+ reporting_thread { sleep 3; PollManager.poll }
until $exception
bm.draw_screen
def load_n_threads_background n=LOAD_MORE_THREAD_NUM, opts={}
return if @load_thread
- @load_thread = ::Thread.new do
- begin
- num = load_n_threads n, opts
- opts[:when_done].call(num) if opts[:when_done]
- rescue Exception => e
- $exception ||= e
- raise
- end
+ @load_thread = Redwood::reporting_thread do
+ num = load_n_threads n, opts
+ opts[:when_done].call(num) if opts[:when_done]
@load_thread = nil
end
end
self.class.i_am_the_instance self
- ::Thread.new do
+ Redwood::reporting_thread do
while true
sleep DELAY / 2
- if @last_poll.nil? || (Time.now - @last_poll) >= DELAY
- poll
- end
+ poll if @last_poll.nil? || (Time.now - @last_poll) >= DELAY
end
end
end
found = {}
total_num = 0
total_numi = 0
+
Index.usual_sources.each do |source|
next if source.done?
yield "Loading from #{source}... "
m = Redwood::Message.new :source => source, :source_info => offset,
:labels => labels
if found[m.id]
- yield "Skipping duplicate message #{m.id} (source total #{source.total})"
+ yield "Skipping duplicate message #{m.id}"
next
else
found[m.id] = true
if num % 1000 == 0 && num > 0
elapsed = Time.now - start
pctdone = (offset.to_f - start_offset) / (source.total.to_f - start_offset)
- remaining = (source.total.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset))
+ remaining = (source.end_offset.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset))
yield "## #{num} (#{(pctdone * 100.0)}% done) read; #{elapsed.to_time_s} elapsed; est. #{remaining.to_time_s} remaining"
end
end