static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { if (revents & UV__POLLIN) uv__udp_recvmsg(loop, w, revents); if (revents & UV__POLLOUT) uv__udp_sendmsg(loop, w, revents); }
int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr* addr, unsigned int addrlen, uv_udp_send_cb send_cb) { int err; int empty_queue; assert(nbufs > 0); err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); if (err) return err; /* It's legal for send_queue_count > 0 even when the write_queue is empty; * it means there are error-state requests in the write_completed_queue that * will touch up send_queue_size/count later. */ empty_queue = (handle->send_queue_count == 0); uv__req_init(handle->loop, req, UV_UDP_SEND); assert(addrlen <= sizeof(req->addr)); memcpy(&req->addr, addr, addrlen); req->send_cb = send_cb; req->handle = handle; req->nbufs = nbufs; req->bufs = req->bufsml; if (nbufs > ARRAY_SIZE(req->bufsml)) req->bufs = uv__malloc(nbufs * sizeof(bufs[0])); if (req->bufs == NULL) return -ENOMEM; memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); handle->send_queue_size += uv__count_bufs(req->bufs, req->nbufs); handle->send_queue_count++; QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue); uv__handle_start(handle); if (empty_queue && !(handle->flags & UV_UDP_PROCESSING)) { uv__udp_sendmsg(handle); } else { uv__io_start(handle->loop, &handle->io_watcher, UV__POLLOUT); } return 0; }
static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { uv_udp_t* handle; handle = container_of(w, uv_udp_t, io_watcher); assert(handle->type == UV_UDP); if (revents & UV__POLLIN) uv__udp_recvmsg(handle); if (revents & UV__POLLOUT) { uv__udp_sendmsg(handle); uv__udp_run_completed(handle); } }
static void uv__udp_io(EV_P_ ev_io* w, int events) { uv_udp_t* handle; handle = w->data; assert(handle != NULL); assert(handle->type == UV_UDP); assert(handle->fd >= 0); assert(!(events & ~(EV_READ|EV_WRITE))); if (events & EV_READ) uv__udp_recvmsg(handle); if (events & EV_WRITE) uv__udp_sendmsg(handle); }