From: William Morgan Date: Thu, 3 Sep 2009 17:49:17 +0000 (-0400) Subject: make load-more callbacks use a queue and be thread-safe X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=a7b5e3306121f470c2c57197d3ab5e65e6fa35ed;p=sup make load-more callbacks use a queue and be thread-safe Replaced previous insane implementation with something that actually makes sense. --- diff --git a/lib/sup/modes/line-cursor-mode.rb b/lib/sup/modes/line-cursor-mode.rb index 0b1fd1d..51a5913 100644 --- a/lib/sup/modes/line-cursor-mode.rb +++ b/lib/sup/modes/line-cursor-mode.rb @@ -15,11 +15,24 @@ class LineCursorMode < ScrollMode def initialize opts={} @cursor_top = @curpos = opts.delete(:skip_top_rows) || 0 @load_more_callbacks = [] - @load_more_callbacks_m = Mutex.new - @load_more_callbacks_active = false + @load_more_q = Queue.new + @load_more_thread = ::Thread.new do + while true + e = @load_more_q.pop + debug "calling callbacks on #{e.inspect}" + @load_more_callbacks.each { |c| c.call e } + end + end + super opts end + def cleanup + @load_more_thread.kill + debug "killing thread" + super + end + def draw super set_status @@ -163,21 +176,8 @@ private end def call_load_more_callbacks size - go = - @load_more_callbacks_m.synchronize do - if @load_more_callbacks_active - false - else - @load_more_callbacks_active = true - end - end - - return unless go - - @load_more_callbacks.each { |c| c.call size } - @load_more_callbacks_active = false - end - + @load_more_q.push size + end end end