Blame include/uv/win.h

Packit b5b901
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
Packit b5b901
 *
Packit b5b901
 * Permission is hereby granted, free of charge, to any person obtaining a copy
Packit b5b901
 * of this software and associated documentation files (the "Software"), to
Packit b5b901
 * deal in the Software without restriction, including without limitation the
Packit b5b901
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit b5b901
 * sell copies of the Software, and to permit persons to whom the Software is
Packit b5b901
 * furnished to do so, subject to the following conditions:
Packit b5b901
 *
Packit b5b901
 * The above copyright notice and this permission notice shall be included in
Packit b5b901
 * all copies or substantial portions of the Software.
Packit b5b901
 *
Packit b5b901
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit b5b901
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit b5b901
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Packit b5b901
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit b5b901
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit b5b901
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
Packit b5b901
 * IN THE SOFTWARE.
Packit b5b901
 */
Packit b5b901
Packit b5b901
#ifndef _WIN32_WINNT
Packit b5b901
# define _WIN32_WINNT   0x0600
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED)
Packit b5b901
typedef intptr_t ssize_t;
Packit Service e08953
# define SSIZE_MAX INTPTR_MAX
Packit b5b901
# define _SSIZE_T_
Packit b5b901
# define _SSIZE_T_DEFINED
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#include <winsock2.h>
Packit b5b901
Packit b5b901
#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
Packit b5b901
typedef struct pollfd {
Packit b5b901
  SOCKET fd;
Packit b5b901
  short  events;
Packit b5b901
  short  revents;
Packit b5b901
} WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD;
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#ifndef LOCALE_INVARIANT
Packit b5b901
# define LOCALE_INVARIANT 0x007f
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#include <mswsock.h>
Packit b5b901
#include <ws2tcpip.h>
Packit b5b901
#include <windows.h>
Packit b5b901
Packit b5b901
#include <process.h>
Packit b5b901
#include <signal.h>
Packit b5b901
#include <fcntl.h>
Packit b5b901
#include <sys/stat.h>
Packit b5b901
Packit b5b901
#if defined(_MSC_VER) && _MSC_VER < 1600
Packit b5b901
# include "uv/stdint-msvc2008.h"
Packit b5b901
#else
Packit b5b901
# include <stdint.h>
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#include "uv/tree.h"
Packit b5b901
#include "uv/threadpool.h"
Packit b5b901
Packit b5b901
#define MAX_PIPENAME_LEN 256
Packit b5b901
Packit b5b901
#ifndef S_IFLNK
Packit b5b901
# define S_IFLNK 0xA000
Packit b5b901
#endif
Packit b5b901
Packit b5b901
/* Additional signals supported by uv_signal and or uv_kill. The CRT defines
Packit b5b901
 * the following signals already:
Packit b5b901
 *
Packit b5b901
 *   #define SIGINT           2
Packit b5b901
 *   #define SIGILL           4
Packit b5b901
 *   #define SIGABRT_COMPAT   6
Packit b5b901
 *   #define SIGFPE           8
Packit b5b901
 *   #define SIGSEGV         11
Packit b5b901
 *   #define SIGTERM         15
Packit b5b901
 *   #define SIGBREAK        21
Packit b5b901
 *   #define SIGABRT         22
Packit b5b901
 *
Packit b5b901
 * The additional signals have values that are common on other Unix
Packit b5b901
 * variants (Linux and Darwin)
Packit b5b901
 */
Packit b5b901
#define SIGHUP                1
Packit b5b901
#define SIGKILL               9
Packit b5b901
#define SIGWINCH             28
Packit b5b901
Packit Service e08953
/* Redefine NSIG to take SIGWINCH into consideration */
Packit Service e08953
#if defined(NSIG) && NSIG <= SIGWINCH
Packit Service e08953
# undef NSIG
Packit Service e08953
#endif
Packit Service e08953
#ifndef NSIG
Packit Service e08953
# define NSIG SIGWINCH + 1
Packit Service e08953
#endif
Packit Service e08953
Packit b5b901
/* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many unix-like
Packit b5b901
 * platforms. However MinGW doesn't define it, so we do. */
Packit b5b901
#ifndef SIGABRT_COMPAT
Packit b5b901
# define SIGABRT_COMPAT       6
Packit b5b901
#endif
Packit b5b901
Packit b5b901
/*
Packit b5b901
 * Guids and typedefs for winsock extension functions
Packit b5b901
 * Mingw32 doesn't have these :-(
Packit b5b901
 */
Packit b5b901
#ifndef WSAID_ACCEPTEX
Packit b5b901
# define WSAID_ACCEPTEX                                                       \
Packit b5b901
         {0xb5367df1, 0xcbac, 0x11cf,                                         \
Packit b5b901
         {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
Packit b5b901
Packit b5b901
# define WSAID_CONNECTEX                                                      \
Packit b5b901
         {0x25a207b9, 0xddf3, 0x4660,                                         \
Packit b5b901
         {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
Packit b5b901
Packit b5b901
# define WSAID_GETACCEPTEXSOCKADDRS                                           \
Packit b5b901
         {0xb5367df2, 0xcbac, 0x11cf,                                         \
Packit b5b901
         {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
Packit b5b901
Packit b5b901
# define WSAID_DISCONNECTEX                                                   \
Packit b5b901
         {0x7fda2e11, 0x8630, 0x436f,                                         \
Packit b5b901
         {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
Packit b5b901
Packit b5b901
# define WSAID_TRANSMITFILE                                                   \
Packit b5b901
         {0xb5367df0, 0xcbac, 0x11cf,                                         \
Packit b5b901
         {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
Packit b5b901
Packit b5b901
  typedef BOOL (PASCAL *LPFN_ACCEPTEX)
Packit b5b901
                      (SOCKET sListenSocket,
Packit b5b901
                       SOCKET sAcceptSocket,
Packit b5b901
                       PVOID lpOutputBuffer,
Packit b5b901
                       DWORD dwReceiveDataLength,
Packit b5b901
                       DWORD dwLocalAddressLength,
Packit b5b901
                       DWORD dwRemoteAddressLength,
Packit b5b901
                       LPDWORD lpdwBytesReceived,
Packit b5b901
                       LPOVERLAPPED lpOverlapped);
Packit b5b901
Packit b5b901
  typedef BOOL (PASCAL *LPFN_CONNECTEX)
Packit b5b901
                      (SOCKET s,
Packit b5b901
                       const struct sockaddr* name,
Packit b5b901
                       int namelen,
Packit b5b901
                       PVOID lpSendBuffer,
Packit b5b901
                       DWORD dwSendDataLength,
Packit b5b901
                       LPDWORD lpdwBytesSent,
Packit b5b901
                       LPOVERLAPPED lpOverlapped);
Packit b5b901
Packit b5b901
  typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS)
Packit b5b901
                      (PVOID lpOutputBuffer,
Packit b5b901
                       DWORD dwReceiveDataLength,
Packit b5b901
                       DWORD dwLocalAddressLength,
Packit b5b901
                       DWORD dwRemoteAddressLength,
Packit b5b901
                       LPSOCKADDR* LocalSockaddr,
Packit b5b901
                       LPINT LocalSockaddrLength,
Packit b5b901
                       LPSOCKADDR* RemoteSockaddr,
Packit b5b901
                       LPINT RemoteSockaddrLength);
Packit b5b901
Packit b5b901
  typedef BOOL (PASCAL *LPFN_DISCONNECTEX)
Packit b5b901
                      (SOCKET hSocket,
Packit b5b901
                       LPOVERLAPPED lpOverlapped,
Packit b5b901
                       DWORD dwFlags,
Packit b5b901
                       DWORD reserved);
Packit b5b901
Packit b5b901
  typedef BOOL (PASCAL *LPFN_TRANSMITFILE)
Packit b5b901
                      (SOCKET hSocket,
Packit b5b901
                       HANDLE hFile,
Packit b5b901
                       DWORD nNumberOfBytesToWrite,
Packit b5b901
                       DWORD nNumberOfBytesPerSend,
Packit b5b901
                       LPOVERLAPPED lpOverlapped,
Packit b5b901
                       LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
Packit b5b901
                       DWORD dwFlags);
Packit b5b901
Packit b5b901
  typedef PVOID RTL_SRWLOCK;
Packit b5b901
  typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
Packit b5b901
#endif
Packit b5b901
Packit b5b901
typedef int (WSAAPI* LPFN_WSARECV)
Packit b5b901
            (SOCKET socket,
Packit b5b901
             LPWSABUF buffers,
Packit b5b901
             DWORD buffer_count,
Packit b5b901
             LPDWORD bytes,
Packit b5b901
             LPDWORD flags,
Packit b5b901
             LPWSAOVERLAPPED overlapped,
Packit b5b901
             LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
Packit b5b901
Packit b5b901
typedef int (WSAAPI* LPFN_WSARECVFROM)
Packit b5b901
            (SOCKET socket,
Packit b5b901
             LPWSABUF buffers,
Packit b5b901
             DWORD buffer_count,
Packit b5b901
             LPDWORD bytes,
Packit b5b901
             LPDWORD flags,
Packit b5b901
             struct sockaddr* addr,
Packit b5b901
             LPINT addr_len,
Packit b5b901
             LPWSAOVERLAPPED overlapped,
Packit b5b901
             LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
Packit b5b901
Packit b5b901
#ifndef _NTDEF_
Packit b5b901
  typedef LONG NTSTATUS;
Packit b5b901
  typedef NTSTATUS *PNTSTATUS;
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#ifndef RTL_CONDITION_VARIABLE_INIT
Packit b5b901
  typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE;
Packit b5b901
#endif
Packit b5b901
Packit b5b901
typedef struct _AFD_POLL_HANDLE_INFO {
Packit b5b901
  HANDLE Handle;
Packit b5b901
  ULONG Events;
Packit b5b901
  NTSTATUS Status;
Packit b5b901
} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
Packit b5b901
Packit b5b901
typedef struct _AFD_POLL_INFO {
Packit b5b901
  LARGE_INTEGER Timeout;
Packit b5b901
  ULONG NumberOfHandles;
Packit b5b901
  ULONG Exclusive;
Packit b5b901
  AFD_POLL_HANDLE_INFO Handles[1];
Packit b5b901
} AFD_POLL_INFO, *PAFD_POLL_INFO;
Packit b5b901
Packit b5b901
#define UV_MSAFD_PROVIDER_COUNT 3
Packit b5b901
Packit b5b901
Packit b5b901
/**
Packit b5b901
 * It should be possible to cast uv_buf_t[] to WSABUF[]
Packit b5b901
 * see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx
Packit b5b901
 */
Packit b5b901
typedef struct uv_buf_t {
Packit b5b901
  ULONG len;
Packit b5b901
  char* base;
Packit b5b901
} uv_buf_t;
Packit b5b901
Packit b5b901
typedef int uv_file;
Packit b5b901
typedef SOCKET uv_os_sock_t;
Packit b5b901
typedef HANDLE uv_os_fd_t;
Packit b5b901
typedef int uv_pid_t;
Packit b5b901
Packit b5b901
typedef HANDLE uv_thread_t;
Packit b5b901
Packit b5b901
typedef HANDLE uv_sem_t;
Packit b5b901
Packit b5b901
typedef CRITICAL_SECTION uv_mutex_t;
Packit b5b901
Packit b5b901
/* This condition variable implementation is based on the SetEvent solution
Packit b5b901
 * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
Packit b5b901
 * We could not use the SignalObjectAndWait solution (section 3.4) because
Packit b5b901
 * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and
Packit b5b901
 * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs.
Packit b5b901
 */
Packit b5b901
Packit b5b901
typedef union {
Packit b5b901
  CONDITION_VARIABLE cond_var;
Packit b5b901
  struct {
Packit b5b901
    unsigned int waiters_count;
Packit b5b901
    CRITICAL_SECTION waiters_count_lock;
Packit b5b901
    HANDLE signal_event;
Packit b5b901
    HANDLE broadcast_event;
Packit b5b901
  } unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */
Packit b5b901
} uv_cond_t;
Packit b5b901
Packit b5b901
typedef union {
Packit b5b901
  struct {
Packit b5b901
    unsigned int num_readers_;
Packit b5b901
    CRITICAL_SECTION num_readers_lock_;
Packit b5b901
    HANDLE write_semaphore_;
Packit b5b901
  } state_;
Packit b5b901
  /* TODO: remove me in v2.x. */
Packit b5b901
  struct {
Packit b5b901
    SRWLOCK unused_;
Packit b5b901
  } unused1_;
Packit b5b901
  /* TODO: remove me in v2.x. */
Packit b5b901
  struct {
Packit b5b901
    uv_mutex_t unused1_;
Packit b5b901
    uv_mutex_t unused2_;
Packit b5b901
  } unused2_;
Packit b5b901
} uv_rwlock_t;
Packit b5b901
Packit b5b901
typedef struct {
Packit b5b901
  unsigned int n;
Packit b5b901
  unsigned int count;
Packit b5b901
  uv_mutex_t mutex;
Packit b5b901
  uv_sem_t turnstile1;
Packit b5b901
  uv_sem_t turnstile2;
Packit b5b901
} uv_barrier_t;
Packit b5b901
Packit b5b901
typedef struct {
Packit b5b901
  DWORD tls_index;
Packit b5b901
} uv_key_t;
Packit b5b901
Packit b5b901
#define UV_ONCE_INIT { 0, NULL }
Packit b5b901
Packit b5b901
typedef struct uv_once_s {
Packit b5b901
  unsigned char ran;
Packit b5b901
  HANDLE event;
Packit b5b901
} uv_once_t;
Packit b5b901
Packit b5b901
/* Platform-specific definitions for uv_spawn support. */
Packit b5b901
typedef unsigned char uv_uid_t;
Packit b5b901
typedef unsigned char uv_gid_t;
Packit b5b901
Packit b5b901
typedef struct uv__dirent_s {
Packit b5b901
  int d_type;
Packit b5b901
  char d_name[1];
Packit b5b901
} uv__dirent_t;
Packit b5b901
Packit Service e08953
#define UV_DIR_PRIVATE_FIELDS \
Packit Service e08953
  HANDLE dir_handle;          \
Packit Service e08953
  WIN32_FIND_DATAW find_data; \
Packit Service e08953
  BOOL need_find_call;
Packit Service e08953
Packit b5b901
#define HAVE_DIRENT_TYPES
Packit b5b901
#define UV__DT_DIR     UV_DIRENT_DIR
Packit b5b901
#define UV__DT_FILE    UV_DIRENT_FILE
Packit b5b901
#define UV__DT_LINK    UV_DIRENT_LINK
Packit b5b901
#define UV__DT_FIFO    UV_DIRENT_FIFO
Packit b5b901
#define UV__DT_SOCKET  UV_DIRENT_SOCKET
Packit b5b901
#define UV__DT_CHAR    UV_DIRENT_CHAR
Packit b5b901
#define UV__DT_BLOCK   UV_DIRENT_BLOCK
Packit b5b901
Packit b5b901
/* Platform-specific definitions for uv_dlopen support. */
Packit b5b901
#define UV_DYNAMIC FAR WINAPI
Packit b5b901
typedef struct {
Packit b5b901
  HMODULE handle;
Packit b5b901
  char* errmsg;
Packit b5b901
} uv_lib_t;
Packit b5b901
Packit b5b901
#define UV_LOOP_PRIVATE_FIELDS                                                \
Packit b5b901
    /* The loop's I/O completion port */                                      \
Packit b5b901
  HANDLE iocp;                                                                \
Packit b5b901
  /* The current time according to the event loop. in msecs. */               \
Packit b5b901
  uint64_t time;                                                              \
Packit b5b901
  /* Tail of a single-linked circular queue of pending reqs. If the queue */  \
Packit b5b901
  /* is empty, tail_ is NULL. If there is only one item, */                   \
Packit b5b901
  /* tail_->next_req == tail_ */                                              \
Packit b5b901
  uv_req_t* pending_reqs_tail;                                                \
Packit b5b901
  /* Head of a single-linked list of closed handles */                        \
Packit b5b901
  uv_handle_t* endgame_handles;                                               \
Packit b5b901
  /* TODO(bnoordhuis) Stop heap-allocating |timer_heap| in libuv v2.x. */     \
Packit b5b901
  void* timer_heap;                                                           \
Packit b5b901
    /* Lists of active loop (prepare / check / idle) watchers */              \
Packit b5b901
  uv_prepare_t* prepare_handles;                                              \
Packit b5b901
  uv_check_t* check_handles;                                                  \
Packit b5b901
  uv_idle_t* idle_handles;                                                    \
Packit b5b901
  /* This pointer will refer to the prepare/check/idle handle whose */        \
Packit b5b901
  /* callback is scheduled to be called next. This is needed to allow */      \
Packit b5b901
  /* safe removal from one of the lists above while that list being */        \
Packit b5b901
  /* iterated over. */                                                        \
Packit b5b901
  uv_prepare_t* next_prepare_handle;                                          \
Packit b5b901
  uv_check_t* next_check_handle;                                              \
Packit b5b901
  uv_idle_t* next_idle_handle;                                                \
Packit b5b901
  /* This handle holds the peer sockets for the fast variant of uv_poll_t */  \
Packit b5b901
  SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT];                          \
Packit b5b901
  /* Counter to keep track of active tcp streams */                           \
Packit b5b901
  unsigned int active_tcp_streams;                                            \
Packit b5b901
  /* Counter to keep track of active udp streams */                           \
Packit b5b901
  unsigned int active_udp_streams;                                            \
Packit b5b901
  /* Counter to started timer */                                              \
Packit b5b901
  uint64_t timer_counter;                                                     \
Packit b5b901
  /* Threadpool */                                                            \
Packit b5b901
  void* wq[2];                                                                \
Packit b5b901
  uv_mutex_t wq_mutex;                                                        \
Packit b5b901
  uv_async_t wq_async;
Packit b5b901
Packit b5b901
#define UV_REQ_TYPE_PRIVATE                                                   \
Packit b5b901
  /* TODO: remove the req suffix */                                           \
Packit b5b901
  UV_ACCEPT,                                                                  \
Packit b5b901
  UV_FS_EVENT_REQ,                                                            \
Packit b5b901
  UV_POLL_REQ,                                                                \
Packit b5b901
  UV_PROCESS_EXIT,                                                            \
Packit b5b901
  UV_READ,                                                                    \
Packit b5b901
  UV_UDP_RECV,                                                                \
Packit b5b901
  UV_WAKEUP,                                                                  \
Packit b5b901
  UV_SIGNAL_REQ,
Packit b5b901
Packit b5b901
#define UV_REQ_PRIVATE_FIELDS                                                 \
Packit b5b901
  union {                                                                     \
Packit b5b901
    /* Used by I/O operations */                                              \
Packit b5b901
    struct {                                                                  \
Packit b5b901
      OVERLAPPED overlapped;                                                  \
Packit b5b901
      size_t queued_bytes;                                                    \
Packit b5b901
    } io;                                                                     \
Packit b5b901
  } u;                                                                        \
Packit b5b901
  struct uv_req_s* next_req;
Packit b5b901
Packit b5b901
#define UV_WRITE_PRIVATE_FIELDS \
Packit b5b901
  int coalesced;                \
Packit b5b901
  uv_buf_t write_buffer;        \
Packit b5b901
  HANDLE event_handle;          \
Packit b5b901
  HANDLE wait_handle;
Packit b5b901
Packit b5b901
#define UV_CONNECT_PRIVATE_FIELDS                                             \
Packit b5b901
  /* empty */
Packit b5b901
Packit b5b901
#define UV_SHUTDOWN_PRIVATE_FIELDS                                            \
Packit b5b901
  /* empty */
Packit b5b901
Packit b5b901
#define UV_UDP_SEND_PRIVATE_FIELDS                                            \
Packit b5b901
  /* empty */
Packit b5b901
Packit b5b901
#define UV_PRIVATE_REQ_TYPES                                                  \
Packit b5b901
  typedef struct uv_pipe_accept_s {                                           \
Packit b5b901
    UV_REQ_FIELDS                                                             \
Packit b5b901
    HANDLE pipeHandle;                                                        \
Packit b5b901
    struct uv_pipe_accept_s* next_pending;                                    \
Packit b5b901
  } uv_pipe_accept_t;                                                         \
Packit b5b901
                                                                              \
Packit b5b901
  typedef struct uv_tcp_accept_s {                                            \
Packit b5b901
    UV_REQ_FIELDS                                                             \
Packit b5b901
    SOCKET accept_socket;                                                     \
Packit b5b901
    char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32];             \
Packit b5b901
    HANDLE event_handle;                                                      \
Packit b5b901
    HANDLE wait_handle;                                                       \
Packit b5b901
    struct uv_tcp_accept_s* next_pending;                                     \
Packit b5b901
  } uv_tcp_accept_t;                                                          \
Packit b5b901
                                                                              \
Packit b5b901
  typedef struct uv_read_s {                                                  \
Packit b5b901
    UV_REQ_FIELDS                                                             \
Packit b5b901
    HANDLE event_handle;                                                      \
Packit b5b901
    HANDLE wait_handle;                                                       \
Packit b5b901
  } uv_read_t;
Packit b5b901
Packit b5b901
#define uv_stream_connection_fields                                           \
Packit b5b901
  unsigned int write_reqs_pending;                                            \
Packit b5b901
  uv_shutdown_t* shutdown_req;
Packit b5b901
Packit b5b901
#define uv_stream_server_fields                                               \
Packit b5b901
  uv_connection_cb connection_cb;
Packit b5b901
Packit b5b901
#define UV_STREAM_PRIVATE_FIELDS                                              \
Packit b5b901
  unsigned int reqs_pending;                                                  \
Packit b5b901
  int activecnt;                                                              \
Packit b5b901
  uv_read_t read_req;                                                         \
Packit b5b901
  union {                                                                     \
Packit b5b901
    struct { uv_stream_connection_fields } conn;                              \
Packit b5b901
    struct { uv_stream_server_fields     } serv;                              \
Packit b5b901
  } stream;
Packit b5b901
Packit b5b901
#define uv_tcp_server_fields                                                  \
Packit b5b901
  uv_tcp_accept_t* accept_reqs;                                               \
Packit b5b901
  unsigned int processed_accepts;                                             \
Packit b5b901
  uv_tcp_accept_t* pending_accepts;                                           \
Packit b5b901
  LPFN_ACCEPTEX func_acceptex;
Packit b5b901
Packit b5b901
#define uv_tcp_connection_fields                                              \
Packit b5b901
  uv_buf_t read_buffer;                                                       \
Packit b5b901
  LPFN_CONNECTEX func_connectex;
Packit b5b901
Packit b5b901
#define UV_TCP_PRIVATE_FIELDS                                                 \
Packit b5b901
  SOCKET socket;                                                              \
Packit b5b901
  int delayed_error;                                                          \
Packit b5b901
  union {                                                                     \
Packit b5b901
    struct { uv_tcp_server_fields } serv;                                     \
Packit b5b901
    struct { uv_tcp_connection_fields } conn;                                 \
Packit b5b901
  } tcp;
Packit b5b901
Packit b5b901
#define UV_UDP_PRIVATE_FIELDS                                                 \
Packit b5b901
  SOCKET socket;                                                              \
Packit b5b901
  unsigned int reqs_pending;                                                  \
Packit b5b901
  int activecnt;                                                              \
Packit b5b901
  uv_req_t recv_req;                                                          \
Packit b5b901
  uv_buf_t recv_buffer;                                                       \
Packit b5b901
  struct sockaddr_storage recv_from;                                          \
Packit b5b901
  int recv_from_len;                                                          \
Packit b5b901
  uv_udp_recv_cb recv_cb;                                                     \
Packit b5b901
  uv_alloc_cb alloc_cb;                                                       \
Packit b5b901
  LPFN_WSARECV func_wsarecv;                                                  \
Packit b5b901
  LPFN_WSARECVFROM func_wsarecvfrom;
Packit b5b901
Packit b5b901
#define uv_pipe_server_fields                                                 \
Packit b5b901
  int pending_instances;                                                      \
Packit b5b901
  uv_pipe_accept_t* accept_reqs;                                              \
Packit b5b901
  uv_pipe_accept_t* pending_accepts;
Packit b5b901
Packit b5b901
#define uv_pipe_connection_fields                                             \
Packit b5b901
  uv_timer_t* eof_timer;                                                      \
Packit b5b901
  uv_write_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \
Packit b5b901
  DWORD ipc_remote_pid;                                                       \
Packit b5b901
  union {                                                                     \
Packit b5b901
    uint32_t payload_remaining;                                               \
Packit b5b901
    uint64_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \
Packit b5b901
  } ipc_data_frame;                                                           \
Packit b5b901
  void* ipc_xfer_queue[2];                                                    \
Packit b5b901
  int ipc_xfer_queue_length;                                                  \
Packit b5b901
  uv_write_t* non_overlapped_writes_tail;                                     \
Packit b5b901
  CRITICAL_SECTION readfile_thread_lock;                                      \
Packit b5b901
  volatile HANDLE readfile_thread_handle;
Packit b5b901
Packit b5b901
#define UV_PIPE_PRIVATE_FIELDS                                                \
Packit b5b901
  HANDLE handle;                                                              \
Packit b5b901
  WCHAR* name;                                                                \
Packit b5b901
  union {                                                                     \
Packit b5b901
    struct { uv_pipe_server_fields } serv;                                    \
Packit b5b901
    struct { uv_pipe_connection_fields } conn;                                \
Packit b5b901
  } pipe;
Packit b5b901
Packit b5b901
/* TODO: put the parser states in an union - TTY handles are always half-duplex
Packit b5b901
 * so read-state can safely overlap write-state. */
Packit b5b901
#define UV_TTY_PRIVATE_FIELDS                                                 \
Packit b5b901
  HANDLE handle;                                                              \
Packit b5b901
  union {                                                                     \
Packit b5b901
    struct {                                                                  \
Packit b5b901
      /* Used for readable TTY handles */                                     \
Packit b5b901
      /* TODO: remove me in v2.x. */                                          \
Packit b5b901
      HANDLE unused_;                                                         \
Packit b5b901
      uv_buf_t read_line_buffer;                                              \
Packit b5b901
      HANDLE read_raw_wait;                                                   \
Packit b5b901
      /* Fields used for translating win keystrokes into vt100 characters */  \
Packit b5b901
      char last_key[8];                                                       \
Packit b5b901
      unsigned char last_key_offset;                                          \
Packit b5b901
      unsigned char last_key_len;                                             \
Packit b5b901
      WCHAR last_utf16_high_surrogate;                                        \
Packit b5b901
      INPUT_RECORD last_input_record;                                         \
Packit b5b901
    } rd;                                                                     \
Packit b5b901
    struct {                                                                  \
Packit b5b901
      /* Used for writable TTY handles */                                     \
Packit b5b901
      /* utf8-to-utf16 conversion state */                                    \
Packit b5b901
      unsigned int utf8_codepoint;                                            \
Packit b5b901
      unsigned char utf8_bytes_left;                                          \
Packit b5b901
      /* eol conversion state */                                              \
Packit b5b901
      unsigned char previous_eol;                                             \
Packit b5b901
      /* ansi parser state */                                                 \
Packit Service e08953
      unsigned short ansi_parser_state;                                       \
Packit b5b901
      unsigned char ansi_csi_argc;                                            \
Packit b5b901
      unsigned short ansi_csi_argv[4];                                        \
Packit b5b901
      COORD saved_position;                                                   \
Packit b5b901
      WORD saved_attributes;                                                  \
Packit b5b901
    } wr;                                                                     \
Packit b5b901
  } tty;
Packit b5b901
Packit b5b901
#define UV_POLL_PRIVATE_FIELDS                                                \
Packit b5b901
  SOCKET socket;                                                              \
Packit b5b901
  /* Used in fast mode */                                                     \
Packit b5b901
  SOCKET peer_socket;                                                         \
Packit b5b901
  AFD_POLL_INFO afd_poll_info_1;                                              \
Packit b5b901
  AFD_POLL_INFO afd_poll_info_2;                                              \
Packit b5b901
  /* Used in fast and slow mode. */                                           \
Packit b5b901
  uv_req_t poll_req_1;                                                        \
Packit b5b901
  uv_req_t poll_req_2;                                                        \
Packit b5b901
  unsigned char submitted_events_1;                                           \
Packit b5b901
  unsigned char submitted_events_2;                                           \
Packit b5b901
  unsigned char mask_events_1;                                                \
Packit b5b901
  unsigned char mask_events_2;                                                \
Packit b5b901
  unsigned char events;
Packit b5b901
Packit b5b901
#define UV_TIMER_PRIVATE_FIELDS                                               \
Packit b5b901
  void* heap_node[3];                                                         \
Packit b5b901
  int unused;                                                                 \
Packit b5b901
  uint64_t timeout;                                                           \
Packit b5b901
  uint64_t repeat;                                                            \
Packit b5b901
  uint64_t start_id;                                                          \
Packit b5b901
  uv_timer_cb timer_cb;
Packit b5b901
Packit b5b901
#define UV_ASYNC_PRIVATE_FIELDS                                               \
Packit b5b901
  struct uv_req_s async_req;                                                  \
Packit b5b901
  uv_async_cb async_cb;                                                       \
Packit b5b901
  /* char to avoid alignment issues */                                        \
Packit b5b901
  char volatile async_sent;
Packit b5b901
Packit b5b901
#define UV_PREPARE_PRIVATE_FIELDS                                             \
Packit b5b901
  uv_prepare_t* prepare_prev;                                                 \
Packit b5b901
  uv_prepare_t* prepare_next;                                                 \
Packit b5b901
  uv_prepare_cb prepare_cb;
Packit b5b901
Packit b5b901
#define UV_CHECK_PRIVATE_FIELDS                                               \
Packit b5b901
  uv_check_t* check_prev;                                                     \
Packit b5b901
  uv_check_t* check_next;                                                     \
Packit b5b901
  uv_check_cb check_cb;
Packit b5b901
Packit b5b901
#define UV_IDLE_PRIVATE_FIELDS                                                \
Packit b5b901
  uv_idle_t* idle_prev;                                                       \
Packit b5b901
  uv_idle_t* idle_next;                                                       \
Packit b5b901
  uv_idle_cb idle_cb;
Packit b5b901
Packit b5b901
#define UV_HANDLE_PRIVATE_FIELDS                                              \
Packit b5b901
  uv_handle_t* endgame_next;                                                  \
Packit b5b901
  unsigned int flags;
Packit b5b901
Packit b5b901
#define UV_GETADDRINFO_PRIVATE_FIELDS                                         \
Packit b5b901
  struct uv__work work_req;                                                   \
Packit b5b901
  uv_getaddrinfo_cb getaddrinfo_cb;                                           \
Packit b5b901
  void* alloc;                                                                \
Packit b5b901
  WCHAR* node;                                                                \
Packit b5b901
  WCHAR* service;                                                             \
Packit b5b901
  /* The addrinfoW field is used to store a pointer to the hints, and    */   \
Packit b5b901
  /* later on to store the result of GetAddrInfoW. The final result will */   \
Packit b5b901
  /* be converted to struct addrinfo* and stored in the addrinfo field.  */   \
Packit b5b901
  struct addrinfoW* addrinfow;                                                \
Packit b5b901
  struct addrinfo* addrinfo;                                                  \
Packit b5b901
  int retcode;
Packit b5b901
Packit b5b901
#define UV_GETNAMEINFO_PRIVATE_FIELDS                                         \
Packit b5b901
  struct uv__work work_req;                                                   \
Packit b5b901
  uv_getnameinfo_cb getnameinfo_cb;                                           \
Packit b5b901
  struct sockaddr_storage storage;                                            \
Packit b5b901
  int flags;                                                                  \
Packit b5b901
  char host[NI_MAXHOST];                                                      \
Packit b5b901
  char service[NI_MAXSERV];                                                   \
Packit b5b901
  int retcode;
Packit b5b901
Packit b5b901
#define UV_PROCESS_PRIVATE_FIELDS                                             \
Packit b5b901
  struct uv_process_exit_s {                                                  \
Packit b5b901
    UV_REQ_FIELDS                                                             \
Packit b5b901
  } exit_req;                                                                 \
Packit b5b901
  BYTE* child_stdio_buffer;                                                   \
Packit b5b901
  int exit_signal;                                                            \
Packit b5b901
  HANDLE wait_handle;                                                         \
Packit b5b901
  HANDLE process_handle;                                                      \
Packit b5b901
  volatile char exit_cb_pending;
Packit b5b901
Packit b5b901
#define UV_FS_PRIVATE_FIELDS                                                  \
Packit b5b901
  struct uv__work work_req;                                                   \
Packit b5b901
  int flags;                                                                  \
Packit b5b901
  DWORD sys_errno_;                                                           \
Packit b5b901
  union {                                                                     \
Packit b5b901
    /* TODO: remove me in 0.9. */                                             \
Packit b5b901
    WCHAR* pathw;                                                             \
Packit b5b901
    int fd;                                                                   \
Packit b5b901
  } file;                                                                     \
Packit b5b901
  union {                                                                     \
Packit b5b901
    struct {                                                                  \
Packit b5b901
      int mode;                                                               \
Packit b5b901
      WCHAR* new_pathw;                                                       \
Packit b5b901
      int file_flags;                                                         \
Packit b5b901
      int fd_out;                                                             \
Packit b5b901
      unsigned int nbufs;                                                     \
Packit b5b901
      uv_buf_t* bufs;                                                         \
Packit b5b901
      int64_t offset;                                                         \
Packit b5b901
      uv_buf_t bufsml[4];                                                     \
Packit b5b901
    } info;                                                                   \
Packit b5b901
    struct {                                                                  \
Packit b5b901
      double atime;                                                           \
Packit b5b901
      double mtime;                                                           \
Packit b5b901
    } time;                                                                   \
Packit b5b901
  } fs;
Packit b5b901
Packit b5b901
#define UV_WORK_PRIVATE_FIELDS                                                \
Packit b5b901
  struct uv__work work_req;
Packit b5b901
Packit b5b901
#define UV_FS_EVENT_PRIVATE_FIELDS                                            \
Packit b5b901
  struct uv_fs_event_req_s {                                                  \
Packit b5b901
    UV_REQ_FIELDS                                                             \
Packit b5b901
  } req;                                                                      \
Packit b5b901
  HANDLE dir_handle;                                                          \
Packit b5b901
  int req_pending;                                                            \
Packit b5b901
  uv_fs_event_cb cb;                                                          \
Packit b5b901
  WCHAR* filew;                                                               \
Packit b5b901
  WCHAR* short_filew;                                                         \
Packit b5b901
  WCHAR* dirw;                                                                \
Packit b5b901
  char* buffer;
Packit b5b901
Packit b5b901
#define UV_SIGNAL_PRIVATE_FIELDS                                              \
Packit b5b901
  RB_ENTRY(uv_signal_s) tree_entry;                                           \
Packit b5b901
  struct uv_req_s signal_req;                                                 \
Packit b5b901
  unsigned long pending_signum;
Packit b5b901
Packit b5b901
#ifndef F_OK
Packit b5b901
#define F_OK 0
Packit b5b901
#endif
Packit b5b901
#ifndef R_OK
Packit b5b901
#define R_OK 4
Packit b5b901
#endif
Packit b5b901
#ifndef W_OK
Packit b5b901
#define W_OK 2
Packit b5b901
#endif
Packit b5b901
#ifndef X_OK
Packit b5b901
#define X_OK 1
Packit b5b901
#endif
Packit b5b901
Packit b5b901
/* fs open() flags supported on this platform: */
Packit b5b901
#define UV_FS_O_APPEND       _O_APPEND
Packit b5b901
#define UV_FS_O_CREAT        _O_CREAT
Packit b5b901
#define UV_FS_O_EXCL         _O_EXCL
Packit Service e08953
#define UV_FS_O_FILEMAP      0x20000000
Packit b5b901
#define UV_FS_O_RANDOM       _O_RANDOM
Packit b5b901
#define UV_FS_O_RDONLY       _O_RDONLY
Packit b5b901
#define UV_FS_O_RDWR         _O_RDWR
Packit b5b901
#define UV_FS_O_SEQUENTIAL   _O_SEQUENTIAL
Packit b5b901
#define UV_FS_O_SHORT_LIVED  _O_SHORT_LIVED
Packit b5b901
#define UV_FS_O_TEMPORARY    _O_TEMPORARY
Packit b5b901
#define UV_FS_O_TRUNC        _O_TRUNC
Packit b5b901
#define UV_FS_O_WRONLY       _O_WRONLY
Packit b5b901
Packit b5b901
/* fs open() flags supported on other platforms (or mapped on this platform): */
Packit b5b901
#define UV_FS_O_DIRECT       0x02000000 /* FILE_FLAG_NO_BUFFERING */
Packit b5b901
#define UV_FS_O_DIRECTORY    0
Packit b5b901
#define UV_FS_O_DSYNC        0x04000000 /* FILE_FLAG_WRITE_THROUGH */
Packit b5b901
#define UV_FS_O_EXLOCK       0x10000000 /* EXCLUSIVE SHARING MODE */
Packit b5b901
#define UV_FS_O_NOATIME      0
Packit b5b901
#define UV_FS_O_NOCTTY       0
Packit b5b901
#define UV_FS_O_NOFOLLOW     0
Packit b5b901
#define UV_FS_O_NONBLOCK     0
Packit b5b901
#define UV_FS_O_SYMLINK      0
Packit b5b901
#define UV_FS_O_SYNC         0x08000000 /* FILE_FLAG_WRITE_THROUGH */