commit a7b5e3306121f470c2c57197d3ab5e65e6fa35ed
parent 0646c7e1688bf8755e5eb1a97dfa2d787acd1204
Author: William Morgan <wmorgan-sup@masanjin.net>
Date: Thu, 3 Sep 2009 13:49:17 -0400
make load-more callbacks use a queue and be thread-safe
Replaced previous insane implementation with something that actually
makes sense.
Diffstat:
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git 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