mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/socket.c (sock_s_socketpair): yield if a block is given.
(io_call_close): defined. (io_close): defined. (pair_yield): defined. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21216 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
95c474ec4d
commit
ddedc6f125
3 changed files with 53 additions and 2 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Wed Dec 31 23:37:17 2008 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* ext/socket/socket.c (sock_s_socketpair): yield if a block is given.
|
||||||
|
(io_call_close): defined.
|
||||||
|
(io_close): defined.
|
||||||
|
(pair_yield): defined.
|
||||||
|
|
||||||
Wed Dec 31 19:35:57 2008 Yuki Sonoda (Yugui) <yugui@yugui.jp>
|
Wed Dec 31 19:35:57 2008 Yuki Sonoda (Yugui) <yugui@yugui.jp>
|
||||||
|
|
||||||
* spec/README: follows the change of directory structure in rubyspec.
|
* spec/README: follows the change of directory structure in rubyspec.
|
||||||
|
|
|
@ -2384,12 +2384,31 @@ sock_initialize(VALUE sock, VALUE domain, VALUE type, VALUE protocol)
|
||||||
return init_sock(sock, fd);
|
return init_sock(sock, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
io_call_close(VALUE io)
|
||||||
|
{
|
||||||
|
return rb_funcall(io, rb_intern("close"), 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
io_close(VALUE io)
|
||||||
|
{
|
||||||
|
return rb_rescue(io_call_close, io, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
pair_yield(VALUE pair)
|
||||||
|
{
|
||||||
|
return rb_ensure(rb_yield, pair, io_close, rb_ary_entry(pair, 1));
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
sock_s_socketpair(VALUE klass, VALUE domain, VALUE type, VALUE protocol)
|
sock_s_socketpair(VALUE klass, VALUE domain, VALUE type, VALUE protocol)
|
||||||
{
|
{
|
||||||
#if defined HAVE_SOCKETPAIR
|
#if defined HAVE_SOCKETPAIR
|
||||||
int d, t, p, sp[2];
|
int d, t, p, sp[2];
|
||||||
int ret;
|
int ret;
|
||||||
|
VALUE s1, s2, r;
|
||||||
|
|
||||||
setup_domain_and_type(domain, &d, type, &t);
|
setup_domain_and_type(domain, &d, type, &t);
|
||||||
p = NUM2INT(protocol);
|
p = NUM2INT(protocol);
|
||||||
|
@ -2402,8 +2421,13 @@ sock_s_socketpair(VALUE klass, VALUE domain, VALUE type, VALUE protocol)
|
||||||
rb_sys_fail("socketpair(2)");
|
rb_sys_fail("socketpair(2)");
|
||||||
}
|
}
|
||||||
|
|
||||||
return rb_assoc_new(init_sock(rb_obj_alloc(klass), sp[0]),
|
s1 = init_sock(rb_obj_alloc(klass), sp[0]);
|
||||||
init_sock(rb_obj_alloc(klass), sp[1]));
|
s2 = init_sock(rb_obj_alloc(klass), sp[1]);
|
||||||
|
r = rb_assoc_new(s1, s2);
|
||||||
|
if (rb_block_given_p()) {
|
||||||
|
return rb_ensure(pair_yield, r, io_close, s1);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
#else
|
#else
|
||||||
rb_notimplement();
|
rb_notimplement();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -146,4 +146,24 @@ class TestUNIXSocket < Test::Unit::TestCase
|
||||||
assert_equal("a", s1.read(1))
|
assert_equal("a", s1.read(1))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_socket_pair_with_block
|
||||||
|
pair = nil
|
||||||
|
ret = Socket.pair(Socket::AF_UNIX, Socket::SOCK_STREAM, 0) {|s1, s2|
|
||||||
|
pair = [s1, s2]
|
||||||
|
:return_value
|
||||||
|
}
|
||||||
|
assert_equal(:return_value, ret)
|
||||||
|
assert_kind_of(Socket, pair[0])
|
||||||
|
assert_kind_of(Socket, pair[1])
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_unix_socket_pair_with_block
|
||||||
|
pair = nil
|
||||||
|
UNIXSocket.pair {|s1, s2|
|
||||||
|
pair = [s1, s2]
|
||||||
|
}
|
||||||
|
assert_kind_of(UNIXSocket, pair[0])
|
||||||
|
assert_kind_of(UNIXSocket, pair[1])
|
||||||
|
end
|
||||||
|
|
||||||
end if defined?(UNIXSocket) && /cygwin/ !~ RUBY_PLATFORM
|
end if defined?(UNIXSocket) && /cygwin/ !~ RUBY_PLATFORM
|
||||||
|
|
Loading…
Reference in a new issue