about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2010-10-07 19:56:57 -0700
committerEric Wong <e@yhbt.net>2010-10-07 19:56:57 -0700
commit2152188f41bf2a5067e84a4404b48b2282a9dd55 (patch)
treeb3a0dd06dd537e9a1e48138b63c1d8c5a43b51fd
parentc448ad898ecb7f354a32a320294da4727fc9af52 (diff)
downloadkgio-2152188f41bf2a5067e84a4404b48b2282a9dd55.tar.gz
Oops!
-rw-r--r--ext/kgio/read_write.c2
-rw-r--r--test/lib_read_write.rb37
2 files changed, 38 insertions, 1 deletions
diff --git a/ext/kgio/read_write.c b/ext/kgio/read_write.c
index 47160d6..0ee7866 100644
--- a/ext/kgio/read_write.c
+++ b/ext/kgio/read_write.c
@@ -233,7 +233,7 @@ done:
                                 a->ptr = RSTRING_PTR(a->buf) + written;
                                 return -1;
                         } else if (written > 0) {
-                                a->buf = rb_str_new(a->ptr + n, a->len - n);
+                                a->buf = rb_str_new(a->ptr, a->len);
                         } else {
                                 a->buf = mKgio_WaitWritable;
                         }
diff --git a/test/lib_read_write.rb b/test/lib_read_write.rb
index 146c222..e147566 100644
--- a/test/lib_read_write.rb
+++ b/test/lib_read_write.rb
@@ -1,5 +1,7 @@
+# -*- encoding: binary -*-
 require 'test/unit'
 require 'io/nonblock'
+require 'digest/sha1'
 $-w = true
 require 'kgio'
 
@@ -58,6 +60,41 @@ module LibReadWriteTest
     assert false, "should never get here (line:#{__LINE__})"
   end
 
+  def test_trywrite_full
+    buf = "\302\251" * 1024 * 1024
+    buf2 = ""
+    dig = Digest::SHA1.new
+    t = Thread.new do
+      sleep 1
+      nr = 0
+      begin
+        dig.update(@rd.readpartial(4096, buf2))
+        nr += buf2.size
+      rescue EOFError
+        break
+      rescue => e
+      end while true
+      dig.hexdigest
+    end
+    50.times do
+      wr = buf
+      begin
+        rv = @wr.kgio_trywrite(wr)
+        case rv
+        when String
+          wr = rv
+        when Kgio::WaitWritable
+          IO.select(nil, [ @wr ])
+        else
+          wr = false
+        end
+      end while wr
+    end
+    @wr.close
+    t.join
+    assert_equal '8ff79d8115f9fe38d18be858c66aa08a1cc27a66', t.value
+  end
+
   def test_write_conv
     assert_equal nil, @wr.kgio_write(10)
     assert_equal "10", @rd.kgio_read(2)