Exemple #1
0
static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
        uv_req_t* req) {
    unsigned char mask_events;
    AFD_POLL_INFO* afd_poll_info;

    if (req == &handle->poll_req_1) {
        afd_poll_info = &handle->afd_poll_info_1;
        handle->submitted_events_1 = 0;
        mask_events = handle->mask_events_1;
    } else if (req == &handle->poll_req_2) {
        afd_poll_info = &handle->afd_poll_info_2;
        handle->submitted_events_2 = 0;
        mask_events = handle->mask_events_2;
    } else {
        assert(0);
    }

    /* Report an error unless the select was just interrupted. */
    if (!REQ_SUCCESS(req)) {
        DWORD error = GET_REQ_SOCK_ERROR(req);
        if (error != WSAEINTR && handle->events != 0) {
            handle->events = 0; /* Stop the watcher */
            uv__set_sys_error(loop, error);
            handle->poll_cb(handle, -1, 0);
        }

    } else if (afd_poll_info->NumberOfHandles >= 1) {
        unsigned char events = 0;

        if ((afd_poll_info->Handles[0].Events & (AFD_POLL_RECEIVE |
                AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT)) != 0) {
            events |= UV_READABLE;
        }
        if ((afd_poll_info->Handles[0].Events & (AFD_POLL_SEND |
                AFD_POLL_CONNECT_FAIL)) != 0) {
            events |= UV_WRITABLE;
        }

        events &= handle->events & ~mask_events;

        if (afd_poll_info->Handles[0].Events & AFD_POLL_LOCAL_CLOSE) {
            /* Stop polling. */
            handle->events = 0;
            uv__handle_stop(handle);
        }

        if (events != 0) {
            handle->poll_cb(handle, 0, events);
        }
    }

    if ((handle->events & ~(handle->submitted_events_1 |
                            handle->submitted_events_2)) != 0) {
        uv__fast_poll_submit_poll_req(loop, handle);
    } else if ((handle->flags & UV_HANDLE_CLOSING) &&
               handle->submitted_events_1 == 0 &&
               handle->submitted_events_2 == 0) {
        uv_want_endgame(loop, (uv_handle_t*) handle);
    }
}
Exemple #2
0
static int uv__fast_poll_set(uv_loop_t* loop, uv_poll_t* handle, int events) {
  assert(handle->type == UV_POLL);
  assert(!(handle->flags & UV_HANDLE_CLOSING));
  assert((events & ~(UV_READABLE | UV_WRITABLE)) == 0);

  handle->events = events;
  if ((handle->events & ~(handle->submitted_events_1 |
      handle->submitted_events_2)) != 0) {
    uv__fast_poll_submit_poll_req(handle->loop, handle);
  }

  return 0;
}