everything related to duct tape audio suite (dtas)
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: dtas-all@nongnu.org
Subject: [PATCH 1/2] buffer/splice: prepare for IO::Splice::WAITALL removal
Date: Wed, 18 Feb 2015 22:23:48 +0000	[thread overview]
Message-ID: <1424298229-17600-1-git-send-email-e@80x24.org> (raw)

This feature in the io_splice was probably a bad idea
and slated for removal at some point in the future.
Anyways, do not rely on it since it is undocumented.
---
 lib/dtas/buffer/splice.rb | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/lib/dtas/buffer/splice.rb b/lib/dtas/buffer/splice.rb
index c83b87b..b987f3a 100644
--- a/lib/dtas/buffer/splice.rb
+++ b/lib/dtas/buffer/splice.rb
@@ -12,7 +12,6 @@ module DTAS::Buffer::Splice # :nodoc:
   MAX_SIZE = File.read("/proc/sys/fs/pipe-max-size").to_i
   DEVNULL = File.open("/dev/null", "r+")
   F_MOVE = IO::Splice::F_MOVE
-  WAITALL = IO::Splice::WAITALL
 
   def buffer_size
     @to_io.pipe_size
@@ -44,6 +43,26 @@ def broadcast_one(targets)
     nil # do not return error here, we already spewed an error message
   end
 
+  def __tee_in_full(src, dst, bytes)
+    rv = 0
+    while bytes > 0
+      s = IO.tee(src, dst, bytes)
+      bytes -= s
+      rv += s
+    end
+    rv
+  end
+
+  def __splice_in_full(src, dst, bytes, flags)
+    rv = 0
+    while bytes > 0
+      s = IO.splice(src, nil, dst, nil, bytes, flags)
+      rv += s
+      bytes -= s
+    end
+    rv
+  end
+
   # returns the largest value we teed
   def __broadcast_tee(blocked, targets, chunk_size)
     most_teed = 0
@@ -51,7 +70,7 @@ def __broadcast_tee(blocked, targets, chunk_size)
       begin
         t = (dst.nonblock? || most_teed == 0) ?
             IO.trytee(@to_io, dst, chunk_size) :
-            IO.tee(@to_io, dst, chunk_size, WAITALL)
+            __tee_in_full(@to_io, dst, chunk_size)
         if Integer === t
           if t > most_teed
             chunk_size = t if most_teed == 0
@@ -117,7 +136,7 @@ def broadcast_inf(targets)
         end
       else
         # the blocking case is simple
-        s = IO.splice(@to_io, nil, last, nil, bytes, WAITALL|F_MOVE)
+        s = __splice_in_full(@to_io, last, bytes, F_MOVE)
       end
       @bytes_xfer += s
 
-- 
EW



             reply	other threads:[~2015-02-18 22:53 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-18 22:23 Eric Wong [this message]
2015-02-18 22:23 ` [PATCH 2/2] buffer: allow limiting the amount of bytes output Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://80x24.org/dtas/README

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1424298229-17600-1-git-send-email-e@80x24.org \
    --to=e@80x24.org \
    --cc=dtas-all@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/dtas.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).