From b9a91334c50e5a0b8ea0a4b571cd3011228cba6c Mon Sep 17 00:00:00 2001 From: normal Date: Mon, 15 Jun 2015 19:38:49 +0000 Subject: socket: allow exception-free nonblocking sendmsg/recvmsg As documented before, exceptions are expensive and IO::Wait*able are too common in socket applications to be the exceptional case. Datagram sockets deserve the same API which stream sockets are allowed with read_nonblock and write_nonblock. Note: this does not offer a performance advantage under optimal conditions when both ends are equally matched in speed, but it it does make debug output cleaner by avoiding exceptions whenever the receiver slows down. * ext/socket/ancdata.c (bsock_sendmsg_internal, bsock_recvmsg_internal): support "exception: false" kwarg * ext/socket/init.c (rsock_s_recvfrom_nonblock): ditto * ext/socket/init.c (rsock_s_recvfrom_nonblock): use rsock_opt_false_p * ext/socket/socket.c (sock_connect_nonblock): ditto * ext/socket/rubysocket.h (rsock_opt_false_p): new function * ext/socket/basicsocket.c (bsock_recv_nonblock): update rdoc * ext/socket/udpsocket.c (udp_recvfrom_nonblock): ditto * test/socket/test_nonblock.rb: new tests [ruby-core:69542] [Feature #11229] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50910 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/socket/rubysocket.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'ext/socket/rubysocket.h') diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h index 359d28ea3d..d03b1c5e0b 100644 --- a/ext/socket/rubysocket.h +++ b/ext/socket/rubysocket.h @@ -423,4 +423,12 @@ static inline void rsock_maybe_wait_fd(int fd) { } # define MSG_DONTWAIT_RELIABLE 0 #endif +static inline int +rsock_opt_false_p(VALUE opt, VALUE sym) +{ + if (!NIL_P(opt) && Qfalse == rb_hash_lookup2(opt, sym, Qundef)) + return 1; + return 0; +} + #endif -- cgit v1.2.3