rbuv 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +0 -1
  6. data/README.md +6 -1
  7. data/Rakefile +42 -0
  8. data/deps/libuv/.gitignore +34 -0
  9. data/deps/libuv/.mailmap +16 -0
  10. data/deps/libuv/AUTHORS +81 -0
  11. data/deps/libuv/ChangeLog +45 -0
  12. data/deps/libuv/LICENSE +41 -0
  13. data/deps/libuv/Makefile +53 -0
  14. data/deps/libuv/README.md +118 -0
  15. data/deps/libuv/build.mk +164 -0
  16. data/deps/libuv/checksparse.sh +230 -0
  17. data/deps/libuv/common.gypi +197 -0
  18. data/deps/libuv/config-mingw.mk +48 -0
  19. data/deps/libuv/config-unix.mk +167 -0
  20. data/deps/libuv/gyp_uv +98 -0
  21. data/deps/libuv/include/uv-private/ngx-queue.h +129 -0
  22. data/deps/libuv/include/uv-private/stdint-msvc2008.h +247 -0
  23. data/deps/libuv/include/uv-private/tree.h +768 -0
  24. data/deps/libuv/include/uv-private/uv-bsd.h +34 -0
  25. data/deps/libuv/include/uv-private/uv-darwin.h +61 -0
  26. data/deps/libuv/include/uv-private/uv-linux.h +34 -0
  27. data/deps/libuv/include/uv-private/uv-sunos.h +44 -0
  28. data/deps/libuv/include/uv-private/uv-unix.h +332 -0
  29. data/deps/libuv/include/uv-private/uv-win.h +585 -0
  30. data/deps/libuv/include/uv.h +1987 -0
  31. data/deps/libuv/src/fs-poll.c +248 -0
  32. data/deps/libuv/src/inet.c +298 -0
  33. data/deps/libuv/src/unix/aix.c +393 -0
  34. data/deps/libuv/src/unix/async.c +281 -0
  35. data/deps/libuv/src/unix/core.c +714 -0
  36. data/deps/libuv/src/unix/cygwin.c +93 -0
  37. data/deps/libuv/src/unix/darwin-proctitle.m +78 -0
  38. data/deps/libuv/src/unix/darwin.c +431 -0
  39. data/deps/libuv/src/unix/dl.c +83 -0
  40. data/deps/libuv/src/unix/error.c +109 -0
  41. data/deps/libuv/src/unix/freebsd.c +343 -0
  42. data/deps/libuv/src/unix/fs.c +869 -0
  43. data/deps/libuv/src/unix/fsevents.c +299 -0
  44. data/deps/libuv/src/unix/getaddrinfo.c +159 -0
  45. data/deps/libuv/src/unix/internal.h +259 -0
  46. data/deps/libuv/src/unix/kqueue.c +347 -0
  47. data/deps/libuv/src/unix/linux-core.c +724 -0
  48. data/deps/libuv/src/unix/linux-inotify.c +236 -0
  49. data/deps/libuv/src/unix/linux-syscalls.c +388 -0
  50. data/deps/libuv/src/unix/linux-syscalls.h +150 -0
  51. data/deps/libuv/src/unix/loop-watcher.c +64 -0
  52. data/deps/libuv/src/unix/loop.c +114 -0
  53. data/deps/libuv/src/unix/netbsd.c +353 -0
  54. data/deps/libuv/src/unix/openbsd.c +304 -0
  55. data/deps/libuv/src/unix/pipe.c +261 -0
  56. data/deps/libuv/src/unix/poll.c +108 -0
  57. data/deps/libuv/src/unix/process.c +501 -0
  58. data/deps/libuv/src/unix/proctitle.c +103 -0
  59. data/deps/libuv/src/unix/signal.c +455 -0
  60. data/deps/libuv/src/unix/stream.c +1380 -0
  61. data/deps/libuv/src/unix/sunos.c +647 -0
  62. data/deps/libuv/src/unix/tcp.c +357 -0
  63. data/deps/libuv/src/unix/thread.c +431 -0
  64. data/deps/libuv/src/unix/threadpool.c +286 -0
  65. data/deps/libuv/src/unix/timer.c +153 -0
  66. data/deps/libuv/src/unix/tty.c +179 -0
  67. data/deps/libuv/src/unix/udp.c +715 -0
  68. data/deps/libuv/src/uv-common.c +431 -0
  69. data/deps/libuv/src/uv-common.h +204 -0
  70. data/deps/libuv/src/version.c +60 -0
  71. data/deps/libuv/src/win/async.c +99 -0
  72. data/deps/libuv/src/win/atomicops-inl.h +56 -0
  73. data/deps/libuv/src/win/core.c +310 -0
  74. data/deps/libuv/src/win/dl.c +86 -0
  75. data/deps/libuv/src/win/error.c +164 -0
  76. data/deps/libuv/src/win/fs-event.c +506 -0
  77. data/deps/libuv/src/win/fs.c +1951 -0
  78. data/deps/libuv/src/win/getaddrinfo.c +365 -0
  79. data/deps/libuv/src/win/handle-inl.h +164 -0
  80. data/deps/libuv/src/win/handle.c +153 -0
  81. data/deps/libuv/src/win/internal.h +346 -0
  82. data/deps/libuv/src/win/loop-watcher.c +124 -0
  83. data/deps/libuv/src/win/pipe.c +1656 -0
  84. data/deps/libuv/src/win/poll.c +615 -0
  85. data/deps/libuv/src/win/process-stdio.c +503 -0
  86. data/deps/libuv/src/win/process.c +1048 -0
  87. data/deps/libuv/src/win/req-inl.h +224 -0
  88. data/deps/libuv/src/win/req.c +25 -0
  89. data/deps/libuv/src/win/signal.c +354 -0
  90. data/deps/libuv/src/win/stream-inl.h +67 -0
  91. data/deps/libuv/src/win/stream.c +198 -0
  92. data/deps/libuv/src/win/tcp.c +1422 -0
  93. data/deps/libuv/src/win/thread.c +666 -0
  94. data/deps/libuv/src/win/threadpool.c +82 -0
  95. data/deps/libuv/src/win/timer.c +230 -0
  96. data/deps/libuv/src/win/tty.c +1857 -0
  97. data/deps/libuv/src/win/udp.c +744 -0
  98. data/deps/libuv/src/win/util.c +946 -0
  99. data/deps/libuv/src/win/winapi.c +152 -0
  100. data/deps/libuv/src/win/winapi.h +4476 -0
  101. data/deps/libuv/src/win/winsock.c +560 -0
  102. data/deps/libuv/src/win/winsock.h +171 -0
  103. data/deps/libuv/test/benchmark-async-pummel.c +119 -0
  104. data/deps/libuv/test/benchmark-async.c +139 -0
  105. data/deps/libuv/test/benchmark-fs-stat.c +136 -0
  106. data/deps/libuv/test/benchmark-getaddrinfo.c +91 -0
  107. data/deps/libuv/test/benchmark-list.h +163 -0
  108. data/deps/libuv/test/benchmark-loop-count.c +90 -0
  109. data/deps/libuv/test/benchmark-million-async.c +112 -0
  110. data/deps/libuv/test/benchmark-million-timers.c +77 -0
  111. data/deps/libuv/test/benchmark-multi-accept.c +432 -0
  112. data/deps/libuv/test/benchmark-ping-pongs.c +212 -0
  113. data/deps/libuv/test/benchmark-pound.c +325 -0
  114. data/deps/libuv/test/benchmark-pump.c +459 -0
  115. data/deps/libuv/test/benchmark-sizes.c +45 -0
  116. data/deps/libuv/test/benchmark-spawn.c +163 -0
  117. data/deps/libuv/test/benchmark-tcp-write-batch.c +141 -0
  118. data/deps/libuv/test/benchmark-thread.c +64 -0
  119. data/deps/libuv/test/benchmark-udp-pummel.c +238 -0
  120. data/deps/libuv/test/blackhole-server.c +118 -0
  121. data/deps/libuv/test/dns-server.c +329 -0
  122. data/deps/libuv/test/echo-server.c +384 -0
  123. data/deps/libuv/test/fixtures/empty_file +0 -0
  124. data/deps/libuv/test/fixtures/load_error.node +1 -0
  125. data/deps/libuv/test/run-benchmarks.c +64 -0
  126. data/deps/libuv/test/run-tests.c +159 -0
  127. data/deps/libuv/test/runner-unix.c +328 -0
  128. data/deps/libuv/test/runner-unix.h +36 -0
  129. data/deps/libuv/test/runner-win.c +318 -0
  130. data/deps/libuv/test/runner-win.h +43 -0
  131. data/deps/libuv/test/runner.c +394 -0
  132. data/deps/libuv/test/runner.h +165 -0
  133. data/deps/libuv/test/task.h +122 -0
  134. data/deps/libuv/test/test-active.c +83 -0
  135. data/deps/libuv/test/test-async.c +136 -0
  136. data/deps/libuv/test/test-barrier.c +98 -0
  137. data/deps/libuv/test/test-callback-order.c +77 -0
  138. data/deps/libuv/test/test-callback-stack.c +204 -0
  139. data/deps/libuv/test/test-condvar.c +173 -0
  140. data/deps/libuv/test/test-connection-fail.c +150 -0
  141. data/deps/libuv/test/test-cwd-and-chdir.c +64 -0
  142. data/deps/libuv/test/test-delayed-accept.c +189 -0
  143. data/deps/libuv/test/test-dlerror.c +58 -0
  144. data/deps/libuv/test/test-embed.c +136 -0
  145. data/deps/libuv/test/test-error.c +59 -0
  146. data/deps/libuv/test/test-fail-always.c +29 -0
  147. data/deps/libuv/test/test-fs-event.c +504 -0
  148. data/deps/libuv/test/test-fs-poll.c +148 -0
  149. data/deps/libuv/test/test-fs.c +1899 -0
  150. data/deps/libuv/test/test-get-currentexe.c +63 -0
  151. data/deps/libuv/test/test-get-loadavg.c +36 -0
  152. data/deps/libuv/test/test-get-memory.c +38 -0
  153. data/deps/libuv/test/test-getaddrinfo.c +120 -0
  154. data/deps/libuv/test/test-getsockname.c +344 -0
  155. data/deps/libuv/test/test-hrtime.c +54 -0
  156. data/deps/libuv/test/test-idle.c +82 -0
  157. data/deps/libuv/test/test-ipc-send-recv.c +218 -0
  158. data/deps/libuv/test/test-ipc.c +625 -0
  159. data/deps/libuv/test/test-list.h +492 -0
  160. data/deps/libuv/test/test-loop-handles.c +337 -0
  161. data/deps/libuv/test/test-loop-stop.c +73 -0
  162. data/deps/libuv/test/test-multiple-listen.c +103 -0
  163. data/deps/libuv/test/test-mutexes.c +63 -0
  164. data/deps/libuv/test/test-pass-always.c +28 -0
  165. data/deps/libuv/test/test-ping-pong.c +250 -0
  166. data/deps/libuv/test/test-pipe-bind-error.c +144 -0
  167. data/deps/libuv/test/test-pipe-connect-error.c +98 -0
  168. data/deps/libuv/test/test-platform-output.c +87 -0
  169. data/deps/libuv/test/test-poll-close.c +73 -0
  170. data/deps/libuv/test/test-poll.c +575 -0
  171. data/deps/libuv/test/test-process-title.c +49 -0
  172. data/deps/libuv/test/test-ref.c +415 -0
  173. data/deps/libuv/test/test-run-nowait.c +46 -0
  174. data/deps/libuv/test/test-run-once.c +49 -0
  175. data/deps/libuv/test/test-semaphore.c +111 -0
  176. data/deps/libuv/test/test-shutdown-close.c +105 -0
  177. data/deps/libuv/test/test-shutdown-eof.c +184 -0
  178. data/deps/libuv/test/test-signal-multiple-loops.c +270 -0
  179. data/deps/libuv/test/test-signal.c +152 -0
  180. data/deps/libuv/test/test-spawn.c +938 -0
  181. data/deps/libuv/test/test-stdio-over-pipes.c +250 -0
  182. data/deps/libuv/test/test-tcp-bind-error.c +198 -0
  183. data/deps/libuv/test/test-tcp-bind6-error.c +159 -0
  184. data/deps/libuv/test/test-tcp-close-while-connecting.c +81 -0
  185. data/deps/libuv/test/test-tcp-close.c +130 -0
  186. data/deps/libuv/test/test-tcp-connect-error-after-write.c +96 -0
  187. data/deps/libuv/test/test-tcp-connect-error.c +71 -0
  188. data/deps/libuv/test/test-tcp-connect-timeout.c +86 -0
  189. data/deps/libuv/test/test-tcp-connect6-error.c +69 -0
  190. data/deps/libuv/test/test-tcp-flags.c +52 -0
  191. data/deps/libuv/test/test-tcp-open.c +175 -0
  192. data/deps/libuv/test/test-tcp-read-stop.c +73 -0
  193. data/deps/libuv/test/test-tcp-shutdown-after-write.c +132 -0
  194. data/deps/libuv/test/test-tcp-unexpected-read.c +114 -0
  195. data/deps/libuv/test/test-tcp-write-to-half-open-connection.c +136 -0
  196. data/deps/libuv/test/test-tcp-writealot.c +171 -0
  197. data/deps/libuv/test/test-thread.c +183 -0
  198. data/deps/libuv/test/test-threadpool-cancel.c +311 -0
  199. data/deps/libuv/test/test-threadpool.c +77 -0
  200. data/deps/libuv/test/test-timer-again.c +142 -0
  201. data/deps/libuv/test/test-timer.c +266 -0
  202. data/deps/libuv/test/test-tty.c +111 -0
  203. data/deps/libuv/test/test-udp-dgram-too-big.c +87 -0
  204. data/deps/libuv/test/test-udp-ipv6.c +158 -0
  205. data/deps/libuv/test/test-udp-multicast-join.c +140 -0
  206. data/deps/libuv/test/test-udp-multicast-ttl.c +87 -0
  207. data/deps/libuv/test/test-udp-open.c +154 -0
  208. data/deps/libuv/test/test-udp-options.c +87 -0
  209. data/deps/libuv/test/test-udp-send-and-recv.c +210 -0
  210. data/deps/libuv/test/test-util.c +97 -0
  211. data/deps/libuv/test/test-walk-handles.c +78 -0
  212. data/deps/libuv/uv.gyp +431 -0
  213. data/deps/libuv/vcbuild.bat +128 -0
  214. data/ext/rbuv/debug.h +27 -0
  215. data/ext/rbuv/error.c +7 -0
  216. data/ext/rbuv/error.h +10 -0
  217. data/ext/rbuv/extconf.rb +35 -0
  218. data/ext/rbuv/handle.c +40 -0
  219. data/ext/rbuv/handle.h +14 -0
  220. data/ext/rbuv/libuv.mk +12 -0
  221. data/ext/rbuv/loop.c +50 -0
  222. data/ext/rbuv/loop.h +13 -0
  223. data/ext/rbuv/rbuv.c +15 -0
  224. data/ext/rbuv/rbuv.h +27 -0
  225. data/ext/rbuv/timer.c +133 -0
  226. data/ext/rbuv/timer.h +13 -0
  227. data/lib/rbuv/timer.rb +7 -0
  228. data/lib/rbuv/version.rb +1 -1
  229. data/lib/rbuv.rb +24 -2
  230. data/rbuv.gemspec +5 -1
  231. data/spec/spec_helper.rb +22 -0
  232. data/spec/timer_spec.rb +144 -0
  233. metadata +278 -9
@@ -0,0 +1,431 @@
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
+
22
+ #include "uv.h"
23
+ #include "uv-common.h"
24
+
25
+ #include <stdio.h>
26
+ #include <assert.h>
27
+ #include <stddef.h> /* NULL */
28
+ #include <stdlib.h> /* malloc */
29
+ #include <string.h> /* memset */
30
+
31
+
32
+ #define XX(uc, lc) case UV_##uc: return sizeof(uv_##lc##_t);
33
+
34
+ size_t uv_handle_size(uv_handle_type type) {
35
+ switch (type) {
36
+ UV_HANDLE_TYPE_MAP(XX)
37
+ default:
38
+ return -1;
39
+ }
40
+ }
41
+
42
+ size_t uv_req_size(uv_req_type type) {
43
+ switch(type) {
44
+ UV_REQ_TYPE_MAP(XX)
45
+ default:
46
+ return -1;
47
+ }
48
+ }
49
+
50
+ #undef XX
51
+
52
+ size_t uv_strlcpy(char* dst, const char* src, size_t size) {
53
+ size_t n;
54
+
55
+ if (size == 0)
56
+ return 0;
57
+
58
+ for (n = 0; n < (size - 1) && *src != '\0'; n++)
59
+ *dst++ = *src++;
60
+
61
+ *dst = '\0';
62
+
63
+ return n;
64
+ }
65
+
66
+
67
+ size_t uv_strlcat(char* dst, const char* src, size_t size) {
68
+ size_t n;
69
+
70
+ if (size == 0)
71
+ return 0;
72
+
73
+ for (n = 0; n < size && *dst != '\0'; n++, dst++);
74
+
75
+ if (n == size)
76
+ return n;
77
+
78
+ while (n < (size - 1) && *src != '\0')
79
+ n++, *dst++ = *src++;
80
+
81
+ *dst = '\0';
82
+
83
+ return n;
84
+ }
85
+
86
+
87
+ uv_buf_t uv_buf_init(char* base, unsigned int len) {
88
+ uv_buf_t buf;
89
+ buf.base = base;
90
+ buf.len = len;
91
+ return buf;
92
+ }
93
+
94
+
95
+ const uv_err_t uv_ok_ = { UV_OK, 0 };
96
+
97
+ #define UV_ERR_NAME_GEN(val, name, s) case UV_##name : return #name;
98
+ const char* uv_err_name(uv_err_t err) {
99
+ switch (err.code) {
100
+ UV_ERRNO_MAP(UV_ERR_NAME_GEN)
101
+ default:
102
+ assert(0);
103
+ return NULL;
104
+ }
105
+ }
106
+ #undef UV_ERR_NAME_GEN
107
+
108
+
109
+ #define UV_STRERROR_GEN(val, name, s) case UV_##name : return s;
110
+ const char* uv_strerror(uv_err_t err) {
111
+ switch (err.code) {
112
+ UV_ERRNO_MAP(UV_STRERROR_GEN)
113
+ default:
114
+ return "Unknown system error";
115
+ }
116
+ }
117
+ #undef UV_STRERROR_GEN
118
+
119
+
120
+ int uv__set_error(uv_loop_t* loop, uv_err_code code, int sys_error) {
121
+ loop->last_err.code = code;
122
+ loop->last_err.sys_errno_ = sys_error;
123
+ return -1;
124
+ }
125
+
126
+
127
+ int uv__set_sys_error(uv_loop_t* loop, int sys_error) {
128
+ loop->last_err.code = uv_translate_sys_error(sys_error);
129
+ loop->last_err.sys_errno_ = sys_error;
130
+ return -1;
131
+ }
132
+
133
+
134
+ int uv__set_artificial_error(uv_loop_t* loop, uv_err_code code) {
135
+ loop->last_err = uv__new_artificial_error(code);
136
+ return -1;
137
+ }
138
+
139
+
140
+ uv_err_t uv__new_sys_error(int sys_error) {
141
+ uv_err_t error;
142
+ error.code = uv_translate_sys_error(sys_error);
143
+ error.sys_errno_ = sys_error;
144
+ return error;
145
+ }
146
+
147
+
148
+ uv_err_t uv__new_artificial_error(uv_err_code code) {
149
+ uv_err_t error;
150
+ error.code = code;
151
+ error.sys_errno_ = 0;
152
+ return error;
153
+ }
154
+
155
+
156
+ uv_err_t uv_last_error(uv_loop_t* loop) {
157
+ return loop->last_err;
158
+ }
159
+
160
+
161
+ struct sockaddr_in uv_ip4_addr(const char* ip, int port) {
162
+ struct sockaddr_in addr;
163
+
164
+ memset(&addr, 0, sizeof(struct sockaddr_in));
165
+
166
+ addr.sin_family = AF_INET;
167
+ addr.sin_port = htons(port);
168
+ addr.sin_addr.s_addr = inet_addr(ip);
169
+
170
+ return addr;
171
+ }
172
+
173
+
174
+ struct sockaddr_in6 uv_ip6_addr(const char* ip, int port) {
175
+ struct sockaddr_in6 addr;
176
+
177
+ memset(&addr, 0, sizeof(struct sockaddr_in6));
178
+
179
+ addr.sin6_family = AF_INET6;
180
+ addr.sin6_port = htons(port);
181
+ uv_inet_pton(AF_INET6, ip, &addr.sin6_addr);
182
+
183
+ return addr;
184
+ }
185
+
186
+
187
+ int uv_ip4_name(struct sockaddr_in* src, char* dst, size_t size) {
188
+ uv_err_t err = uv_inet_ntop(AF_INET, &src->sin_addr, dst, size);
189
+ return err.code != UV_OK;
190
+ }
191
+
192
+
193
+ int uv_ip6_name(struct sockaddr_in6* src, char* dst, size_t size) {
194
+ uv_err_t err = uv_inet_ntop(AF_INET6, &src->sin6_addr, dst, size);
195
+ return err.code != UV_OK;
196
+ }
197
+
198
+
199
+ int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
200
+ if (handle->type != UV_TCP || addr.sin_family != AF_INET)
201
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
202
+ else
203
+ return uv__tcp_bind(handle, addr);
204
+ }
205
+
206
+
207
+ int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
208
+ if (handle->type != UV_TCP || addr.sin6_family != AF_INET6)
209
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
210
+ else
211
+ return uv__tcp_bind6(handle, addr);
212
+ }
213
+
214
+
215
+ int uv_udp_bind(uv_udp_t* handle,
216
+ struct sockaddr_in addr,
217
+ unsigned int flags) {
218
+ if (handle->type != UV_UDP || addr.sin_family != AF_INET)
219
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
220
+ else
221
+ return uv__udp_bind(handle, addr, flags);
222
+ }
223
+
224
+
225
+ int uv_udp_bind6(uv_udp_t* handle,
226
+ struct sockaddr_in6 addr,
227
+ unsigned int flags) {
228
+ if (handle->type != UV_UDP || addr.sin6_family != AF_INET6)
229
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
230
+ else
231
+ return uv__udp_bind6(handle, addr, flags);
232
+ }
233
+
234
+
235
+ int uv_tcp_connect(uv_connect_t* req,
236
+ uv_tcp_t* handle,
237
+ struct sockaddr_in address,
238
+ uv_connect_cb cb) {
239
+ if (handle->type != UV_TCP || address.sin_family != AF_INET)
240
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
241
+ else
242
+ return uv__tcp_connect(req, handle, address, cb);
243
+ }
244
+
245
+
246
+ int uv_tcp_connect6(uv_connect_t* req,
247
+ uv_tcp_t* handle,
248
+ struct sockaddr_in6 address,
249
+ uv_connect_cb cb) {
250
+ if (handle->type != UV_TCP || address.sin6_family != AF_INET6)
251
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
252
+ else
253
+ return uv__tcp_connect6(req, handle, address, cb);
254
+ }
255
+
256
+
257
+ int uv_udp_send(uv_udp_send_t* req,
258
+ uv_udp_t* handle,
259
+ uv_buf_t bufs[],
260
+ int bufcnt,
261
+ struct sockaddr_in addr,
262
+ uv_udp_send_cb send_cb) {
263
+ if (handle->type != UV_UDP || addr.sin_family != AF_INET) {
264
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
265
+ }
266
+
267
+ return uv__udp_send(req, handle, bufs, bufcnt, addr, send_cb);
268
+ }
269
+
270
+
271
+ int uv_udp_send6(uv_udp_send_t* req,
272
+ uv_udp_t* handle,
273
+ uv_buf_t bufs[],
274
+ int bufcnt,
275
+ struct sockaddr_in6 addr,
276
+ uv_udp_send_cb send_cb) {
277
+ if (handle->type != UV_UDP || addr.sin6_family != AF_INET6) {
278
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
279
+ }
280
+
281
+ return uv__udp_send6(req, handle, bufs, bufcnt, addr, send_cb);
282
+ }
283
+
284
+
285
+ int uv_udp_recv_start(uv_udp_t* handle,
286
+ uv_alloc_cb alloc_cb,
287
+ uv_udp_recv_cb recv_cb) {
288
+ if (handle->type != UV_UDP || alloc_cb == NULL || recv_cb == NULL) {
289
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
290
+ }
291
+
292
+ return uv__udp_recv_start(handle, alloc_cb, recv_cb);
293
+ }
294
+
295
+
296
+ int uv_udp_recv_stop(uv_udp_t* handle) {
297
+ if (handle->type != UV_UDP) {
298
+ return uv__set_artificial_error(handle->loop, UV_EINVAL);
299
+ }
300
+
301
+ return uv__udp_recv_stop(handle);
302
+ }
303
+
304
+ #ifdef _WIN32
305
+ static UINT __stdcall uv__thread_start(void *ctx_v)
306
+ #else
307
+ static void *uv__thread_start(void *ctx_v)
308
+ #endif
309
+ {
310
+ void (*entry)(void *arg);
311
+ void *arg;
312
+
313
+ struct {
314
+ void (*entry)(void *arg);
315
+ void *arg;
316
+ } *ctx;
317
+
318
+ ctx = ctx_v;
319
+ arg = ctx->arg;
320
+ entry = ctx->entry;
321
+ free(ctx);
322
+ entry(arg);
323
+
324
+ return 0;
325
+ }
326
+
327
+
328
+ int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) {
329
+ struct {
330
+ void (*entry)(void *arg);
331
+ void *arg;
332
+ } *ctx;
333
+
334
+ if ((ctx = malloc(sizeof *ctx)) == NULL)
335
+ return -1;
336
+
337
+ ctx->entry = entry;
338
+ ctx->arg = arg;
339
+
340
+ #ifdef _WIN32
341
+ *tid = (HANDLE) _beginthreadex(NULL, 0, uv__thread_start, ctx, 0, NULL);
342
+ if (*tid == 0) {
343
+ #else
344
+ if (pthread_create(tid, NULL, uv__thread_start, ctx)) {
345
+ #endif
346
+ free(ctx);
347
+ return -1;
348
+ }
349
+
350
+ return 0;
351
+ }
352
+
353
+
354
+ unsigned long uv_thread_self(void) {
355
+ #ifdef _WIN32
356
+ return (unsigned long) GetCurrentThreadId();
357
+ #else
358
+ return (unsigned long) pthread_self();
359
+ #endif
360
+ }
361
+
362
+
363
+ void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) {
364
+ ngx_queue_t* q;
365
+ uv_handle_t* h;
366
+
367
+ ngx_queue_foreach(q, &loop->handle_queue) {
368
+ h = ngx_queue_data(q, uv_handle_t, handle_queue);
369
+ if (h->flags & UV__HANDLE_INTERNAL) continue;
370
+ walk_cb(h, arg);
371
+ }
372
+ }
373
+
374
+
375
+ #ifndef NDEBUG
376
+ static void uv__print_handles(uv_loop_t* loop, int only_active) {
377
+ const char* type;
378
+ ngx_queue_t* q;
379
+ uv_handle_t* h;
380
+
381
+ if (loop == NULL)
382
+ loop = uv_default_loop();
383
+
384
+ ngx_queue_foreach(q, &loop->handle_queue) {
385
+ h = ngx_queue_data(q, uv_handle_t, handle_queue);
386
+
387
+ if (only_active && !uv__is_active(h))
388
+ continue;
389
+
390
+ switch (h->type) {
391
+ #define X(uc, lc) case UV_##uc: type = #lc; break;
392
+ UV_HANDLE_TYPE_MAP(X)
393
+ #undef X
394
+ default: type = "<unknown>";
395
+ }
396
+
397
+ fprintf(stderr,
398
+ "[%c%c%c] %-8s %p\n",
399
+ "R-"[!(h->flags & UV__HANDLE_REF)],
400
+ "A-"[!(h->flags & UV__HANDLE_ACTIVE)],
401
+ "I-"[!(h->flags & UV__HANDLE_INTERNAL)],
402
+ type,
403
+ (void*)h);
404
+ }
405
+ }
406
+
407
+
408
+ void uv_print_all_handles(uv_loop_t* loop) {
409
+ uv__print_handles(loop, 0);
410
+ }
411
+
412
+
413
+ void uv_print_active_handles(uv_loop_t* loop) {
414
+ uv__print_handles(loop, 1);
415
+ }
416
+ #endif
417
+
418
+
419
+ void uv_ref(uv_handle_t* handle) {
420
+ uv__handle_ref(handle);
421
+ }
422
+
423
+
424
+ void uv_unref(uv_handle_t* handle) {
425
+ uv__handle_unref(handle);
426
+ }
427
+
428
+
429
+ void uv_stop(uv_loop_t* loop) {
430
+ loop->stop_flag = 1;
431
+ }
@@ -0,0 +1,204 @@
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
+
22
+ /*
23
+ * This file is private to libuv. It provides common functionality to both
24
+ * Windows and Unix backends.
25
+ */
26
+
27
+ #ifndef UV_COMMON_H_
28
+ #define UV_COMMON_H_
29
+
30
+ #include <assert.h>
31
+ #include <stddef.h>
32
+
33
+ #if defined(_MSC_VER) && _MSC_VER < 1600
34
+ # include "uv-private/stdint-msvc2008.h"
35
+ #else
36
+ # include <stdint.h>
37
+ #endif
38
+
39
+ #include "uv.h"
40
+ #include "tree.h"
41
+
42
+
43
+ #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
44
+
45
+ #define container_of(ptr, type, member) \
46
+ ((type *) ((char *) (ptr) - offsetof(type, member)))
47
+
48
+ #ifdef _MSC_VER
49
+ # define UNUSED /* empty */
50
+ # define INLINE __inline
51
+ #else
52
+ # define UNUSED __attribute__((unused))
53
+ # define INLINE inline
54
+ #endif
55
+
56
+
57
+ #ifndef _WIN32
58
+ enum {
59
+ UV__HANDLE_INTERNAL = 0x8000,
60
+ UV__HANDLE_ACTIVE = 0x4000,
61
+ UV__HANDLE_REF = 0x2000,
62
+ UV__HANDLE_CLOSING = 0 /* no-op on unix */
63
+ };
64
+ #else
65
+ # define UV__HANDLE_INTERNAL 0x80
66
+ # define UV__HANDLE_ACTIVE 0x40
67
+ # define UV__HANDLE_REF 0x20
68
+ # define UV__HANDLE_CLOSING 0x01
69
+ #endif
70
+
71
+ extern const uv_err_t uv_ok_;
72
+
73
+ uv_err_code uv_translate_sys_error(int sys_errno);
74
+ int uv__set_error(uv_loop_t* loop, uv_err_code code, int sys_error);
75
+ int uv__set_sys_error(uv_loop_t* loop, int sys_error);
76
+ int uv__set_artificial_error(uv_loop_t* loop, uv_err_code code);
77
+ uv_err_t uv__new_sys_error(int sys_error);
78
+ uv_err_t uv__new_artificial_error(uv_err_code code);
79
+
80
+ int uv__tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr);
81
+ int uv__tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr);
82
+
83
+ int uv__udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags);
84
+ int uv__udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags);
85
+
86
+ int uv__tcp_connect(uv_connect_t* req,
87
+ uv_tcp_t* handle,
88
+ struct sockaddr_in address,
89
+ uv_connect_cb cb);
90
+
91
+ int uv__tcp_connect6(uv_connect_t* req,
92
+ uv_tcp_t* handle,
93
+ struct sockaddr_in6 address,
94
+ uv_connect_cb cb);
95
+
96
+ int uv__udp_send(uv_udp_send_t* req,
97
+ uv_udp_t* handle,
98
+ uv_buf_t bufs[],
99
+ int bufcnt,
100
+ struct sockaddr_in addr,
101
+ uv_udp_send_cb send_cb);
102
+
103
+ int uv__udp_send6(uv_udp_send_t* req,
104
+ uv_udp_t* handle,
105
+ uv_buf_t bufs[],
106
+ int bufcnt,
107
+ struct sockaddr_in6 addr,
108
+ uv_udp_send_cb send_cb);
109
+
110
+ int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloccb,
111
+ uv_udp_recv_cb recv_cb);
112
+
113
+ int uv__udp_recv_stop(uv_udp_t* handle);
114
+
115
+ void uv__fs_poll_close(uv_fs_poll_t* handle);
116
+
117
+
118
+ #define uv__has_active_reqs(loop) \
119
+ (ngx_queue_empty(&(loop)->active_reqs) == 0)
120
+
121
+ #define uv__req_register(loop, req) \
122
+ do { \
123
+ ngx_queue_insert_tail(&(loop)->active_reqs, &(req)->active_queue); \
124
+ } \
125
+ while (0)
126
+
127
+ #define uv__req_unregister(loop, req) \
128
+ do { \
129
+ assert(uv__has_active_reqs(loop)); \
130
+ ngx_queue_remove(&(req)->active_queue); \
131
+ } \
132
+ while (0)
133
+
134
+ #define uv__has_active_handles(loop) \
135
+ ((loop)->active_handles > 0)
136
+
137
+ #define uv__active_handle_add(h) \
138
+ do { \
139
+ (h)->loop->active_handles++; \
140
+ } \
141
+ while (0)
142
+
143
+ #define uv__active_handle_rm(h) \
144
+ do { \
145
+ (h)->loop->active_handles--; \
146
+ } \
147
+ while (0)
148
+
149
+ #define uv__is_active(h) \
150
+ (((h)->flags & UV__HANDLE_ACTIVE) != 0)
151
+
152
+ #define uv__handle_start(h) \
153
+ do { \
154
+ assert(((h)->flags & UV__HANDLE_CLOSING) == 0); \
155
+ if (((h)->flags & UV__HANDLE_ACTIVE) != 0) break; \
156
+ (h)->flags |= UV__HANDLE_ACTIVE; \
157
+ if (((h)->flags & UV__HANDLE_REF) != 0) uv__active_handle_add(h); \
158
+ } \
159
+ while (0)
160
+
161
+ #define uv__handle_stop(h) \
162
+ do { \
163
+ assert(((h)->flags & UV__HANDLE_CLOSING) == 0); \
164
+ if (((h)->flags & UV__HANDLE_ACTIVE) == 0) break; \
165
+ (h)->flags &= ~UV__HANDLE_ACTIVE; \
166
+ if (((h)->flags & UV__HANDLE_REF) != 0) uv__active_handle_rm(h); \
167
+ } \
168
+ while (0)
169
+
170
+ #define uv__handle_ref(h) \
171
+ do { \
172
+ if (((h)->flags & UV__HANDLE_REF) != 0) break; \
173
+ (h)->flags |= UV__HANDLE_REF; \
174
+ if (((h)->flags & UV__HANDLE_CLOSING) != 0) break; \
175
+ if (((h)->flags & UV__HANDLE_ACTIVE) != 0) uv__active_handle_add(h); \
176
+ } \
177
+ while (0)
178
+
179
+ #define uv__handle_unref(h) \
180
+ do { \
181
+ if (((h)->flags & UV__HANDLE_REF) == 0) break; \
182
+ (h)->flags &= ~UV__HANDLE_REF; \
183
+ if (((h)->flags & UV__HANDLE_CLOSING) != 0) break; \
184
+ if (((h)->flags & UV__HANDLE_ACTIVE) != 0) uv__active_handle_rm(h); \
185
+ } \
186
+ while (0)
187
+
188
+ #if defined(_WIN32)
189
+ # define uv__handle_platform_init(h)
190
+ #else
191
+ # define uv__handle_platform_init(h) ((h)->next_closing = NULL)
192
+ #endif
193
+
194
+ #define uv__handle_init(loop_, h, type_) \
195
+ do { \
196
+ (h)->loop = (loop_); \
197
+ (h)->type = (type_); \
198
+ (h)->flags = UV__HANDLE_REF; /* Ref the loop when active. */ \
199
+ ngx_queue_insert_tail(&(loop_)->handle_queue, &(h)->handle_queue); \
200
+ uv__handle_platform_init(h); \
201
+ } \
202
+ while (0)
203
+
204
+ #endif /* UV_COMMON_H_ */
@@ -0,0 +1,60 @@
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
+
22
+
23
+ /*
24
+ * Versions with an even minor version (e.g. 0.6.1 or 1.0.4) are API and ABI
25
+ * stable. When the minor version is odd, the API can change between patch
26
+ * releases.
27
+ */
28
+
29
+ #define UV_VERSION_MAJOR 0
30
+ #define UV_VERSION_MINOR 10
31
+ #define UV_VERSION_PATCH 3
32
+ #define UV_VERSION_IS_RELEASE 1
33
+
34
+
35
+ #define UV_VERSION ((UV_VERSION_MAJOR << 16) | \
36
+ (UV_VERSION_MINOR << 8) | \
37
+ (UV_VERSION_PATCH))
38
+
39
+ #define UV_STRINGIFY(v) UV_STRINGIFY_HELPER(v)
40
+ #define UV_STRINGIFY_HELPER(v) #v
41
+
42
+ #define UV_VERSION_STRING_BASE UV_STRINGIFY(UV_VERSION_MAJOR) "." \
43
+ UV_STRINGIFY(UV_VERSION_MINOR) "." \
44
+ UV_STRINGIFY(UV_VERSION_PATCH)
45
+
46
+ #if UV_VERSION_IS_RELEASE
47
+ # define UV_VERSION_STRING UV_VERSION_STRING_BASE
48
+ #else
49
+ # define UV_VERSION_STRING UV_VERSION_STRING_BASE "-pre"
50
+ #endif
51
+
52
+
53
+ unsigned int uv_version(void) {
54
+ return UV_VERSION;
55
+ }
56
+
57
+
58
+ const char* uv_version_string(void) {
59
+ return UV_VERSION_STRING;
60
+ }