about summary refs log tree commit homepage
path: root/lib/dtas/writable_iter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dtas/writable_iter.rb')
-rw-r--r--lib/dtas/writable_iter.rb16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/dtas/writable_iter.rb b/lib/dtas/writable_iter.rb
index 1fd65eb..2355352 100644
--- a/lib/dtas/writable_iter.rb
+++ b/lib/dtas/writable_iter.rb
@@ -4,9 +4,24 @@ require_relative '../dtas'
 
 module DTAS::WritableIter # :nodoc:
   attr_accessor :on_writable
+  # we may use the ready_write flag to avoid an extra IO.select
+  attr_accessor :ready_write
 
   def writable_iter_init
+    @mark_writable = proc { @ready_write = true }
     @on_writable = nil
+    @ready_write = true
+  end
+
+  def ready_write_optimized?
+    rv = @ready_write
+    @ready_write = false
+    rv
+  end
+
+  def wait_writable_prepare
+    @ready_write = false
+    @on_writable ||= @mark_writable
   end
 
   # this is used to exchange our own writable status for the readable
@@ -14,6 +29,7 @@ module DTAS::WritableIter # :nodoc:
   def writable_iter
     if owr = @on_writable
       @on_writable = nil
+      @ready_write = true
       owr.call # this triggers readability watching of DTAS::Buffer
     end
     :ignore