Example #1
0
File: poll.c Project: ntoshev/node
static int uv__fast_poll_cancel_poll_req(uv_loop_t* loop, uv_poll_t* handle) {
    AFD_POLL_INFO afd_poll_info;
    DWORD result;

    afd_poll_info.Exclusive = TRUE;
    afd_poll_info.NumberOfHandles = 1;
    afd_poll_info.Timeout.QuadPart = INT64_MAX;
    afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket;
    afd_poll_info.Handles[0].Status = 0;
    afd_poll_info.Handles[0].Events = AFD_POLL_ALL;

    result = uv_msafd_poll(handle->socket,
                           &afd_poll_info,
                           uv__get_overlapped_dummy());

    if (result == SOCKET_ERROR) {
        DWORD error = WSAGetLastError();
        if (error != WSA_IO_PENDING) {
            uv__set_sys_error(loop, WSAGetLastError());
            return -1;
        }
    }

    return 0;
}
Example #2
0
static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) {
  uv_req_t* req;
  AFD_POLL_INFO* afd_poll_info;
  DWORD result;

  /* Find a yet unsubmitted req to submit. */
  if (handle->submitted_events_1 == 0) {
    req = &handle->poll_req_1;
    afd_poll_info = &handle->afd_poll_info_1;
    handle->submitted_events_1 = handle->events;
    handle->mask_events_1 = 0;
    handle->mask_events_2 = handle->events;
  } else if (handle->submitted_events_2 == 0) {
    req = &handle->poll_req_2;
    afd_poll_info = &handle->afd_poll_info_2;
    handle->submitted_events_2 = handle->events;
    handle->mask_events_1 = handle->events;
    handle->mask_events_2 = 0;
  } else {
    assert(0);
    return;
  }

  /* Setting Exclusive to TRUE makes the other poll request return if there */
  /* is any. */
  afd_poll_info->Exclusive = TRUE;
  afd_poll_info->NumberOfHandles = 1;
  afd_poll_info->Timeout.QuadPart = INT64_MAX;
  afd_poll_info->Handles[0].Handle = (HANDLE) handle->socket;
  afd_poll_info->Handles[0].Status = 0;
  afd_poll_info->Handles[0].Events = 0;

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

  memset(&req->u.io.overlapped, 0, sizeof req->u.io.overlapped);

  result = uv_msafd_poll((SOCKET) handle->peer_socket,
                         afd_poll_info,
                         afd_poll_info,
                         &req->u.io.overlapped);
  if (result != 0 && WSAGetLastError() != WSA_IO_PENDING) {
    /* Queue this req, reporting an error. */
    SET_REQ_ERROR(req, WSAGetLastError());
    uv_insert_pending_req(loop, req);
  }
}
Example #3
0
static int uv__fast_poll_cancel_poll_reqs(uv_loop_t* loop, uv_poll_t* handle) {
  AFD_POLL_INFO afd_poll_info;
  DWORD result;
  HANDLE event;
  OVERLAPPED overlapped;

  event = CreateEvent(NULL, TRUE, FALSE, NULL);
  if (event == NULL) {
    uv__set_sys_error(loop, GetLastError());
    return -1;
  }

  afd_poll_info.Exclusive = TRUE;
  afd_poll_info.NumberOfHandles = 1;
  afd_poll_info.Timeout.QuadPart = INT64_MAX;
  afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket;
  afd_poll_info.Handles[0].Status = 0;
  afd_poll_info.Handles[0].Events = AFD_POLL_ALL;

  memset(&overlapped, 0, sizeof overlapped);
  overlapped.hEvent = (HANDLE) ((uintptr_t) event & 1);

  result = uv_msafd_poll(handle->socket,
                         &afd_poll_info,
                         &overlapped);

  if (result == SOCKET_ERROR) {
    DWORD error = WSAGetLastError();
    if (error != WSA_IO_PENDING) {
      uv__set_sys_error(loop, WSAGetLastError());
      CloseHandle(event);
      return -1;
    }
  }

  CloseHandle(event);
  return 0;
}