PageRenderTime 46ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/deps/uv/src/win/internal.h

https://gitlab.com/GeekSir/node
C Header | 382 lines | 195 code | 88 blank | 99 comment | 0 complexity | 15247f9e80281eb2b6c0fd5567055935 MD5 | raw file
Possible License(s): 0BSD, Apache-2.0, MPL-2.0-no-copyleft-exception, JSON, WTFPL, CC-BY-SA-3.0, Unlicense, ISC, BSD-3-Clause, MIT, AGPL-3.0
  1. /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
  2. *
  3. * Permission is hereby granted, free of charge, to any person obtaining a copy
  4. * of this software and associated documentation files (the "Software"), to
  5. * deal in the Software without restriction, including without limitation the
  6. * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  7. * sell copies of the Software, and to permit persons to whom the Software is
  8. * furnished to do so, subject to the following conditions:
  9. *
  10. * The above copyright notice and this permission notice shall be included in
  11. * all copies or substantial portions of the Software.
  12. *
  13. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  18. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  19. * IN THE SOFTWARE.
  20. */
  21. #ifndef UV_WIN_INTERNAL_H_
  22. #define UV_WIN_INTERNAL_H_
  23. #include "uv.h"
  24. #include "../uv-common.h"
  25. #include "tree.h"
  26. #include "winapi.h"
  27. #include "winsock.h"
  28. #ifdef _MSC_VER
  29. # define INLINE __inline
  30. # define UV_THREAD_LOCAL __declspec( thread )
  31. #else
  32. # define INLINE inline
  33. # define UV_THREAD_LOCAL __thread
  34. #endif
  35. #ifdef _DEBUG
  36. extern UV_THREAD_LOCAL int uv__crt_assert_enabled;
  37. #define UV_BEGIN_DISABLE_CRT_ASSERT() \
  38. { \
  39. int uv__saved_crt_assert_enabled = uv__crt_assert_enabled; \
  40. uv__crt_assert_enabled = FALSE;
  41. #define UV_END_DISABLE_CRT_ASSERT() \
  42. uv__crt_assert_enabled = uv__saved_crt_assert_enabled; \
  43. }
  44. #else
  45. #define UV_BEGIN_DISABLE_CRT_ASSERT()
  46. #define UV_END_DISABLE_CRT_ASSERT()
  47. #endif
  48. /*
  49. * Handles
  50. * (also see handle-inl.h)
  51. */
  52. /* Used by all handles. */
  53. #define UV_HANDLE_CLOSED 0x00000002
  54. #define UV_HANDLE_ENDGAME_QUEUED 0x00000004
  55. /* uv-common.h: #define UV__HANDLE_CLOSING 0x00000001 */
  56. /* uv-common.h: #define UV__HANDLE_ACTIVE 0x00000040 */
  57. /* uv-common.h: #define UV__HANDLE_REF 0x00000020 */
  58. /* uv-common.h: #define UV_HANDLE_INTERNAL 0x00000080 */
  59. /* Used by streams and UDP handles. */
  60. #define UV_HANDLE_READING 0x00000100
  61. #define UV_HANDLE_BOUND 0x00000200
  62. #define UV_HANDLE_LISTENING 0x00000800
  63. #define UV_HANDLE_CONNECTION 0x00001000
  64. #define UV_HANDLE_CONNECTED 0x00002000
  65. #define UV_HANDLE_READABLE 0x00008000
  66. #define UV_HANDLE_WRITABLE 0x00010000
  67. #define UV_HANDLE_READ_PENDING 0x00020000
  68. #define UV_HANDLE_SYNC_BYPASS_IOCP 0x00040000
  69. #define UV_HANDLE_ZERO_READ 0x00080000
  70. #define UV_HANDLE_EMULATE_IOCP 0x00100000
  71. #define UV_HANDLE_BLOCKING_WRITES 0x00200000
  72. /* Used by uv_tcp_t and uv_udp_t handles */
  73. #define UV_HANDLE_IPV6 0x01000000
  74. /* Only used by uv_tcp_t handles. */
  75. #define UV_HANDLE_TCP_NODELAY 0x02000000
  76. #define UV_HANDLE_TCP_KEEPALIVE 0x04000000
  77. #define UV_HANDLE_TCP_SINGLE_ACCEPT 0x08000000
  78. #define UV_HANDLE_TCP_ACCEPT_STATE_CHANGING 0x10000000
  79. #define UV_HANDLE_TCP_SOCKET_CLOSED 0x20000000
  80. #define UV_HANDLE_SHARED_TCP_SOCKET 0x40000000
  81. /* Only used by uv_pipe_t handles. */
  82. #define UV_HANDLE_NON_OVERLAPPED_PIPE 0x01000000
  83. #define UV_HANDLE_PIPESERVER 0x02000000
  84. #define UV_HANDLE_PIPE_READ_CANCELABLE 0x04000000
  85. /* Only used by uv_tty_t handles. */
  86. #define UV_HANDLE_TTY_READABLE 0x01000000
  87. #define UV_HANDLE_TTY_RAW 0x02000000
  88. #define UV_HANDLE_TTY_SAVED_POSITION 0x04000000
  89. #define UV_HANDLE_TTY_SAVED_ATTRIBUTES 0x08000000
  90. /* Only used by uv_poll_t handles. */
  91. #define UV_HANDLE_POLL_SLOW 0x02000000
  92. /*
  93. * Requests: see req-inl.h
  94. */
  95. /*
  96. * Streams: see stream-inl.h
  97. */
  98. /*
  99. * TCP
  100. */
  101. typedef struct {
  102. WSAPROTOCOL_INFOW socket_info;
  103. int delayed_error;
  104. } uv__ipc_socket_info_ex;
  105. int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb);
  106. int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client);
  107. int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb,
  108. uv_read_cb read_cb);
  109. int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle,
  110. const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb);
  111. int uv__tcp_try_write(uv_tcp_t* handle, const uv_buf_t bufs[],
  112. unsigned int nbufs);
  113. void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req);
  114. void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle,
  115. uv_write_t* req);
  116. void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle,
  117. uv_req_t* req);
  118. void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle,
  119. uv_connect_t* req);
  120. void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp);
  121. void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle);
  122. int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex,
  123. int tcp_connection);
  124. int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid,
  125. LPWSAPROTOCOL_INFOW protocol_info);
  126. /*
  127. * UDP
  128. */
  129. void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req);
  130. void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle,
  131. uv_udp_send_t* req);
  132. void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle);
  133. void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle);
  134. /*
  135. * Pipes
  136. */
  137. int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
  138. char* name, size_t nameSize);
  139. int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb);
  140. int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client);
  141. int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb,
  142. uv_read_cb read_cb);
  143. int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle,
  144. const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb);
  145. int uv_pipe_write2(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle,
  146. const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle,
  147. uv_write_cb cb);
  148. void uv__pipe_pause_read(uv_pipe_t* handle);
  149. void uv__pipe_unpause_read(uv_pipe_t* handle);
  150. void uv__pipe_stop_read(uv_pipe_t* handle);
  151. void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle,
  152. uv_req_t* req);
  153. void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle,
  154. uv_write_t* req);
  155. void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle,
  156. uv_req_t* raw_req);
  157. void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle,
  158. uv_connect_t* req);
  159. void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle,
  160. uv_shutdown_t* req);
  161. void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle);
  162. void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle);
  163. void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle);
  164. /*
  165. * TTY
  166. */
  167. void uv_console_init();
  168. int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb,
  169. uv_read_cb read_cb);
  170. int uv_tty_read_stop(uv_tty_t* handle);
  171. int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle,
  172. const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb);
  173. int uv__tty_try_write(uv_tty_t* handle, const uv_buf_t bufs[],
  174. unsigned int nbufs);
  175. void uv_tty_close(uv_tty_t* handle);
  176. void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle,
  177. uv_req_t* req);
  178. void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle,
  179. uv_write_t* req);
  180. /* TODO: remove me */
  181. void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle,
  182. uv_req_t* raw_req);
  183. /* TODO: remove me */
  184. void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle,
  185. uv_connect_t* req);
  186. void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle);
  187. /*
  188. * Poll watchers
  189. */
  190. void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle,
  191. uv_req_t* req);
  192. int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle);
  193. void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle);
  194. /*
  195. * Timers
  196. */
  197. void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle);
  198. DWORD uv__next_timeout(const uv_loop_t* loop);
  199. void uv__time_forward(uv_loop_t* loop, uint64_t msecs);
  200. void uv_process_timers(uv_loop_t* loop);
  201. /*
  202. * Loop watchers
  203. */
  204. void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle);
  205. void uv_prepare_invoke(uv_loop_t* loop);
  206. void uv_check_invoke(uv_loop_t* loop);
  207. void uv_idle_invoke(uv_loop_t* loop);
  208. void uv__once_init();
  209. /*
  210. * Async watcher
  211. */
  212. void uv_async_close(uv_loop_t* loop, uv_async_t* handle);
  213. void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle);
  214. void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle,
  215. uv_req_t* req);
  216. /*
  217. * Signal watcher
  218. */
  219. void uv_signals_init();
  220. int uv__signal_dispatch(int signum);
  221. void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle);
  222. void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle);
  223. void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle,
  224. uv_req_t* req);
  225. /*
  226. * Spawn
  227. */
  228. void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle);
  229. void uv_process_close(uv_loop_t* loop, uv_process_t* handle);
  230. void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle);
  231. /*
  232. * Error
  233. */
  234. int uv_translate_sys_error(int sys_errno);
  235. /*
  236. * FS
  237. */
  238. void uv_fs_init();
  239. /*
  240. * FS Event
  241. */
  242. void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req,
  243. uv_fs_event_t* handle);
  244. void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle);
  245. void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle);
  246. /*
  247. * Stat poller.
  248. */
  249. void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle);
  250. /*
  251. * Utilities.
  252. */
  253. void uv__util_init();
  254. uint64_t uv__hrtime(double scale);
  255. int uv_parent_pid();
  256. __declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall);
  257. /*
  258. * Process stdio handles.
  259. */
  260. int uv__stdio_create(uv_loop_t* loop,
  261. const uv_process_options_t* options,
  262. BYTE** buffer_ptr);
  263. void uv__stdio_destroy(BYTE* buffer);
  264. void uv__stdio_noinherit(BYTE* buffer);
  265. int uv__stdio_verify(BYTE* buffer, WORD size);
  266. WORD uv__stdio_size(BYTE* buffer);
  267. HANDLE uv__stdio_handle(BYTE* buffer, int fd);
  268. /*
  269. * Winapi and ntapi utility functions
  270. */
  271. void uv_winapi_init();
  272. /*
  273. * Winsock utility functions
  274. */
  275. void uv_winsock_init();
  276. int uv_ntstatus_to_winsock_error(NTSTATUS status);
  277. BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target);
  278. BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target);
  279. int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers,
  280. DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped,
  281. LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
  282. int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers,
  283. DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr,
  284. int* addr_len, WSAOVERLAPPED *overlapped,
  285. LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine);
  286. int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in,
  287. AFD_POLL_INFO* info_out, OVERLAPPED* overlapped);
  288. /* Whether there are any non-IFS LSPs stacked on TCP */
  289. extern int uv_tcp_non_ifs_lsp_ipv4;
  290. extern int uv_tcp_non_ifs_lsp_ipv6;
  291. /* Ip address used to bind to any port at any interface */
  292. extern struct sockaddr_in uv_addr_ip4_any_;
  293. extern struct sockaddr_in6 uv_addr_ip6_any_;
  294. #endif /* UV_WIN_INTERNAL_H_ */