noderb 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (361) hide show
  1. data/ext/noderb_extension/libuv/AUTHORS +11 -1
  2. data/ext/noderb_extension/libuv/LICENSE +0 -8
  3. data/ext/noderb_extension/libuv/Makefile +5 -5
  4. data/ext/noderb_extension/libuv/README +11 -6
  5. data/ext/noderb_extension/libuv/common.gypi +158 -7
  6. data/ext/noderb_extension/libuv/config-unix.mk +34 -26
  7. data/ext/noderb_extension/libuv/gyp_uv +22 -4
  8. data/ext/noderb_extension/libuv/include/{eio.h → uv-private/eio.h} +2 -2
  9. data/ext/noderb_extension/libuv/include/{uv-unix.h → uv-private/uv-unix.h} +40 -0
  10. data/ext/noderb_extension/libuv/include/{uv-win.h → uv-private/uv-win.h} +96 -14
  11. data/ext/noderb_extension/libuv/include/uv.h +508 -83
  12. data/ext/noderb_extension/libuv/src/unix/cares.c +185 -0
  13. data/ext/noderb_extension/libuv/src/unix/core.c +828 -0
  14. data/ext/noderb_extension/libuv/src/{eio → unix/eio}/config_darwin.h +4 -0
  15. data/ext/noderb_extension/libuv/src/{eio → unix/eio}/config_linux.h +5 -15
  16. data/ext/noderb_extension/libuv/src/{eio → unix/eio}/eio.c +23 -2
  17. data/ext/noderb_extension/libuv/src/unix/error.c +102 -0
  18. data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config_linux.h +26 -15
  19. data/ext/noderb_extension/libuv/src/unix/fs.c +562 -0
  20. data/ext/noderb_extension/libuv/src/unix/internal.h +75 -0
  21. data/ext/noderb_extension/libuv/src/unix/pipe.c +282 -0
  22. data/ext/noderb_extension/libuv/src/unix/process.c +287 -0
  23. data/ext/noderb_extension/libuv/src/unix/stream.c +727 -0
  24. data/ext/noderb_extension/libuv/src/unix/tcp.c +226 -0
  25. data/ext/noderb_extension/libuv/src/unix/udp.c +524 -0
  26. data/ext/noderb_extension/libuv/src/{uv-eio.c → unix/uv-eio.c} +48 -27
  27. data/ext/noderb_extension/libuv/src/{uv-eio.h → unix/uv-eio.h} +1 -1
  28. data/ext/noderb_extension/libuv/src/uv-common.c +24 -14
  29. data/ext/noderb_extension/libuv/src/uv-common.h +12 -7
  30. data/ext/noderb_extension/libuv/src/win/async.c +14 -16
  31. data/ext/noderb_extension/libuv/src/win/cares.c +64 -79
  32. data/ext/noderb_extension/libuv/src/win/core.c +105 -53
  33. data/ext/noderb_extension/libuv/src/win/error.c +23 -13
  34. data/ext/noderb_extension/libuv/src/win/fs.c +807 -0
  35. data/ext/noderb_extension/libuv/src/win/getaddrinfo.c +61 -41
  36. data/ext/noderb_extension/libuv/src/win/handle.c +56 -30
  37. data/ext/noderb_extension/libuv/src/win/internal.h +134 -95
  38. data/ext/noderb_extension/libuv/src/win/loop-watcher.c +21 -18
  39. data/ext/noderb_extension/libuv/src/win/pipe.c +313 -158
  40. data/ext/noderb_extension/libuv/src/win/process.c +117 -131
  41. data/ext/noderb_extension/libuv/src/win/req.c +55 -31
  42. data/ext/noderb_extension/libuv/src/win/stdio.c +5 -5
  43. data/ext/noderb_extension/libuv/src/win/stream.c +19 -14
  44. data/ext/noderb_extension/libuv/src/win/tcp.c +278 -336
  45. data/ext/noderb_extension/libuv/src/win/threadpool.c +73 -0
  46. data/ext/noderb_extension/libuv/src/win/timer.c +44 -37
  47. data/ext/noderb_extension/libuv/src/win/udp.c +592 -0
  48. data/ext/noderb_extension/libuv/src/win/util.c +20 -6
  49. data/ext/noderb_extension/libuv/src/win/winapi.c +23 -6
  50. data/ext/noderb_extension/libuv/src/win/winapi.h +4206 -0
  51. data/ext/noderb_extension/libuv/src/win/winsock.c +270 -0
  52. data/ext/noderb_extension/libuv/src/win/winsock.h +134 -0
  53. data/ext/noderb_extension/libuv/test/benchmark-ares.c +10 -6
  54. data/ext/noderb_extension/libuv/test/benchmark-getaddrinfo.c +10 -7
  55. data/ext/noderb_extension/libuv/test/benchmark-list.h +21 -0
  56. data/ext/noderb_extension/libuv/test/benchmark-ping-pongs.c +11 -7
  57. data/ext/noderb_extension/libuv/test/benchmark-pound.c +147 -58
  58. data/ext/noderb_extension/libuv/test/benchmark-pump.c +29 -23
  59. data/ext/noderb_extension/libuv/test/benchmark-spawn.c +13 -10
  60. data/ext/noderb_extension/libuv/test/benchmark-udp-packet-storm.c +250 -0
  61. data/ext/noderb_extension/libuv/test/dns-server.c +11 -6
  62. data/ext/noderb_extension/libuv/test/echo-server.c +30 -22
  63. data/ext/noderb_extension/libuv/test/test-async.c +3 -3
  64. data/ext/noderb_extension/libuv/test/test-callback-stack.c +6 -6
  65. data/ext/noderb_extension/libuv/test/test-connection-fail.c +6 -5
  66. data/ext/noderb_extension/libuv/test/test-delayed-accept.c +13 -13
  67. data/ext/noderb_extension/libuv/test/test-fs.c +715 -0
  68. data/ext/noderb_extension/libuv/test/test-getaddrinfo.c +11 -8
  69. data/ext/noderb_extension/libuv/test/test-gethostbyname.c +8 -9
  70. data/ext/noderb_extension/libuv/test/test-getsockname.c +142 -16
  71. data/ext/noderb_extension/libuv/test/test-idle.c +4 -3
  72. data/ext/noderb_extension/libuv/test/test-list.h +29 -2
  73. data/ext/noderb_extension/libuv/test/test-loop-handles.c +9 -8
  74. data/ext/noderb_extension/libuv/test/test-ping-pong.c +9 -9
  75. data/ext/noderb_extension/libuv/test/test-pipe-bind-error.c +18 -14
  76. data/ext/noderb_extension/libuv/test/test-ref.c +17 -16
  77. data/ext/noderb_extension/libuv/test/test-shutdown-eof.c +5 -5
  78. data/ext/noderb_extension/libuv/test/test-spawn.c +17 -17
  79. data/ext/noderb_extension/libuv/test/test-tcp-bind-error.c +24 -18
  80. data/ext/noderb_extension/libuv/test/test-tcp-bind6-error.c +19 -14
  81. data/ext/noderb_extension/libuv/test/test-tcp-writealot.c +6 -5
  82. data/ext/noderb_extension/libuv/test/test-threadpool.c +59 -0
  83. data/ext/noderb_extension/libuv/test/test-timer-again.c +15 -12
  84. data/ext/noderb_extension/libuv/test/test-timer.c +8 -8
  85. data/ext/noderb_extension/libuv/test/test-udp-dgram-too-big.c +88 -0
  86. data/ext/noderb_extension/libuv/test/test-udp-ipv6.c +158 -0
  87. data/ext/noderb_extension/libuv/test/test-udp-send-and-recv.c +210 -0
  88. data/ext/noderb_extension/libuv/{all.gyp → uv.gyp} +75 -77
  89. data/ext/noderb_extension/libuv/vcbuild.bat +93 -0
  90. data/ext/noderb_extension/noderb.c +13 -0
  91. data/ext/noderb_extension/noderb_common.h +2 -1
  92. data/ext/noderb_extension/noderb_defer.c +54 -0
  93. data/ext/noderb_extension/noderb_defer.h +15 -0
  94. data/ext/noderb_extension/noderb_dns.c +1 -1
  95. data/ext/noderb_extension/noderb_fs.c +277 -0
  96. data/ext/noderb_extension/noderb_fs.h +27 -0
  97. data/ext/noderb_extension/noderb_process.c +5 -5
  98. data/ext/noderb_extension/noderb_tcp.c +10 -6
  99. data/ext/noderb_extension/noderb_timers.c +1 -1
  100. data/ext/noderb_extension/noderb_tools.c +42 -8
  101. data/ext/noderb_extension/noderb_tools.h +3 -1
  102. data/lib/noderb/defer.rb +25 -0
  103. data/lib/noderb/file.rb +119 -0
  104. data/lib/noderb/fs.rb +72 -0
  105. data/lib/noderb/version.rb +1 -1
  106. data/lib/noderb.rb +8 -0
  107. metadata +102 -266
  108. data/ext/noderb_extension/libuv/BSDmakefile +0 -2
  109. data/ext/noderb_extension/libuv/create-msvs-files.bat +0 -21
  110. data/ext/noderb_extension/libuv/deps/pthread-win32/ANNOUNCE +0 -482
  111. data/ext/noderb_extension/libuv/deps/pthread-win32/BUGS +0 -141
  112. data/ext/noderb_extension/libuv/deps/pthread-win32/Bmakefile +0 -268
  113. data/ext/noderb_extension/libuv/deps/pthread-win32/CONTRIBUTORS +0 -140
  114. data/ext/noderb_extension/libuv/deps/pthread-win32/COPYING +0 -150
  115. data/ext/noderb_extension/libuv/deps/pthread-win32/COPYING.LIB +0 -504
  116. data/ext/noderb_extension/libuv/deps/pthread-win32/ChangeLog +0 -5194
  117. data/ext/noderb_extension/libuv/deps/pthread-win32/FAQ +0 -451
  118. data/ext/noderb_extension/libuv/deps/pthread-win32/GNUmakefile +0 -593
  119. data/ext/noderb_extension/libuv/deps/pthread-win32/MAINTAINERS +0 -4
  120. data/ext/noderb_extension/libuv/deps/pthread-win32/Makefile +0 -516
  121. data/ext/noderb_extension/libuv/deps/pthread-win32/NEWS +0 -1245
  122. data/ext/noderb_extension/libuv/deps/pthread-win32/Nmakefile +0 -24
  123. data/ext/noderb_extension/libuv/deps/pthread-win32/Nmakefile.tests +0 -260
  124. data/ext/noderb_extension/libuv/deps/pthread-win32/PROGRESS +0 -4
  125. data/ext/noderb_extension/libuv/deps/pthread-win32/README +0 -601
  126. data/ext/noderb_extension/libuv/deps/pthread-win32/README.Borland +0 -57
  127. data/ext/noderb_extension/libuv/deps/pthread-win32/README.CV +0 -3036
  128. data/ext/noderb_extension/libuv/deps/pthread-win32/README.NONPORTABLE +0 -783
  129. data/ext/noderb_extension/libuv/deps/pthread-win32/README.Watcom +0 -62
  130. data/ext/noderb_extension/libuv/deps/pthread-win32/README.WinCE +0 -6
  131. data/ext/noderb_extension/libuv/deps/pthread-win32/TODO +0 -7
  132. data/ext/noderb_extension/libuv/deps/pthread-win32/WinCE-PORT +0 -222
  133. data/ext/noderb_extension/libuv/deps/pthread-win32/attr.c +0 -53
  134. data/ext/noderb_extension/libuv/deps/pthread-win32/autostatic.c +0 -69
  135. data/ext/noderb_extension/libuv/deps/pthread-win32/barrier.c +0 -47
  136. data/ext/noderb_extension/libuv/deps/pthread-win32/build/all.gyp +0 -207
  137. data/ext/noderb_extension/libuv/deps/pthread-win32/builddmc.bat +0 -9
  138. data/ext/noderb_extension/libuv/deps/pthread-win32/cancel.c +0 -44
  139. data/ext/noderb_extension/libuv/deps/pthread-win32/cleanup.c +0 -148
  140. data/ext/noderb_extension/libuv/deps/pthread-win32/condvar.c +0 -50
  141. data/ext/noderb_extension/libuv/deps/pthread-win32/config.h +0 -153
  142. data/ext/noderb_extension/libuv/deps/pthread-win32/context.h +0 -74
  143. data/ext/noderb_extension/libuv/deps/pthread-win32/create.c +0 -308
  144. data/ext/noderb_extension/libuv/deps/pthread-win32/dll.c +0 -92
  145. data/ext/noderb_extension/libuv/deps/pthread-win32/errno.c +0 -94
  146. data/ext/noderb_extension/libuv/deps/pthread-win32/exit.c +0 -44
  147. data/ext/noderb_extension/libuv/deps/pthread-win32/fork.c +0 -39
  148. data/ext/noderb_extension/libuv/deps/pthread-win32/global.c +0 -107
  149. data/ext/noderb_extension/libuv/deps/pthread-win32/implement.h +0 -944
  150. data/ext/noderb_extension/libuv/deps/pthread-win32/misc.c +0 -50
  151. data/ext/noderb_extension/libuv/deps/pthread-win32/mutex.c +0 -62
  152. data/ext/noderb_extension/libuv/deps/pthread-win32/need_errno.h +0 -145
  153. data/ext/noderb_extension/libuv/deps/pthread-win32/nonportable.c +0 -47
  154. data/ext/noderb_extension/libuv/deps/pthread-win32/private.c +0 -54
  155. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.c +0 -66
  156. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.dsp +0 -142
  157. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.dsw +0 -29
  158. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread.h +0 -1368
  159. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_destroy.c +0 -79
  160. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getdetachstate.c +0 -86
  161. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getinheritsched.c +0 -51
  162. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getschedparam.c +0 -52
  163. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getschedpolicy.c +0 -61
  164. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getscope.c +0 -54
  165. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getstackaddr.c +0 -97
  166. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_getstacksize.c +0 -100
  167. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_init.c +0 -117
  168. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setdetachstate.c +0 -91
  169. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setinheritsched.c +0 -57
  170. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setschedparam.c +0 -63
  171. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setschedpolicy.c +0 -55
  172. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setscope.c +0 -62
  173. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setstackaddr.c +0 -97
  174. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_attr_setstacksize.c +0 -110
  175. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrier_destroy.c +0 -103
  176. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrier_init.c +0 -69
  177. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrier_wait.c +0 -104
  178. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_destroy.c +0 -83
  179. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_getpshared.c +0 -95
  180. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_init.c +0 -85
  181. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_barrierattr_setpshared.c +0 -119
  182. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cancel.c +0 -189
  183. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_destroy.c +0 -253
  184. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_init.c +0 -167
  185. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_signal.c +0 -231
  186. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_cond_wait.c +0 -567
  187. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_destroy.c +0 -86
  188. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_getpshared.c +0 -97
  189. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_init.c +0 -87
  190. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_condattr_setpshared.c +0 -117
  191. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_delay_np.c +0 -172
  192. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_detach.c +0 -136
  193. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_equal.c +0 -76
  194. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_exit.c +0 -106
  195. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getconcurrency.c +0 -45
  196. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getschedparam.c +0 -75
  197. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getspecific.c +0 -87
  198. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getunique_np.c +0 -47
  199. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_getw32threadhandle_np.c +0 -65
  200. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_join.c +0 -157
  201. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_key_create.c +0 -108
  202. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_key_delete.c +0 -125
  203. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_kill.c +0 -105
  204. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_consistent.c +0 -187
  205. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_destroy.c +0 -148
  206. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_init.c +0 -130
  207. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_lock.c +0 -269
  208. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_timedlock.c +0 -324
  209. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_trylock.c +0 -154
  210. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutex_unlock.c +0 -175
  211. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_destroy.c +0 -83
  212. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_getkind_np.c +0 -44
  213. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_getpshared.c +0 -95
  214. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_getrobust.c +0 -113
  215. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_gettype.c +0 -56
  216. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_init.c +0 -86
  217. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_setkind_np.c +0 -44
  218. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_setpshared.c +0 -119
  219. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_setrobust.c +0 -119
  220. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_mutexattr_settype.c +0 -143
  221. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_num_processors_np.c +0 -56
  222. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_once.c +0 -79
  223. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_destroy.c +0 -143
  224. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_init.c +0 -109
  225. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_rdlock.c +0 -102
  226. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_timedrdlock.c +0 -109
  227. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_timedwrlock.c +0 -139
  228. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_tryrdlock.c +0 -102
  229. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_trywrlock.c +0 -122
  230. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_unlock.c +0 -93
  231. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlock_wrlock.c +0 -133
  232. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_destroy.c +0 -84
  233. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_getpshared.c +0 -97
  234. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_init.c +0 -83
  235. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_rwlockattr_setpshared.c +0 -120
  236. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_self.c +0 -141
  237. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setcancelstate.c +0 -125
  238. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setcanceltype.c +0 -126
  239. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setconcurrency.c +0 -53
  240. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setschedparam.c +0 -123
  241. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_setspecific.c +0 -167
  242. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_destroy.c +0 -111
  243. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_init.c +0 -123
  244. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_lock.c +0 -80
  245. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_trylock.c +0 -77
  246. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_spin_unlock.c +0 -71
  247. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_testcancel.c +0 -103
  248. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_timechange_handler_np.c +0 -108
  249. data/ext/noderb_extension/libuv/deps/pthread-win32/pthread_win32_attach_detach_np.c +0 -258
  250. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_MCS_lock.c +0 -278
  251. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_callUserDestroyRoutines.c +0 -232
  252. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_calloc.c +0 -56
  253. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_cond_check_need_init.c +0 -78
  254. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_getprocessors.c +0 -91
  255. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_is_attr.c +0 -47
  256. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_mutex_check_need_init.c +0 -92
  257. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_new.c +0 -94
  258. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_processInitialize.c +0 -92
  259. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_processTerminate.c +0 -105
  260. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_relmillisecs.c +0 -132
  261. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_reuse.c +0 -151
  262. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_rwlock_cancelwrwait.c +0 -50
  263. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_rwlock_check_need_init.c +0 -77
  264. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_semwait.c +0 -135
  265. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_spinlock_check_need_init.c +0 -78
  266. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_threadDestroy.c +0 -79
  267. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_threadStart.c +0 -357
  268. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_throw.c +0 -189
  269. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_timespec.c +0 -83
  270. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_tkAssocCreate.c +0 -118
  271. data/ext/noderb_extension/libuv/deps/pthread-win32/ptw32_tkAssocDestroy.c +0 -114
  272. data/ext/noderb_extension/libuv/deps/pthread-win32/rwlock.c +0 -51
  273. data/ext/noderb_extension/libuv/deps/pthread-win32/sched.c +0 -53
  274. data/ext/noderb_extension/libuv/deps/pthread-win32/sched.h +0 -183
  275. data/ext/noderb_extension/libuv/deps/pthread-win32/sched_get_priority_max.c +0 -134
  276. data/ext/noderb_extension/libuv/deps/pthread-win32/sched_get_priority_min.c +0 -135
  277. data/ext/noderb_extension/libuv/deps/pthread-win32/sched_getscheduler.c +0 -71
  278. data/ext/noderb_extension/libuv/deps/pthread-win32/sched_setscheduler.c +0 -83
  279. data/ext/noderb_extension/libuv/deps/pthread-win32/sched_yield.c +0 -71
  280. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_close.c +0 -58
  281. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_destroy.c +0 -144
  282. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_getvalue.c +0 -110
  283. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_init.c +0 -169
  284. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_open.c +0 -58
  285. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_post.c +0 -128
  286. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_post_multiple.c +0 -142
  287. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_timedwait.c +0 -238
  288. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_trywait.c +0 -117
  289. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_unlink.c +0 -58
  290. data/ext/noderb_extension/libuv/deps/pthread-win32/sem_wait.c +0 -187
  291. data/ext/noderb_extension/libuv/deps/pthread-win32/semaphore.c +0 -69
  292. data/ext/noderb_extension/libuv/deps/pthread-win32/semaphore.h +0 -169
  293. data/ext/noderb_extension/libuv/deps/pthread-win32/signal.c +0 -179
  294. data/ext/noderb_extension/libuv/deps/pthread-win32/spin.c +0 -46
  295. data/ext/noderb_extension/libuv/deps/pthread-win32/sync.c +0 -43
  296. data/ext/noderb_extension/libuv/deps/pthread-win32/tsd.c +0 -44
  297. data/ext/noderb_extension/libuv/deps/pthread-win32/version.rc +0 -388
  298. data/ext/noderb_extension/libuv/deps/pthread-win32/w32_CancelableWait.c +0 -161
  299. data/ext/noderb_extension/libuv/doc/iocp-links.html +0 -574
  300. data/ext/noderb_extension/libuv/src/uv-unix.c +0 -2421
  301. data/ext/noderb_extension/libuv/src/win/ntdll.h +0 -130
  302. /data/ext/noderb_extension/libuv/include/{ev.h → uv-private/ev.h} +0 -0
  303. /data/ext/noderb_extension/libuv/include/{ngx-queue.h → uv-private/ngx-queue.h} +0 -0
  304. /data/ext/noderb_extension/libuv/include/{tree.h → uv-private/tree.h} +0 -0
  305. /data/ext/noderb_extension/libuv/src/{uv-cygwin.c → unix/cygwin.c} +0 -0
  306. /data/ext/noderb_extension/libuv/src/{uv-darwin.c → unix/darwin.c} +0 -0
  307. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/Changes +0 -0
  308. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/LICENSE +0 -0
  309. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/Makefile.am +0 -0
  310. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/aclocal.m4 +0 -0
  311. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/autogen.sh +0 -0
  312. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/config.h.in +0 -0
  313. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/config_cygwin.h +0 -0
  314. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/config_freebsd.h +0 -0
  315. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/config_sunos.h +0 -0
  316. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/configure.ac +0 -0
  317. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/demo.c +0 -0
  318. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/ecb.h +0 -0
  319. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/eio.3 +0 -0
  320. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/eio.pod +0 -0
  321. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/libeio.m4 +0 -0
  322. /data/ext/noderb_extension/libuv/src/{eio → unix/eio}/xthread.h +0 -0
  323. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/Changes +0 -0
  324. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/LICENSE +0 -0
  325. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/Makefile.am +0 -0
  326. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/Makefile.in +0 -0
  327. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/README +0 -0
  328. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/aclocal.m4 +0 -0
  329. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/autogen.sh +0 -0
  330. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config.guess +0 -0
  331. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config.h.in +0 -0
  332. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config.sub +0 -0
  333. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config_cygwin.h +0 -0
  334. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config_darwin.h +0 -0
  335. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config_freebsd.h +0 -0
  336. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/config_sunos.h +0 -0
  337. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/configure +0 -0
  338. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/configure.ac +0 -0
  339. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/depcomp +0 -0
  340. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev++.h +0 -0
  341. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev.3 +0 -0
  342. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev.c +0 -0
  343. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev.pod +0 -0
  344. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_epoll.c +0 -0
  345. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_kqueue.c +0 -0
  346. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_poll.c +0 -0
  347. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_port.c +0 -0
  348. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_select.c +0 -0
  349. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_vars.h +0 -0
  350. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_win32.c +0 -0
  351. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ev_wrap.h +0 -0
  352. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/event.c +0 -0
  353. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/event.h +0 -0
  354. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/install-sh +0 -0
  355. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/libev.m4 +0 -0
  356. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/ltmain.sh +0 -0
  357. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/missing +0 -0
  358. /data/ext/noderb_extension/libuv/src/{ev → unix/ev}/mkinstalldirs +0 -0
  359. /data/ext/noderb_extension/libuv/src/{uv-freebsd.c → unix/freebsd.c} +0 -0
  360. /data/ext/noderb_extension/libuv/src/{uv-linux.c → unix/linux.c} +0 -0
  361. /data/ext/noderb_extension/libuv/src/{uv-sunos.c → unix/sunos.c} +0 -0
@@ -31,29 +31,43 @@
31
31
  /* A zero-size buffer for use by uv_pipe_read */
32
32
  static char uv_zero_[] = "";
33
33
 
34
+ /* Null uv_buf_t */
35
+ static const uv_buf_t uv_null_buf_ = { 0, NULL };
36
+
37
+ /* The timeout that the pipe will wait for the remote end to write data */
38
+ /* when the local ends wants to shut it down. */
39
+ static const int64_t eof_timeout = 50; /* ms */
40
+
41
+ static void eof_timer_init(uv_pipe_t* pipe);
42
+ static void eof_timer_start(uv_pipe_t* pipe);
43
+ static void eof_timer_stop(uv_pipe_t* pipe);
44
+ static void eof_timer_cb(uv_timer_t* timer, int status);
45
+ static void eof_timer_destroy(uv_pipe_t* pipe);
46
+ static void eof_timer_close_cb(uv_handle_t* handle);
47
+
34
48
 
35
49
  static void uv_unique_pipe_name(char* ptr, char* name, size_t size) {
36
50
  _snprintf(name, size, "\\\\.\\pipe\\uv\\%p-%d", ptr, GetCurrentProcessId());
37
51
  }
38
52
 
39
53
 
40
- int uv_pipe_init(uv_pipe_t* handle) {
41
- uv_stream_init((uv_stream_t*)handle);
54
+ int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle) {
55
+ uv_stream_init(loop, (uv_stream_t*)handle);
42
56
 
43
57
  handle->type = UV_NAMED_PIPE;
44
58
  handle->reqs_pending = 0;
45
- handle->pending_accepts = NULL;
46
- handle->name = NULL;
47
59
  handle->handle = INVALID_HANDLE_VALUE;
60
+ handle->name = NULL;
48
61
 
49
- uv_counters()->pipe_init++;
62
+ loop->counters.pipe_init++;
50
63
 
51
64
  return 0;
52
65
  }
53
66
 
54
67
 
55
- int uv_pipe_init_with_handle(uv_pipe_t* handle, HANDLE pipeHandle) {
56
- int err = uv_pipe_init(handle);
68
+ int uv_pipe_init_with_handle(uv_loop_t* loop, uv_pipe_t* handle,
69
+ HANDLE pipeHandle) {
70
+ int err = uv_pipe_init(loop, handle);
57
71
 
58
72
  if (!err) {
59
73
  /*
@@ -69,7 +83,14 @@ int uv_pipe_init_with_handle(uv_pipe_t* handle, HANDLE pipeHandle) {
69
83
  }
70
84
 
71
85
 
72
- int uv_stdio_pipe_server(uv_pipe_t* handle, DWORD access, char* name, size_t nameSize) {
86
+ static void uv_pipe_connection_init(uv_pipe_t* handle) {
87
+ uv_connection_init((uv_stream_t*) handle);
88
+ handle->eof_timer = NULL;
89
+ }
90
+
91
+
92
+ int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access,
93
+ char* name, size_t nameSize) {
73
94
  HANDLE pipeHandle;
74
95
  int errno;
75
96
  int err;
@@ -79,13 +100,9 @@ int uv_stdio_pipe_server(uv_pipe_t* handle, DWORD access, char* name, size_t nam
79
100
  uv_unique_pipe_name(ptr, name, nameSize);
80
101
 
81
102
  pipeHandle = CreateNamedPipeA(name,
82
- access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE,
83
- PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
84
- 1,
85
- 65536,
86
- 65536,
87
- 0,
88
- NULL);
103
+ access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE,
104
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0,
105
+ NULL);
89
106
 
90
107
  if (pipeHandle != INVALID_HANDLE_VALUE) {
91
108
  /* No name collisions. We're done. */
@@ -94,7 +111,7 @@ int uv_stdio_pipe_server(uv_pipe_t* handle, DWORD access, char* name, size_t nam
94
111
 
95
112
  errno = GetLastError();
96
113
  if (errno != ERROR_PIPE_BUSY && errno != ERROR_ACCESS_DENIED) {
97
- uv_set_sys_error(errno);
114
+ uv_set_sys_error(loop, errno);
98
115
  err = -1;
99
116
  goto done;
100
117
  }
@@ -104,15 +121,15 @@ int uv_stdio_pipe_server(uv_pipe_t* handle, DWORD access, char* name, size_t nam
104
121
  }
105
122
 
106
123
  if (CreateIoCompletionPort(pipeHandle,
107
- LOOP->iocp,
124
+ loop->iocp,
108
125
  (ULONG_PTR)handle,
109
126
  0) == NULL) {
110
- uv_set_sys_error(GetLastError());
127
+ uv_set_sys_error(loop, GetLastError());
111
128
  err = -1;
112
129
  goto done;
113
130
  }
114
131
 
115
- uv_connection_init((uv_stream_t*)handle);
132
+ uv_pipe_connection_init(handle);
116
133
  handle->handle = pipeHandle;
117
134
  handle->flags |= UV_HANDLE_GIVEN_OS_HANDLE;
118
135
  err = 0;
@@ -126,7 +143,8 @@ done:
126
143
  }
127
144
 
128
145
 
129
- static int uv_set_pipe_handle(uv_pipe_t* handle, HANDLE pipeHandle) {
146
+ static int uv_set_pipe_handle(uv_loop_t* loop, uv_pipe_t* handle,
147
+ HANDLE pipeHandle) {
130
148
  DWORD mode = PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT;
131
149
 
132
150
  if (!SetNamedPipeHandleState(pipeHandle, &mode, NULL, NULL)) {
@@ -134,7 +152,7 @@ static int uv_set_pipe_handle(uv_pipe_t* handle, HANDLE pipeHandle) {
134
152
  }
135
153
 
136
154
  if (CreateIoCompletionPort(pipeHandle,
137
- LOOP->iocp,
155
+ loop->iocp,
138
156
  (ULONG_PTR)handle,
139
157
  0) == NULL) {
140
158
  return -1;
@@ -146,6 +164,7 @@ static int uv_set_pipe_handle(uv_pipe_t* handle, HANDLE pipeHandle) {
146
164
 
147
165
  static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) {
148
166
  int errno;
167
+ uv_loop_t* loop;
149
168
  uv_pipe_t* handle;
150
169
  uv_shutdown_t* req;
151
170
 
@@ -153,24 +172,19 @@ static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) {
153
172
  assert(req);
154
173
  handle = (uv_pipe_t*) req->handle;
155
174
  assert(handle);
175
+ loop = handle->loop;
176
+ assert(loop);
156
177
 
157
178
  FlushFileBuffers(handle->handle);
158
179
 
159
180
  /* Post completed */
160
- if (!PostQueuedCompletionStatus(LOOP->iocp,
161
- 0,
162
- 0,
163
- &req->overlapped)) {
164
- uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus");
165
- }
181
+ POST_COMPLETION_FOR_REQ(loop, req);
166
182
 
167
183
  return 0;
168
184
  }
169
185
 
170
186
 
171
- void uv_pipe_endgame(uv_pipe_t* handle) {
172
- uv_err_t err;
173
- int status;
187
+ void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) {
174
188
  unsigned int uv_alloced;
175
189
  DWORD result;
176
190
  uv_shutdown_t* req;
@@ -195,7 +209,7 @@ void uv_pipe_endgame(uv_pipe_t* handle) {
195
209
  /* Failure */
196
210
  handle->flags &= ~UV_HANDLE_SHUTTING;
197
211
  if (req->cb) {
198
- uv_set_sys_error(pRtlNtStatusToDosError(nt_status));
212
+ uv_set_sys_error(loop, pRtlNtStatusToDosError(nt_status));
199
213
  req->cb(req, -1);
200
214
  }
201
215
  DECREASE_PENDING_REQ_COUNT(handle);
@@ -203,12 +217,10 @@ void uv_pipe_endgame(uv_pipe_t* handle) {
203
217
  }
204
218
 
205
219
  if (pipe_info.OutboundQuota == pipe_info.WriteQuotaAvailable) {
206
- /* Short-circuit, no need to call FlushFileBuffers. */
207
220
  handle->flags |= UV_HANDLE_SHUT;
208
- if (req->cb) {
209
- req->cb(req, 0);
210
- }
211
- DECREASE_PENDING_REQ_COUNT(handle);
221
+
222
+ /* Short-circuit, no need to call FlushFileBuffers. */
223
+ uv_insert_pending_req(loop, (uv_req_t*) req);
212
224
  return;
213
225
  }
214
226
 
@@ -224,7 +236,7 @@ void uv_pipe_endgame(uv_pipe_t* handle) {
224
236
  /* Failure. */
225
237
  handle->flags &= ~UV_HANDLE_SHUTTING;
226
238
  if (req->cb) {
227
- uv_set_sys_error(GetLastError());
239
+ uv_set_sys_error(loop, GetLastError());
228
240
  req->cb(req, -1);
229
241
  }
230
242
  DECREASE_PENDING_REQ_COUNT(handle);
@@ -249,29 +261,30 @@ void uv_pipe_endgame(uv_pipe_t* handle) {
249
261
  free(handle);
250
262
  }
251
263
 
252
- uv_unref();
264
+ uv_unref(loop);
253
265
  }
254
266
  }
255
267
 
256
268
 
257
269
  /* Creates a pipe server. */
258
270
  int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
271
+ uv_loop_t* loop = handle->loop;
259
272
  int i, errno, nameSize;
260
273
  uv_pipe_accept_t* req;
261
274
 
262
275
  if (handle->flags & UV_HANDLE_BOUND) {
263
- uv_set_sys_error(WSAEINVAL);
276
+ uv_set_sys_error(loop, WSAEINVAL);
264
277
  return -1;
265
278
  }
266
279
 
267
280
  if (!name) {
268
- uv_set_sys_error(WSAEINVAL);
281
+ uv_set_sys_error(loop, WSAEINVAL);
269
282
  return -1;
270
283
  }
271
284
 
272
285
  for (i = 0; i < COUNTOF(handle->accept_reqs); i++) {
273
286
  req = &handle->accept_reqs[i];
274
- uv_req_init((uv_req_t*) req);
287
+ uv_req_init(loop, (uv_req_t*) req);
275
288
  req->type = UV_ACCEPT;
276
289
  req->data = handle;
277
290
  req->pipeHandle = INVALID_HANDLE_VALUE;
@@ -286,7 +299,7 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
286
299
  }
287
300
 
288
301
  if (!uv_utf8_to_utf16(name, handle->name, nameSize / sizeof(wchar_t))) {
289
- uv_set_sys_error(GetLastError());
302
+ uv_set_sys_error(loop, GetLastError());
290
303
  return -1;
291
304
  }
292
305
 
@@ -295,33 +308,29 @@ int uv_pipe_bind(uv_pipe_t* handle, const char* name) {
295
308
  * If this fails then there's already a pipe server for the given pipe name.
296
309
  */
297
310
  handle->accept_reqs[0].pipeHandle = CreateNamedPipeW(handle->name,
298
- PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE,
299
- PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
300
- PIPE_UNLIMITED_INSTANCES,
301
- 65536,
302
- 65536,
303
- 0,
304
- NULL);
311
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
312
+ FILE_FLAG_FIRST_PIPE_INSTANCE,
313
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
314
+ PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL);
305
315
 
306
316
  if (handle->accept_reqs[0].pipeHandle == INVALID_HANDLE_VALUE) {
307
317
  errno = GetLastError();
308
318
  if (errno == ERROR_ACCESS_DENIED) {
309
- uv_set_error(UV_EADDRINUSE, errno);
310
- handle->error = LOOP->last_error;
311
- handle->flags |= UV_HANDLE_BIND_ERROR;
319
+ uv_set_error(loop, UV_EADDRINUSE, errno);
312
320
  } else if (errno == ERROR_PATH_NOT_FOUND || errno == ERROR_INVALID_NAME) {
313
- uv_set_error(UV_EACCESS, errno);
321
+ uv_set_error(loop, UV_EACCESS, errno);
314
322
  } else {
315
- uv_set_sys_error(errno);
323
+ uv_set_sys_error(loop, errno);
316
324
  }
317
325
  goto error;
318
326
  }
319
327
 
320
- if (uv_set_pipe_handle(handle, handle->accept_reqs[0].pipeHandle)) {
321
- uv_set_sys_error(GetLastError());
328
+ if (uv_set_pipe_handle(loop, handle, handle->accept_reqs[0].pipeHandle)) {
329
+ uv_set_sys_error(loop, GetLastError());
322
330
  goto error;
323
331
  }
324
332
 
333
+ handle->pending_accepts = NULL;
325
334
  handle->flags |= UV_HANDLE_PIPESERVER;
326
335
  handle->flags |= UV_HANDLE_BOUND;
327
336
 
@@ -345,15 +354,19 @@ error:
345
354
  static DWORD WINAPI pipe_connect_thread_proc(void* parameter) {
346
355
  HANDLE pipeHandle = INVALID_HANDLE_VALUE;
347
356
  int errno;
357
+ uv_loop_t* loop;
348
358
  uv_pipe_t* handle;
349
359
  uv_connect_t* req;
350
360
 
351
- req = (uv_connect_t*)parameter;
361
+ req = (uv_connect_t*) parameter;
352
362
  assert(req);
353
- handle = (uv_pipe_t*)req->handle;
363
+ handle = (uv_pipe_t*) req->handle;
354
364
  assert(handle);
365
+ loop = handle->loop;
366
+ assert(loop);
355
367
 
356
- /* We're here because CreateFile on a pipe returned ERROR_PIPE_BUSY. We wait for the pipe to become available with WaitNamedPipe. */
368
+ /* We're here because CreateFile on a pipe returned ERROR_PIPE_BUSY. */
369
+ /* We wait for the pipe to become available with WaitNamedPipe. */
357
370
  while (WaitNamedPipeW(handle->name, 30000)) {
358
371
  /* The pipe is now available, try to connect. */
359
372
  pipeHandle = CreateFileW(handle->name,
@@ -371,22 +384,16 @@ static DWORD WINAPI pipe_connect_thread_proc(void* parameter) {
371
384
  SwitchToThread();
372
385
  }
373
386
 
374
- if (pipeHandle != INVALID_HANDLE_VALUE && !uv_set_pipe_handle(handle, pipeHandle)) {
387
+ if (pipeHandle != INVALID_HANDLE_VALUE &&
388
+ !uv_set_pipe_handle(loop, handle, pipeHandle)) {
375
389
  handle->handle = pipeHandle;
376
- req->error = uv_ok_;
390
+ SET_REQ_SUCCESS(req);
377
391
  } else {
378
- req->error = uv_new_sys_error(GetLastError());
392
+ SET_REQ_ERROR(req, GetLastError());
379
393
  }
380
394
 
381
- memset(&req->overlapped, 0, sizeof(req->overlapped));
382
-
383
395
  /* Post completed */
384
- if (!PostQueuedCompletionStatus(LOOP->iocp,
385
- 0,
386
- 0,
387
- &req->overlapped)) {
388
- uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus");
389
- }
396
+ POST_COMPLETION_FOR_REQ(loop, req);
390
397
 
391
398
  return 0;
392
399
  }
@@ -394,12 +401,13 @@ static DWORD WINAPI pipe_connect_thread_proc(void* parameter) {
394
401
 
395
402
  int uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
396
403
  const char* name, uv_connect_cb cb) {
404
+ uv_loop_t* loop = handle->loop;
397
405
  int errno, nameSize;
398
406
  HANDLE pipeHandle;
399
407
 
400
408
  handle->handle = INVALID_HANDLE_VALUE;
401
409
 
402
- uv_req_init((uv_req_t*) req);
410
+ uv_req_init(loop, (uv_req_t*) req);
403
411
  req->type = UV_CONNECT;
404
412
  req->handle = (uv_stream_t*) handle;
405
413
  req->cb = cb;
@@ -427,7 +435,9 @@ int uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
427
435
  if (pipeHandle == INVALID_HANDLE_VALUE) {
428
436
  if (GetLastError() == ERROR_PIPE_BUSY) {
429
437
  /* Wait for the server to make a pipe instance available. */
430
- if (!QueueUserWorkItem(&pipe_connect_thread_proc, req, WT_EXECUTELONGFUNCTION)) {
438
+ if (!QueueUserWorkItem(&pipe_connect_thread_proc,
439
+ req,
440
+ WT_EXECUTELONGFUNCTION)) {
431
441
  errno = GetLastError();
432
442
  goto error;
433
443
  }
@@ -441,15 +451,15 @@ int uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle,
441
451
  goto error;
442
452
  }
443
453
 
444
- if (uv_set_pipe_handle((uv_pipe_t*)req->handle, pipeHandle)) {
454
+ if (uv_set_pipe_handle(loop, (uv_pipe_t*)req->handle, pipeHandle)) {
445
455
  errno = GetLastError();
446
456
  goto error;
447
457
  }
448
458
 
449
459
  handle->handle = pipeHandle;
450
460
 
451
- req->error = uv_ok_;
452
- uv_insert_pending_req((uv_req_t*) req);
461
+ SET_REQ_SUCCESS(req);
462
+ uv_insert_pending_req(loop, (uv_req_t*) req);
453
463
  handle->reqs_pending++;
454
464
  return 0;
455
465
 
@@ -462,12 +472,13 @@ error:
462
472
  if (pipeHandle != INVALID_HANDLE_VALUE) {
463
473
  CloseHandle(pipeHandle);
464
474
  }
465
- uv_set_sys_error(errno);
475
+ uv_set_sys_error(loop, errno);
466
476
  return -1;
467
477
  }
468
478
 
469
479
 
470
- /* Cleans up uv_pipe_t (server or connection) and all resources associated with it */
480
+ /* Cleans up uv_pipe_t (server or connection) and all resources associated */
481
+ /* with it. */
471
482
  void close_pipe(uv_pipe_t* handle, int* status, uv_err_t* err) {
472
483
  int i;
473
484
  HANDLE pipeHandle;
@@ -486,7 +497,14 @@ void close_pipe(uv_pipe_t* handle, int* status, uv_err_t* err) {
486
497
  }
487
498
  }
488
499
 
489
- } else if (handle->handle != INVALID_HANDLE_VALUE) {
500
+ }
501
+
502
+ if (handle->flags & UV_HANDLE_CONNECTION) {
503
+ eof_timer_destroy(handle);
504
+ }
505
+
506
+ if ((handle->flags & UV_HANDLE_CONNECTION)
507
+ && handle->handle != INVALID_HANDLE_VALUE) {
490
508
  CloseHandle(handle->handle);
491
509
  handle->handle = INVALID_HANDLE_VALUE;
492
510
  }
@@ -495,33 +513,30 @@ void close_pipe(uv_pipe_t* handle, int* status, uv_err_t* err) {
495
513
  }
496
514
 
497
515
 
498
- static void uv_pipe_queue_accept(uv_pipe_t* handle, uv_pipe_accept_t* req, BOOL firstInstance) {
516
+ static void uv_pipe_queue_accept(uv_loop_t* loop, uv_pipe_t* handle,
517
+ uv_pipe_accept_t* req, BOOL firstInstance) {
499
518
  assert(handle->flags & UV_HANDLE_LISTENING);
500
519
 
501
520
  if (!firstInstance) {
502
521
  assert(req->pipeHandle == INVALID_HANDLE_VALUE);
503
522
 
504
523
  req->pipeHandle = CreateNamedPipeW(handle->name,
505
- PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
506
- PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
507
- PIPE_UNLIMITED_INSTANCES,
508
- 65536,
509
- 65536,
510
- 0,
511
- NULL);
524
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
525
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
526
+ PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL);
512
527
 
513
528
  if (req->pipeHandle == INVALID_HANDLE_VALUE) {
514
- req->error = uv_new_sys_error(GetLastError());
515
- uv_insert_pending_req((uv_req_t*) req);
529
+ SET_REQ_ERROR(req, GetLastError());
530
+ uv_insert_pending_req(loop, (uv_req_t*) req);
516
531
  handle->reqs_pending++;
517
532
  return;
518
533
  }
519
534
 
520
- if (uv_set_pipe_handle(handle, req->pipeHandle)) {
535
+ if (uv_set_pipe_handle(loop, handle, req->pipeHandle)) {
521
536
  CloseHandle(req->pipeHandle);
522
537
  req->pipeHandle = INVALID_HANDLE_VALUE;
523
- req->error = uv_new_sys_error(GetLastError());
524
- uv_insert_pending_req((uv_req_t*) req);
538
+ SET_REQ_ERROR(req, GetLastError());
539
+ uv_insert_pending_req(loop, (uv_req_t*) req);
525
540
  handle->reqs_pending++;
526
541
  return;
527
542
  }
@@ -532,16 +547,17 @@ static void uv_pipe_queue_accept(uv_pipe_t* handle, uv_pipe_accept_t* req, BOOL
532
547
  /* Prepare the overlapped structure. */
533
548
  memset(&(req->overlapped), 0, sizeof(req->overlapped));
534
549
 
535
- if (!ConnectNamedPipe(req->pipeHandle, &req->overlapped) && GetLastError() != ERROR_IO_PENDING) {
550
+ if (!ConnectNamedPipe(req->pipeHandle, &req->overlapped) &&
551
+ GetLastError() != ERROR_IO_PENDING) {
536
552
  if (GetLastError() == ERROR_PIPE_CONNECTED) {
537
- req->error = uv_ok_;
553
+ SET_REQ_SUCCESS(req);
538
554
  } else {
539
555
  CloseHandle(req->pipeHandle);
540
556
  req->pipeHandle = INVALID_HANDLE_VALUE;
541
557
  /* Make this req pending reporting an error. */
542
- req->error = uv_new_sys_error(GetLastError());
558
+ SET_REQ_ERROR(req, GetLastError());
543
559
  }
544
- uv_insert_pending_req((uv_req_t*) req);
560
+ uv_insert_pending_req(loop, (uv_req_t*) req);
545
561
  handle->reqs_pending++;
546
562
  return;
547
563
  }
@@ -551,17 +567,19 @@ static void uv_pipe_queue_accept(uv_pipe_t* handle, uv_pipe_accept_t* req, BOOL
551
567
 
552
568
 
553
569
  int uv_pipe_accept(uv_pipe_t* server, uv_pipe_t* client) {
554
- /* Find a connection instance that has been connected, but not yet accepted. */
570
+ uv_loop_t* loop = server->loop;
571
+ /* Find a connection instance that has been connected, but not yet */
572
+ /* accepted. */
555
573
  uv_pipe_accept_t* req = server->pending_accepts;
556
574
 
557
575
  if (!req) {
558
576
  /* No valid connections found, so we error out. */
559
- uv_set_sys_error(WSAEWOULDBLOCK);
577
+ uv_set_sys_error(loop, WSAEWOULDBLOCK);
560
578
  return -1;
561
579
  }
562
580
 
563
581
  /* Initialize the client handle and copy the pipeHandle to the client */
564
- uv_connection_init((uv_stream_t*) client);
582
+ uv_pipe_connection_init(client);
565
583
  client->handle = req->pipeHandle;
566
584
 
567
585
  /* Prepare the req to pick up a new connection */
@@ -571,7 +589,7 @@ int uv_pipe_accept(uv_pipe_t* server, uv_pipe_t* client) {
571
589
 
572
590
  if (!(server->flags & UV_HANDLE_CLOSING) &&
573
591
  !(server->flags & UV_HANDLE_GIVEN_OS_HANDLE)) {
574
- uv_pipe_queue_accept(server, req, FALSE);
592
+ uv_pipe_queue_accept(loop, server, req, FALSE);
575
593
  }
576
594
 
577
595
  return 0;
@@ -580,30 +598,27 @@ int uv_pipe_accept(uv_pipe_t* server, uv_pipe_t* client) {
580
598
 
581
599
  /* Starts listening for connections for the given pipe. */
582
600
  int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
601
+ uv_loop_t* loop = handle->loop;
602
+
583
603
  int i, errno;
584
604
  uv_pipe_accept_t* req;
585
605
  HANDLE pipeHandle;
586
606
 
587
- if (handle->flags & UV_HANDLE_BIND_ERROR) {
588
- uv_set_error(UV_EINVAL, 0);
589
- return -1;
590
- }
591
-
592
607
  if (!(handle->flags & UV_HANDLE_BOUND) &&
593
608
  !(handle->flags & UV_HANDLE_GIVEN_OS_HANDLE)) {
594
- uv_set_error(UV_EINVAL, 0);
609
+ uv_set_error(loop, UV_EINVAL, 0);
595
610
  return -1;
596
611
  }
597
612
 
598
613
  if (handle->flags & UV_HANDLE_LISTENING ||
599
614
  handle->flags & UV_HANDLE_READING) {
600
- uv_set_error(UV_EALREADY, 0);
615
+ uv_set_error(loop, UV_EALREADY, 0);
601
616
  return -1;
602
617
  }
603
618
 
604
619
  if (!(handle->flags & UV_HANDLE_PIPESERVER) &&
605
620
  !(handle->flags & UV_HANDLE_GIVEN_OS_HANDLE)) {
606
- uv_set_error(UV_ENOTSUP, 0);
621
+ uv_set_error(loop, UV_ENOTSUP, 0);
607
622
  return -1;
608
623
  }
609
624
 
@@ -615,24 +630,24 @@ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
615
630
  pipeHandle = handle->handle;
616
631
  assert(pipeHandle != INVALID_HANDLE_VALUE);
617
632
  req = &handle->accept_reqs[0];
618
- uv_req_init((uv_req_t*) req);
633
+ uv_req_init(loop, (uv_req_t*) req);
619
634
  req->pipeHandle = pipeHandle;
620
635
  req->type = UV_ACCEPT;
621
636
  req->data = handle;
622
637
  req->next_pending = NULL;
623
638
 
624
- if (uv_set_pipe_handle(handle, pipeHandle)) {
625
- uv_set_sys_error(GetLastError());
639
+ if (uv_set_pipe_handle(loop, handle, pipeHandle)) {
640
+ uv_set_sys_error(loop, GetLastError());
626
641
  return -1;
627
642
  }
628
643
 
629
- uv_pipe_queue_accept(handle, req, TRUE);
644
+ uv_pipe_queue_accept(loop, handle, req, TRUE);
630
645
  } else {
631
646
  /* First pipe handle should have already been created in uv_pipe_bind */
632
647
  assert(handle->accept_reqs[0].pipeHandle != INVALID_HANDLE_VALUE);
633
648
 
634
649
  for (i = 0; i < COUNTOF(handle->accept_reqs); i++) {
635
- uv_pipe_queue_accept(handle, &handle->accept_reqs[i], i == 0);
650
+ uv_pipe_queue_accept(loop, handle, &handle->accept_reqs[i], i == 0);
636
651
  }
637
652
  }
638
653
 
@@ -640,7 +655,7 @@ int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) {
640
655
  }
641
656
 
642
657
 
643
- static void uv_pipe_queue_read(uv_pipe_t* handle) {
658
+ static void uv_pipe_queue_read(uv_loop_t* loop, uv_pipe_t* handle) {
644
659
  uv_req_t* req;
645
660
  int result;
646
661
 
@@ -661,30 +676,36 @@ static void uv_pipe_queue_read(uv_pipe_t* handle) {
661
676
 
662
677
  if (!result && GetLastError() != ERROR_IO_PENDING) {
663
678
  /* Make this req pending reporting an error. */
664
- req->error = uv_new_sys_error(WSAGetLastError());
665
- uv_insert_pending_req(req);
679
+ SET_REQ_ERROR(req, WSAGetLastError());
680
+ uv_insert_pending_req(loop, req);
666
681
  handle->reqs_pending++;
667
682
  return;
668
683
  }
669
684
 
685
+ /* Start the eof timer if there is one */
686
+ eof_timer_start(handle);
687
+
670
688
  handle->flags |= UV_HANDLE_READ_PENDING;
671
689
  handle->reqs_pending++;
672
690
  }
673
691
 
674
692
 
675
- int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) {
693
+ int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb,
694
+ uv_read_cb read_cb) {
695
+ uv_loop_t* loop = handle->loop;
696
+
676
697
  if (!(handle->flags & UV_HANDLE_CONNECTION)) {
677
- uv_set_error(UV_EINVAL, 0);
698
+ uv_set_error(loop, UV_EINVAL, 0);
678
699
  return -1;
679
700
  }
680
701
 
681
702
  if (handle->flags & UV_HANDLE_READING) {
682
- uv_set_error(UV_EALREADY, 0);
703
+ uv_set_error(loop, UV_EALREADY, 0);
683
704
  return -1;
684
705
  }
685
706
 
686
707
  if (handle->flags & UV_HANDLE_EOF) {
687
- uv_set_error(UV_EOF, 0);
708
+ uv_set_error(loop, UV_EOF, 0);
688
709
  return -1;
689
710
  }
690
711
 
@@ -695,34 +716,34 @@ int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_
695
716
  /* If reading was stopped and then started again, there could stell be a */
696
717
  /* read request pending. */
697
718
  if (!(handle->flags & UV_HANDLE_READ_PENDING))
698
- uv_pipe_queue_read(handle);
719
+ uv_pipe_queue_read(loop, handle);
699
720
 
700
721
  return 0;
701
722
  }
702
723
 
703
724
 
704
- int uv_pipe_write(uv_write_t* req, uv_pipe_t* handle, uv_buf_t bufs[], int bufcnt,
705
- uv_write_cb cb) {
725
+ int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle,
726
+ uv_buf_t bufs[], int bufcnt, uv_write_cb cb) {
706
727
  int result;
707
728
 
708
729
  if (bufcnt != 1) {
709
- uv_set_error(UV_ENOTSUP, 0);
730
+ uv_set_error(loop, UV_ENOTSUP, 0);
710
731
  return -1;
711
732
  }
712
733
 
713
734
  assert(handle->handle != INVALID_HANDLE_VALUE);
714
735
 
715
736
  if (!(handle->flags & UV_HANDLE_CONNECTION)) {
716
- uv_set_error(UV_EINVAL, 0);
737
+ uv_set_error(loop, UV_EINVAL, 0);
717
738
  return -1;
718
739
  }
719
740
 
720
741
  if (handle->flags & UV_HANDLE_SHUTTING) {
721
- uv_set_error(UV_EOF, 0);
742
+ uv_set_error(loop, UV_EOF, 0);
722
743
  return -1;
723
744
  }
724
745
 
725
- uv_req_init((uv_req_t*) req);
746
+ uv_req_init(loop, (uv_req_t*) req);
726
747
  req->type = UV_WRITE;
727
748
  req->handle = (uv_stream_t*) handle;
728
749
  req->cb = cb;
@@ -735,7 +756,7 @@ int uv_pipe_write(uv_write_t* req, uv_pipe_t* handle, uv_buf_t bufs[], int bufcn
735
756
  &req->overlapped);
736
757
 
737
758
  if (!result && GetLastError() != ERROR_IO_PENDING) {
738
- uv_set_sys_error(GetLastError());
759
+ uv_set_sys_error(loop, GetLastError());
739
760
  return -1;
740
761
  }
741
762
 
@@ -755,23 +776,60 @@ int uv_pipe_write(uv_write_t* req, uv_pipe_t* handle, uv_buf_t bufs[], int bufcn
755
776
  }
756
777
 
757
778
 
758
- void uv_process_pipe_read_req(uv_pipe_t* handle, uv_req_t* req) {
779
+ static void uv_pipe_read_eof(uv_loop_t* loop, uv_pipe_t* handle,
780
+ uv_buf_t buf) {
781
+ /* If there is an eof timer running, we don't need it any more, */
782
+ /* so discard it. */
783
+ eof_timer_destroy(handle);
784
+
785
+ handle->flags |= UV_HANDLE_EOF;
786
+ uv_read_stop((uv_stream_t*) handle);
787
+
788
+ uv_set_error(loop, UV_EOF, 0);
789
+ handle->read_cb((uv_stream_t*) handle, -1, uv_null_buf_);
790
+ }
791
+
792
+
793
+ static void uv_pipe_read_error(uv_loop_t* loop, uv_pipe_t* handle, int error,
794
+ uv_buf_t buf) {
795
+ /* If there is an eof timer running, we don't need it any more, */
796
+ /* so discard it. */
797
+ eof_timer_destroy(handle);
798
+
799
+ uv_read_stop((uv_stream_t*) handle);
800
+
801
+ uv_set_sys_error(loop, error);
802
+ handle->read_cb((uv_stream_t*)handle, -1, buf);
803
+ }
804
+
805
+
806
+ static void uv_pipe_read_error_or_eof(uv_loop_t* loop, uv_pipe_t* handle,
807
+ int error, uv_buf_t buf) {
808
+ if (error == ERROR_BROKEN_PIPE) {
809
+ uv_pipe_read_eof(loop, handle, buf);
810
+ } else {
811
+ uv_pipe_read_error(loop, handle, error, buf);
812
+ }
813
+ }
814
+
815
+
816
+ void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle,
817
+ uv_req_t* req) {
759
818
  DWORD bytes, avail;
760
819
  uv_buf_t buf;
761
820
 
762
821
  assert(handle->type == UV_NAMED_PIPE);
763
822
 
764
823
  handle->flags &= ~UV_HANDLE_READ_PENDING;
824
+ eof_timer_stop(handle);
765
825
 
766
- if (req->error.code != UV_OK) {
826
+ if (!REQ_SUCCESS(req)) {
767
827
  /* An error occurred doing the 0-read. */
768
828
  if (handle->flags & UV_HANDLE_READING) {
769
- /* Stop reading and report error. */
770
- handle->flags &= ~UV_HANDLE_READING;
771
- LOOP->last_error = req->error;
772
- buf.base = 0;
773
- buf.len = 0;
774
- handle->read_cb((uv_stream_t*)handle, -1, buf);
829
+ uv_pipe_read_error_or_eof(loop,
830
+ handle,
831
+ GET_REQ_ERROR(req),
832
+ uv_null_buf_);
775
833
  }
776
834
  } else {
777
835
  /* Do non-blocking reads until the buffer is empty */
@@ -782,10 +840,7 @@ void uv_process_pipe_read_req(uv_pipe_t* handle, uv_req_t* req) {
782
840
  NULL,
783
841
  &avail,
784
842
  NULL)) {
785
- uv_set_sys_error(GetLastError());
786
- buf.base = 0;
787
- buf.len = 0;
788
- handle->read_cb((uv_stream_t*)handle, -1, buf);
843
+ uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_);
789
844
  break;
790
845
  }
791
846
 
@@ -794,7 +849,7 @@ void uv_process_pipe_read_req(uv_pipe_t* handle, uv_req_t* req) {
794
849
  break;
795
850
  }
796
851
 
797
- buf = handle->alloc_cb((uv_stream_t*)handle, avail);
852
+ buf = handle->alloc_cb((uv_handle_t*) handle, avail);
798
853
  assert(buf.len > 0);
799
854
 
800
855
  if (ReadFile(handle->handle,
@@ -809,9 +864,7 @@ void uv_process_pipe_read_req(uv_pipe_t* handle, uv_req_t* req) {
809
864
  break;
810
865
  }
811
866
  } else {
812
- /* Ouch! serious error. */
813
- uv_set_sys_error(GetLastError());
814
- handle->read_cb((uv_stream_t*)handle, -1, buf);
867
+ uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_);
815
868
  break;
816
869
  }
817
870
  }
@@ -819,7 +872,7 @@ void uv_process_pipe_read_req(uv_pipe_t* handle, uv_req_t* req) {
819
872
  /* Post another 0-read if still reading and not closing. */
820
873
  if ((handle->flags & UV_HANDLE_READING) &&
821
874
  !(handle->flags & UV_HANDLE_READ_PENDING)) {
822
- uv_pipe_queue_read(handle);
875
+ uv_pipe_queue_read(loop, handle);
823
876
  }
824
877
  }
825
878
 
@@ -827,32 +880,38 @@ void uv_process_pipe_read_req(uv_pipe_t* handle, uv_req_t* req) {
827
880
  }
828
881
 
829
882
 
830
- void uv_process_pipe_write_req(uv_pipe_t* handle, uv_write_t* req) {
883
+ void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle,
884
+ uv_write_t* req) {
831
885
  assert(handle->type == UV_NAMED_PIPE);
832
886
 
833
887
  handle->write_queue_size -= req->queued_bytes;
834
888
 
835
889
  if (req->cb) {
836
- LOOP->last_error = req->error;
837
- ((uv_write_cb)req->cb)(req, LOOP->last_error.code == UV_OK ? 0 : -1);
890
+ if (!REQ_SUCCESS(req)) {
891
+ loop->last_error = GET_REQ_UV_ERROR(req);
892
+ ((uv_write_cb)req->cb)(req, -1);
893
+ } else {
894
+ ((uv_write_cb)req->cb)(req, 0);
895
+ }
838
896
  }
839
897
 
840
898
  handle->write_reqs_pending--;
841
899
  if (handle->write_reqs_pending == 0 &&
842
900
  handle->flags & UV_HANDLE_SHUTTING) {
843
- uv_want_endgame((uv_handle_t*)handle);
901
+ uv_want_endgame(loop, (uv_handle_t*)handle);
844
902
  }
845
903
 
846
904
  DECREASE_PENDING_REQ_COUNT(handle);
847
905
  }
848
906
 
849
907
 
850
- void uv_process_pipe_accept_req(uv_pipe_t* handle, uv_req_t* raw_req) {
908
+ void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle,
909
+ uv_req_t* raw_req) {
851
910
  uv_pipe_accept_t* req = (uv_pipe_accept_t*) raw_req;
852
911
 
853
912
  assert(handle->type == UV_NAMED_PIPE);
854
913
 
855
- if (req->error.code == UV_OK) {
914
+ if (REQ_SUCCESS(req)) {
856
915
  assert(req->pipeHandle != INVALID_HANDLE_VALUE);
857
916
  req->next_pending = handle->pending_accepts;
858
917
  handle->pending_accepts = req;
@@ -867,7 +926,7 @@ void uv_process_pipe_accept_req(uv_pipe_t* handle, uv_req_t* raw_req) {
867
926
  }
868
927
  if (!(handle->flags & UV_HANDLE_CLOSING) &&
869
928
  !(handle->flags & UV_HANDLE_GIVEN_OS_HANDLE)) {
870
- uv_pipe_queue_accept(handle, req, FALSE);
929
+ uv_pipe_queue_accept(loop, handle, req, FALSE);
871
930
  }
872
931
  }
873
932
 
@@ -875,15 +934,16 @@ void uv_process_pipe_accept_req(uv_pipe_t* handle, uv_req_t* raw_req) {
875
934
  }
876
935
 
877
936
 
878
- void uv_process_pipe_connect_req(uv_pipe_t* handle, uv_connect_t* req) {
937
+ void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle,
938
+ uv_connect_t* req) {
879
939
  assert(handle->type == UV_NAMED_PIPE);
880
940
 
881
941
  if (req->cb) {
882
- if (req->error.code == UV_OK) {
883
- uv_connection_init((uv_stream_t*)handle);
942
+ if (REQ_SUCCESS(req)) {
943
+ uv_pipe_connection_init(handle);
884
944
  ((uv_connect_cb)req->cb)(req, 0);
885
945
  } else {
886
- LOOP->last_error = req->error;
946
+ loop->last_error = GET_REQ_UV_ERROR(req);
887
947
  ((uv_connect_cb)req->cb)(req, -1);
888
948
  }
889
949
  }
@@ -892,11 +952,21 @@ void uv_process_pipe_connect_req(uv_pipe_t* handle, uv_connect_t* req) {
892
952
  }
893
953
 
894
954
 
895
- void uv_process_pipe_shutdown_req(uv_pipe_t* handle, uv_shutdown_t* req) {
955
+ void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle,
956
+ uv_shutdown_t* req) {
896
957
  assert(handle->type == UV_NAMED_PIPE);
897
958
 
898
- CloseHandle(handle->handle);
899
- handle->handle = INVALID_HANDLE_VALUE;
959
+ /* Initialize and optionally start the eof timer. */
960
+ /* This makes no sense if we've already seen EOF. */
961
+ if (!(handle->flags & UV_HANDLE_EOF)) {
962
+ eof_timer_init(handle);
963
+
964
+ /* If reading start the timer right now. */
965
+ /* Otherwise uv_pipe_queue_read will start it. */
966
+ if (handle->flags & UV_HANDLE_READ_PENDING) {
967
+ eof_timer_start(handle);
968
+ }
969
+ }
900
970
 
901
971
  if (req->cb) {
902
972
  req->cb(req, 0);
@@ -904,3 +974,88 @@ void uv_process_pipe_shutdown_req(uv_pipe_t* handle, uv_shutdown_t* req) {
904
974
 
905
975
  DECREASE_PENDING_REQ_COUNT(handle);
906
976
  }
977
+
978
+
979
+ static void eof_timer_init(uv_pipe_t* pipe) {
980
+ int r;
981
+
982
+ assert(pipe->eof_timer == NULL);
983
+ assert(pipe->flags & UV_HANDLE_CONNECTION);
984
+
985
+ pipe->eof_timer = (uv_timer_t*) malloc(sizeof *pipe->eof_timer);
986
+
987
+ r = uv_timer_init(pipe->loop, pipe->eof_timer);
988
+ assert(r == 0); /* timers can't fail */
989
+ pipe->eof_timer->data = pipe;
990
+ }
991
+
992
+
993
+ static void eof_timer_start(uv_pipe_t* pipe) {
994
+ assert(pipe->flags & UV_HANDLE_CONNECTION);
995
+
996
+ if (pipe->eof_timer != NULL) {
997
+ uv_timer_start(pipe->eof_timer, eof_timer_cb, eof_timeout, 0);
998
+ }
999
+ }
1000
+
1001
+
1002
+ static void eof_timer_stop(uv_pipe_t* pipe) {
1003
+ assert(pipe->flags & UV_HANDLE_CONNECTION);
1004
+
1005
+ if (pipe->eof_timer != NULL) {
1006
+ uv_timer_stop(pipe->eof_timer);
1007
+ }
1008
+ }
1009
+
1010
+
1011
+ static void eof_timer_cb(uv_timer_t* timer, int status) {
1012
+ uv_pipe_t* pipe = (uv_pipe_t*) timer->data;
1013
+ uv_loop_t* loop = timer->loop;
1014
+
1015
+ assert(status == 0); /* timers can't fail */
1016
+ assert(pipe->type == UV_NAMED_PIPE);
1017
+
1018
+ /* This should always be true, since we start the timer only */
1019
+ /* in uv_pipe_queue_read after successfully calling ReadFile, */
1020
+ /* or in uv_process_pipe_shutdown_req if a read is pending, */
1021
+ /* and we always immediately stop the timer in */
1022
+ /* uv_process_pipe_read_req. */
1023
+ assert(pipe->flags & UV_HANDLE_READ_PENDING) ;
1024
+
1025
+ /* If there are many packets coming off the iocp then the timer callback */
1026
+ /* may be called before the read request is coming off the queue. */
1027
+ /* Therefore we check here if the read request has completed but will */
1028
+ /* be processed later. */
1029
+ if ((pipe->flags & UV_HANDLE_READ_PENDING) &&
1030
+ HasOverlappedIoCompleted(&pipe->read_req.overlapped)) {
1031
+ return;
1032
+ }
1033
+
1034
+ /* Force both ends off the pipe. */
1035
+ CloseHandle(pipe->handle);
1036
+ pipe->handle = INVALID_HANDLE_VALUE;
1037
+
1038
+ /* Stop reading, so the pending read that is going to fail will */
1039
+ /* not be reported to the user. */
1040
+ uv_read_stop((uv_stream_t*) pipe);
1041
+
1042
+ /* Report the eof and update flags. This will get reported even if the */
1043
+ /* user stopped reading in the meantime. TODO: is that okay? */
1044
+ uv_pipe_read_eof(loop, pipe, uv_null_buf_);
1045
+ }
1046
+
1047
+
1048
+ static void eof_timer_destroy(uv_pipe_t* pipe) {
1049
+ assert(pipe->flags && UV_HANDLE_CONNECTION);
1050
+
1051
+ if (pipe->eof_timer) {
1052
+ uv_close((uv_handle_t*) pipe->eof_timer, eof_timer_close_cb);
1053
+ pipe->eof_timer = NULL;
1054
+ }
1055
+ }
1056
+
1057
+
1058
+ static void eof_timer_close_cb(uv_handle_t* handle) {
1059
+ assert(handle->type == UV_TIMER);
1060
+ free(handle);
1061
+ }