diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2021-06-19 13:47:16 +1200 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2021-06-22 22:48:57 +1200 |
commit | 45e65f302b663b2c6ab69df06d3b6f219c1797b2 (patch) | |
tree | adf0ed3b3b9c92626f2c21a320ecdf66998b4c27 /ext/socket/udpsocket.c | |
parent | 3deb5d7113e1fd6e4b468e09464d524d390d811e (diff) | |
download | ruby-45e65f302b663b2c6ab69df06d3b6f219c1797b2.tar.gz |
Deprecate and rework old (fd) centric functions.
Diffstat (limited to 'ext/socket/udpsocket.c')
-rw-r--r-- | ext/socket/udpsocket.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/ext/socket/udpsocket.c b/ext/socket/udpsocket.c index 593f05522d..94ea19c224 100644 --- a/ext/socket/udpsocket.c +++ b/ext/socket/udpsocket.c @@ -153,23 +153,26 @@ udp_send_internal(VALUE v) { struct udp_send_arg *arg = (void *)v; rb_io_t *fptr; - int n; struct addrinfo *res; rb_io_check_closed(fptr = arg->fptr); for (res = arg->res->ai; res; res = res->ai_next) { retry: - arg->sarg.fd = fptr->fd; - arg->sarg.to = res->ai_addr; - arg->sarg.tolen = res->ai_addrlen; - rsock_maybe_fd_writable(arg->sarg.fd); - n = (int)BLOCKING_REGION_FD(rsock_sendto_blocking, &arg->sarg); - if (n >= 0) { - return INT2FIX(n); - } - if (rb_io_wait_writable(fptr->fd)) { - goto retry; - } + arg->sarg.fd = fptr->fd; + arg->sarg.to = res->ai_addr; + arg->sarg.tolen = res->ai_addrlen; + +#ifdef RSOCK_WAIT_BEFORE_BLOCKING + rb_io_wait(fptr->self, RB_INT2NUM(RUBY_IO_WRITABLE), Qnil); +#endif + + ssize_t n = (ssize_t)BLOCKING_REGION_FD(rsock_sendto_blocking, &arg->sarg); + + if (n >= 0) return RB_INT2NUM(n); + + if (rb_io_maybe_wait_writable(errno, fptr->self, Qnil)) { + goto retry; + } } return Qfalse; } |