sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
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:
M lib/sup/modes/line-cursor-mode.rb | 34 +++++++++++++++++-----------------
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