kgio RubyGem user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Eric Wong <normalperson@yhbt.net>
To: kgio@librelist.org
Subject: [PATCH 2/3] autopush: fix/enable under Debian GNU/kFreeBSD
Date: Mon,  5 Mar 2012 23:47:09 +0000	[thread overview]
Message-ID: <1330991229-21167-1-git-send-email-normalperson@yhbt.net> (raw)
In-Reply-To: 20120305234508.GA15184@dcvr.yhbt.net

It seems autopush support in our autopush code has
always been broken outside of Linux-based systems,
as we never marked the socket as having pending data.
---
 ext/kgio/autopush.c   |    1 +
 ext/kgio/read_write.c |   13 +++++++++++++
 test/test_autopush.rb |    3 ++-
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/ext/kgio/autopush.c b/ext/kgio/autopush.c
index 7c5553f..74576e8 100644
--- a/ext/kgio/autopush.c
+++ b/ext/kgio/autopush.c
@@ -240,6 +240,7 @@ static void push_pending_data(VALUE io)
 }
 #else /* !KGIO_NOPUSH */
 void kgio_autopush_recv(VALUE io){}
+void kgio_autopush_send(VALUE io){}
 void init_kgio_autopush(void)
 {
 }
diff --git a/ext/kgio/read_write.c b/ext/kgio/read_write.c
index 6f739a5..9c2440e 100644
--- a/ext/kgio/read_write.c
+++ b/ext/kgio/read_write.c
@@ -13,8 +13,18 @@ static ID id_set_backtrace;
 #if defined(__linux__) && ! defined(USE_MSG_DONTWAIT)
 #  define USE_MSG_DONTWAIT
 static const int peek_flags = MSG_DONTWAIT|MSG_PEEK;
+
+/* we don't need these variants, we call kgio_autopush_send/recv directly */
+static inline void kgio_autopush_read(VALUE io) { }
+static inline void kgio_autopush_write(VALUE io) { }
+
 #else
 static const int peek_flags = MSG_PEEK;
+#  include <netinet/tcp.h>
+#  if defined(TCP_NOPUSH)
+static inline void kgio_autopush_read(VALUE io) { kgio_autopush_recv(io); }
+static inline void kgio_autopush_write(VALUE io) { kgio_autopush_send(io); }
+#  endif
 #endif
 
 NORETURN(static void raise_empty_bt(VALUE, const char *));
@@ -112,6 +122,7 @@ static VALUE my_read(int io_wait, int argc, VALUE *argv, VALUE io)
 	long n;
 
 	prepare_read(&a, argc, argv, io);
+	kgio_autopush_read(io);
 
 	if (a.len > 0) {
 		set_nonblocking(a.fd);
@@ -357,6 +368,8 @@ retry:
 	n = (long)write(a.fd, a.ptr, a.len);
 	if (write_check(&a, n, "write", io_wait) != 0)
 		goto retry;
+	if (TYPE(a.buf) != T_SYMBOL)
+		kgio_autopush_write(io);
 	return a.buf;
 }
 
diff --git a/test/test_autopush.rb b/test/test_autopush.rb
index 24b300f..57fbefa 100644
--- a/test/test_autopush.rb
+++ b/test/test_autopush.rb
@@ -38,7 +38,8 @@ class TestAutopush < Test::Unit::TestCase
     assert_nothing_raised { s.kgio_write 'asdf' }
     assert_equal :wait_readable, s.kgio_tryread(1)
     assert s.kgio_autopush?
-    assert_equal 1, s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
+    val = s.getsockopt(Socket::IPPROTO_TCP, opt).unpack('i')[0]
+    assert_operator val, :>, 0, "#{opt}=#{val} (#{RUBY_PLATFORM})"
   end
 
   def test_autopush_true_unix
-- 
1.7.9.2.358.g22243



  parent reply	other threads:[~2012-03-05 23:47 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-04 16:02 kgio, autopush test fails on Debian GNU/kFreeBSD 375gnu
2012-03-05  8:43 ` Eric Wong
2012-03-05 18:59   ` 375gnu
2012-03-05 23:45     ` Eric Wong
2012-03-05 23:47       ` [PATCH 1/3] accept4: require SOCK_NONBLOCK/SOCK_CLOEXEC macros Eric Wong
2012-03-05 23:47       ` Eric Wong [this message]
2012-03-05 23:47       ` [PATCH 3/3] test: increase delta range for timing-sensitive test 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://yhbt.net/kgio/

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

  git send-email \
    --in-reply-to=1330991229-21167-1-git-send-email-normalperson@yhbt.net \
    --to=normalperson@yhbt.net \
    --cc=kgio@librelist.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://yhbt.net/kgio.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).