summaryrefslogtreecommitdiff
path: root/ext/socket/udpsocket.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-06-19 13:47:16 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-06-22 22:48:57 +1200
commit45e65f302b663b2c6ab69df06d3b6f219c1797b2 (patch)
treeadf0ed3b3b9c92626f2c21a320ecdf66998b4c27 /ext/socket/udpsocket.c
parent3deb5d7113e1fd6e4b468e09464d524d390d811e (diff)
Deprecate and rework old (fd) centric functions.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4592
Diffstat (limited to 'ext/socket/udpsocket.c')
-rw-r--r--ext/socket/udpsocket.c27
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;
}