about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-04-11 23:13:13 +0000
committerEric Wong <normalperson@yhbt.net>2013-04-11 23:13:13 +0000
commit65a248c523ddbfa41ae1e1d6da0a7f71383428e2 (patch)
treee412c4ef21305367066ff001bbbde2d146db939e
parentc29fd663b45888aa8661c8599c88c339f4fbe8c1 (diff)
downloadraindrops-65a248c523ddbfa41ae1e1d6da0a7f71383428e2.tar.gz
This allows reusing existing Linux::TCP_Info objects to avoid
generating garbage.
-rw-r--r--ext/raindrops/linux_tcp_info.c1
-rw-r--r--test/test_linux_tcp_info.rb7
2 files changed, 8 insertions, 0 deletions
diff --git a/ext/raindrops/linux_tcp_info.c b/ext/raindrops/linux_tcp_info.c
index ce1c2d3..dcdb153 100644
--- a/ext/raindrops/linux_tcp_info.c
+++ b/ext/raindrops/linux_tcp_info.c
@@ -131,6 +131,7 @@ void Init_raindrops_linux_tcp_info(void)
         cTCP_Info = rb_define_class_under(cRaindrops, "TCP_Info", rb_cObject);
         rb_define_alloc_func(cTCP_Info, alloc);
         rb_define_private_method(cTCP_Info, "initialize", init, 1);
+        rb_define_method(cTCP_Info, "get!", init, 1);
 
 #define TCPI_DEFINE_METHOD(x) \
         rb_define_method(cTCP_Info, #x, tcp_info_##x, 0)
diff --git a/test/test_linux_tcp_info.rb b/test/test_linux_tcp_info.rb
index 3b4a245..c947211 100644
--- a/test/test_linux_tcp_info.rb
+++ b/test/test_linux_tcp_info.rb
@@ -12,6 +12,7 @@ class TestLinuxTCP_Info < Test::Unit::TestCase
   # Linux kernel commit 5ee3afba88f5a79d0bff07ddd87af45919259f91
   TCP_INFO_useful_listenq = `uname -r`.strip >= '2.6.24'
 
+
   def test_tcp_server
     s = TCPServer.new(TEST_ADDR, 0)
     rv = Raindrops::TCP_Info.new s
@@ -23,6 +24,11 @@ class TestLinuxTCP_Info < Test::Unit::TestCase
     a = s.accept
     tmp = Raindrops::TCP_Info.new s
     assert_equal 0, tmp.unacked
+    before = tmp.object_id
+
+    tmp.get!(s)
+    assert_equal before, tmp.object_id
+
     ensure
       c.close if c
       a.close if a
@@ -35,6 +41,7 @@ class TestLinuxTCP_Info < Test::Unit::TestCase
     tcp_info_methods = tmp.methods - Object.new.methods
     assert tcp_info_methods.size >= 32
     tcp_info_methods.each do |m|
+      next if m.to_sym == :get!
       val = tmp.__send__ m
       assert_kind_of Integer, val
       assert val >= 0