noderb 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -25,271 +25,93 @@
25
25
  #include "../uv-common.h"
26
26
  #include "internal.h"
27
27
 
28
+
28
29
  /*
29
- * Guids and typedefs for winsock extension functions
30
- * Mingw32 doesn't have these :-(
30
+ * Threshold of active tcp streams for which to preallocate tcp read buffers.
31
+ * (Due to node slab allocator performing poorly under this pattern,
32
+ * the optimization is temporarily disabled (threshold=0). This will be
33
+ * revisited once node allocator is improved.)
31
34
  */
32
- #ifndef WSAID_ACCEPTEX
33
- # define WSAID_ACCEPTEX \
34
- {0xb5367df1, 0xcbac, 0x11cf, \
35
- {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
36
-
37
- # define WSAID_CONNECTEX \
38
- {0x25a207b9, 0xddf3, 0x4660, \
39
- {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}}
40
-
41
- # define WSAID_GETACCEPTEXSOCKADDRS \
42
- {0xb5367df2, 0xcbac, 0x11cf, \
43
- {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
44
-
45
- # define WSAID_DISCONNECTEX \
46
- {0x7fda2e11, 0x8630, 0x436f, \
47
- {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
48
-
49
- # define WSAID_TRANSMITFILE \
50
- {0xb5367df0, 0xcbac, 0x11cf, \
51
- {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}
52
-
53
- typedef BOOL PASCAL (*LPFN_ACCEPTEX)
54
- (SOCKET sListenSocket,
55
- SOCKET sAcceptSocket,
56
- PVOID lpOutputBuffer,
57
- DWORD dwReceiveDataLength,
58
- DWORD dwLocalAddressLength,
59
- DWORD dwRemoteAddressLength,
60
- LPDWORD lpdwBytesReceived,
61
- LPOVERLAPPED lpOverlapped);
62
-
63
- typedef BOOL PASCAL (*LPFN_CONNECTEX)
64
- (SOCKET s,
65
- const struct sockaddr* name,
66
- int namelen,
67
- PVOID lpSendBuffer,
68
- DWORD dwSendDataLength,
69
- LPDWORD lpdwBytesSent,
70
- LPOVERLAPPED lpOverlapped);
71
-
72
- typedef void PASCAL (*LPFN_GETACCEPTEXSOCKADDRS)
73
- (PVOID lpOutputBuffer,
74
- DWORD dwReceiveDataLength,
75
- DWORD dwLocalAddressLength,
76
- DWORD dwRemoteAddressLength,
77
- LPSOCKADDR* LocalSockaddr,
78
- LPINT LocalSockaddrLength,
79
- LPSOCKADDR* RemoteSockaddr,
80
- LPINT RemoteSockaddrLength);
81
-
82
- typedef BOOL PASCAL (*LPFN_DISCONNECTEX)
83
- (SOCKET hSocket,
84
- LPOVERLAPPED lpOverlapped,
85
- DWORD dwFlags,
86
- DWORD reserved);
87
-
88
- typedef BOOL PASCAL (*LPFN_TRANSMITFILE)
89
- (SOCKET hSocket,
90
- HANDLE hFile,
91
- DWORD nNumberOfBytesToWrite,
92
- DWORD nNumberOfBytesPerSend,
93
- LPOVERLAPPED lpOverlapped,
94
- LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
95
- DWORD dwFlags);
96
- #endif
35
+ const unsigned int uv_active_tcp_streams_threshold = 0;
97
36
 
98
37
  /*
99
- * MinGW is missing this too
38
+ * Number of simultaneous pending AcceptEx calls.
100
39
  */
101
- #ifndef SO_UPDATE_CONNECT_CONTEXT
102
- # define SO_UPDATE_CONNECT_CONTEXT 0x7010
103
- #endif
104
-
105
-
106
- /* Pointers to winsock extension functions to be retrieved dynamically */
107
- static LPFN_CONNECTEX pConnectEx;
108
- static LPFN_ACCEPTEX pAcceptEx;
109
- static LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockAddrs;
110
- static LPFN_DISCONNECTEX pDisconnectEx;
111
- static LPFN_TRANSMITFILE pTransmitFile;
112
-
113
- /* IPv6 version of these extension functions */
114
- static LPFN_CONNECTEX pConnectEx6;
115
- static LPFN_ACCEPTEX pAcceptEx6;
116
- static LPFN_GETACCEPTEXSOCKADDRS pGetAcceptExSockAddrs6;
117
- static LPFN_DISCONNECTEX pDisconnectEx6;
118
- static LPFN_TRANSMITFILE pTransmitFile6;
119
-
120
- /* Ip address used to bind to any port at any interface */
121
- static struct sockaddr_in uv_addr_ip4_any_;
122
- static struct sockaddr_in6 uv_addr_ip6_any_;
40
+ const unsigned int uv_simultaneous_server_accepts = 32;
123
41
 
124
42
  /* A zero-size buffer for use by uv_tcp_read */
125
43
  static char uv_zero_[] = "";
126
44
 
127
- /* mark if IPv6 sockets are supported */
128
- static BOOL uv_allow_ipv6 = FALSE;
129
-
130
-
131
- /*
132
- * Retrieves the pointer to a winsock extension function.
133
- */
134
- static BOOL uv_get_extension_function(SOCKET socket, GUID guid,
135
- void **target) {
136
- DWORD result, bytes;
137
-
138
- result = WSAIoctl(socket,
139
- SIO_GET_EXTENSION_FUNCTION_POINTER,
140
- &guid,
141
- sizeof(guid),
142
- (void*)target,
143
- sizeof(*target),
144
- &bytes,
145
- NULL,
146
- NULL);
147
-
148
- if (result == SOCKET_ERROR) {
149
- *target = NULL;
150
- return FALSE;
151
- } else {
152
- return TRUE;
153
- }
154
- }
155
-
45
+ /* Counter to keep track of active tcp streams */
46
+ static unsigned int active_tcp_streams = 0;
156
47
 
157
- /*
158
- * Setup tcp subsystem
159
- */
160
- void uv_winsock_startup() {
161
- const GUID wsaid_connectex = WSAID_CONNECTEX;
162
- const GUID wsaid_acceptex = WSAID_ACCEPTEX;
163
- const GUID wsaid_getacceptexsockaddrs = WSAID_GETACCEPTEXSOCKADDRS;
164
- const GUID wsaid_disconnectex = WSAID_DISCONNECTEX;
165
- const GUID wsaid_transmitfile = WSAID_TRANSMITFILE;
166
-
167
- WSADATA wsa_data;
168
- int errorno;
169
- SOCKET dummy;
170
- SOCKET dummy6;
171
-
172
- /* Initialize winsock */
173
- errorno = WSAStartup(MAKEWORD(2, 2), &wsa_data);
174
- if (errorno != 0) {
175
- uv_fatal_error(errorno, "WSAStartup");
176
- }
177
-
178
- /* Set implicit binding address used by connectEx */
179
- uv_addr_ip4_any_ = uv_ip4_addr("0.0.0.0", 0);
180
- uv_addr_ip6_any_ = uv_ip6_addr("::1", 0);
181
-
182
- /* Retrieve the needed winsock extension function pointers. */
183
- dummy = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
184
- if (dummy == INVALID_SOCKET) {
185
- uv_fatal_error(WSAGetLastError(), "socket");
186
- }
187
-
188
- if (!uv_get_extension_function(dummy,
189
- wsaid_connectex,
190
- (void**)&pConnectEx) ||
191
- !uv_get_extension_function(dummy,
192
- wsaid_acceptex,
193
- (void**)&pAcceptEx) ||
194
- !uv_get_extension_function(dummy,
195
- wsaid_getacceptexsockaddrs,
196
- (void**)&pGetAcceptExSockAddrs) ||
197
- !uv_get_extension_function(dummy,
198
- wsaid_disconnectex,
199
- (void**)&pDisconnectEx) ||
200
- !uv_get_extension_function(dummy,
201
- wsaid_transmitfile,
202
- (void**)&pTransmitFile)) {
203
- uv_fatal_error(WSAGetLastError(),
204
- "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER)");
205
- }
206
-
207
- if (closesocket(dummy) == SOCKET_ERROR) {
208
- uv_fatal_error(WSAGetLastError(), "closesocket");
209
- }
210
-
211
- /* optional IPv6 versions of winsock extension functions */
212
- dummy6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP);
213
- if (dummy6 != INVALID_SOCKET) {
214
- uv_allow_ipv6 = TRUE;
215
-
216
- if (!uv_get_extension_function(dummy6,
217
- wsaid_connectex,
218
- (void**)&pConnectEx6) ||
219
- !uv_get_extension_function(dummy6,
220
- wsaid_acceptex,
221
- (void**)&pAcceptEx6) ||
222
- !uv_get_extension_function(dummy6,
223
- wsaid_getacceptexsockaddrs,
224
- (void**)&pGetAcceptExSockAddrs6) ||
225
- !uv_get_extension_function(dummy6,
226
- wsaid_disconnectex,
227
- (void**)&pDisconnectEx6) ||
228
- !uv_get_extension_function(dummy6,
229
- wsaid_transmitfile,
230
- (void**)&pTransmitFile6)) {
231
- uv_allow_ipv6 = FALSE;
232
- }
233
48
 
234
- if (closesocket(dummy6) == SOCKET_ERROR) {
235
- uv_fatal_error(WSAGetLastError(), "closesocket");
236
- }
237
- }
238
- }
239
-
240
-
241
- static int uv_tcp_set_socket(uv_tcp_t* handle, SOCKET socket) {
49
+ static int uv_tcp_set_socket(uv_loop_t* loop, uv_tcp_t* handle,
50
+ SOCKET socket) {
242
51
  DWORD yes = 1;
243
52
 
244
53
  assert(handle->socket == INVALID_SOCKET);
245
54
 
246
55
  /* Set the socket to nonblocking mode */
247
56
  if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) {
248
- uv_set_sys_error(WSAGetLastError());
57
+ uv_set_sys_error(loop, WSAGetLastError());
249
58
  return -1;
250
59
  }
251
60
 
252
61
  /* Make the socket non-inheritable */
253
62
  if (!SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0)) {
254
- uv_set_sys_error(GetLastError());
63
+ uv_set_sys_error(loop, GetLastError());
255
64
  return -1;
256
65
  }
257
66
 
258
67
  /* Associate it with the I/O completion port. */
259
68
  /* Use uv_handle_t pointer as completion key. */
260
69
  if (CreateIoCompletionPort((HANDLE)socket,
261
- LOOP->iocp,
70
+ loop->iocp,
262
71
  (ULONG_PTR)socket,
263
72
  0) == NULL) {
264
- uv_set_sys_error(GetLastError());
73
+ uv_set_sys_error(loop, GetLastError());
265
74
  return -1;
266
75
  }
267
76
 
77
+ if (pSetFileCompletionNotificationModes) {
78
+ if (pSetFileCompletionNotificationModes((HANDLE) socket,
79
+ FILE_SKIP_SET_EVENT_ON_HANDLE |
80
+ FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) {
81
+ handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP;
82
+ } else if (GetLastError() != ERROR_INVALID_FUNCTION) {
83
+ uv_set_sys_error(loop, GetLastError());
84
+ return -1;
85
+ }
86
+ }
87
+
268
88
  handle->socket = socket;
269
89
 
270
90
  return 0;
271
91
  }
272
92
 
273
93
 
274
- int uv_tcp_init(uv_tcp_t* handle) {
275
- uv_stream_init((uv_stream_t*)handle);
94
+ int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* handle) {
95
+ uv_stream_init(loop, (uv_stream_t*)handle);
276
96
 
97
+ handle->accept_reqs = NULL;
98
+ handle->pending_accepts = NULL;
277
99
  handle->socket = INVALID_SOCKET;
278
100
  handle->type = UV_TCP;
279
101
  handle->reqs_pending = 0;
280
- handle->accept_socket = INVALID_SOCKET;
281
102
 
282
- uv_counters()->tcp_init++;
103
+ loop->counters.tcp_init++;
283
104
 
284
105
  return 0;
285
106
  }
286
107
 
287
108
 
288
- void uv_tcp_endgame(uv_tcp_t* handle) {
109
+ void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) {
289
110
  uv_err_t err;
290
111
  int status;
291
112
 
292
- if (handle->flags & UV_HANDLE_SHUTTING &&
113
+ if (handle->flags & UV_HANDLE_CONNECTION &&
114
+ handle->flags & UV_HANDLE_SHUTTING &&
293
115
  !(handle->flags & UV_HANDLE_SHUT) &&
294
116
  handle->write_reqs_pending == 0) {
295
117
 
@@ -302,7 +124,7 @@ void uv_tcp_endgame(uv_tcp_t* handle) {
302
124
  }
303
125
  if (handle->shutdown_req->cb) {
304
126
  if (status == -1) {
305
- LOOP->last_error = err;
127
+ loop->last_error = err;
306
128
  }
307
129
  handle->shutdown_req->cb(handle->shutdown_req, status);
308
130
  }
@@ -314,16 +136,24 @@ void uv_tcp_endgame(uv_tcp_t* handle) {
314
136
  assert(!(handle->flags & UV_HANDLE_CLOSED));
315
137
  handle->flags |= UV_HANDLE_CLOSED;
316
138
 
139
+ if (!(handle->flags & UV_HANDLE_CONNECTION) && handle->accept_reqs) {
140
+ free(handle->accept_reqs);
141
+ handle->accept_reqs = NULL;
142
+ }
143
+
317
144
  if (handle->close_cb) {
318
145
  handle->close_cb((uv_handle_t*)handle);
319
146
  }
320
147
 
321
- uv_unref();
148
+ active_tcp_streams--;
149
+
150
+ uv_unref(loop);
322
151
  }
323
152
  }
324
153
 
325
154
 
326
- static int uv__bind(uv_tcp_t* handle, int domain, struct sockaddr* addr, int addrsize) {
155
+ static int uv__bind(uv_loop_t* loop, uv_tcp_t* handle, int domain,
156
+ struct sockaddr* addr, int addrsize) {
327
157
  DWORD err;
328
158
  int r;
329
159
  SOCKET sock;
@@ -331,11 +161,11 @@ static int uv__bind(uv_tcp_t* handle, int domain, struct sockaddr* addr, int add
331
161
  if (handle->socket == INVALID_SOCKET) {
332
162
  sock = socket(domain, SOCK_STREAM, 0);
333
163
  if (sock == INVALID_SOCKET) {
334
- uv_set_sys_error(WSAGetLastError());
164
+ uv_set_sys_error(loop, WSAGetLastError());
335
165
  return -1;
336
166
  }
337
167
 
338
- if (uv_tcp_set_socket(handle, sock) == -1) {
168
+ if (uv_tcp_set_socket(loop, handle, sock) == -1) {
339
169
  closesocket(sock);
340
170
  return -1;
341
171
  }
@@ -347,10 +177,10 @@ static int uv__bind(uv_tcp_t* handle, int domain, struct sockaddr* addr, int add
347
177
  err = WSAGetLastError();
348
178
  if (err == WSAEADDRINUSE) {
349
179
  /* Some errors are not to be reported until connect() or listen() */
350
- handle->error = uv_new_sys_error(err);
180
+ handle->bind_error = uv_new_sys_error(err);
351
181
  handle->flags |= UV_HANDLE_BIND_ERROR;
352
182
  } else {
353
- uv_set_sys_error(err);
183
+ uv_set_sys_error(loop, err);
354
184
  return -1;
355
185
  }
356
186
  }
@@ -362,32 +192,46 @@ static int uv__bind(uv_tcp_t* handle, int domain, struct sockaddr* addr, int add
362
192
 
363
193
 
364
194
  int uv_tcp_bind(uv_tcp_t* handle, struct sockaddr_in addr) {
195
+ uv_loop_t* loop = handle->loop;
196
+
365
197
  if (addr.sin_family != AF_INET) {
366
- uv_set_sys_error(WSAEFAULT);
198
+ uv_set_sys_error(loop, WSAEFAULT);
367
199
  return -1;
368
200
  }
369
201
 
370
- return uv__bind(handle, AF_INET, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
202
+ return uv__bind(loop,
203
+ handle,
204
+ AF_INET,
205
+ (struct sockaddr*)&addr,
206
+ sizeof(struct sockaddr_in));
371
207
  }
372
208
 
373
209
 
374
210
  int uv_tcp_bind6(uv_tcp_t* handle, struct sockaddr_in6 addr) {
211
+ uv_loop_t* loop = handle->loop;
212
+
375
213
  if (addr.sin6_family != AF_INET6) {
376
- uv_set_sys_error(WSAEFAULT);
214
+ uv_set_sys_error(loop, WSAEFAULT);
377
215
  return -1;
378
216
  }
217
+
379
218
  if (uv_allow_ipv6) {
380
219
  handle->flags |= UV_HANDLE_IPV6;
381
- return uv__bind(handle, AF_INET6, (struct sockaddr*)&addr, sizeof(struct sockaddr_in6));
220
+ return uv__bind(loop,
221
+ handle,
222
+ AF_INET6,
223
+ (struct sockaddr*)&addr,
224
+ sizeof(struct sockaddr_in6));
225
+
382
226
  } else {
383
- uv_new_sys_error(UV_EAFNOSUPPORT);
227
+ uv_set_sys_error(loop, WSAEAFNOSUPPORT);
384
228
  return -1;
385
229
  }
386
230
  }
387
231
 
388
232
 
389
- static void uv_tcp_queue_accept(uv_tcp_t* handle) {
390
- uv_req_t* req;
233
+ static void uv_tcp_queue_accept(uv_tcp_t* handle, uv_tcp_accept_t* req) {
234
+ uv_loop_t* loop = handle->loop;
391
235
  BOOL success;
392
236
  DWORD bytes;
393
237
  SOCKET accept_socket;
@@ -395,10 +239,7 @@ static void uv_tcp_queue_accept(uv_tcp_t* handle) {
395
239
  LPFN_ACCEPTEX pAcceptExFamily;
396
240
 
397
241
  assert(handle->flags & UV_HANDLE_LISTENING);
398
- assert(handle->accept_socket == INVALID_SOCKET);
399
-
400
- /* Prepare the uv_req structure. */
401
- req = &handle->accept_req;
242
+ assert(req->accept_socket == INVALID_SOCKET);
402
243
 
403
244
  /* choose family and extension function */
404
245
  if ((handle->flags & UV_HANDLE_IPV6) != 0) {
@@ -412,8 +253,8 @@ static void uv_tcp_queue_accept(uv_tcp_t* handle) {
412
253
  /* Open a socket for the accepted connection. */
413
254
  accept_socket = socket(family, SOCK_STREAM, 0);
414
255
  if (accept_socket == INVALID_SOCKET) {
415
- req->error = uv_new_sys_error(WSAGetLastError());
416
- uv_insert_pending_req(req);
256
+ SET_REQ_ERROR(req, WSAGetLastError());
257
+ uv_insert_pending_req(loop, (uv_req_t*)req);
417
258
  handle->reqs_pending++;
418
259
  return;
419
260
  }
@@ -423,30 +264,34 @@ static void uv_tcp_queue_accept(uv_tcp_t* handle) {
423
264
 
424
265
  success = pAcceptExFamily(handle->socket,
425
266
  accept_socket,
426
- (void*)&handle->accept_buffer,
267
+ (void*)req->accept_buffer,
427
268
  0,
428
269
  sizeof(struct sockaddr_storage),
429
270
  sizeof(struct sockaddr_storage),
430
271
  &bytes,
431
272
  &req->overlapped);
432
273
 
433
- if (!success && WSAGetLastError() != ERROR_IO_PENDING) {
274
+ if (UV_SUCCEEDED_WITHOUT_IOCP(success)) {
275
+ /* Process the req without IOCP. */
276
+ req->accept_socket = accept_socket;
277
+ handle->reqs_pending++;
278
+ uv_insert_pending_req(loop, (uv_req_t*)req);
279
+ } else if (UV_SUCCEEDED_WITH_IOCP(success)) {
280
+ /* The req will be processed with IOCP. */
281
+ req->accept_socket = accept_socket;
282
+ handle->reqs_pending++;
283
+ } else {
434
284
  /* Make this req pending reporting an error. */
435
- req->error = uv_new_sys_error(WSAGetLastError());
436
- uv_insert_pending_req(req);
285
+ SET_REQ_ERROR(req, WSAGetLastError());
286
+ uv_insert_pending_req(loop, (uv_req_t*)req);
437
287
  handle->reqs_pending++;
438
288
  /* Destroy the preallocated client socket. */
439
289
  closesocket(accept_socket);
440
- return;
441
290
  }
442
-
443
- handle->accept_socket = accept_socket;
444
-
445
- handle->reqs_pending++;
446
291
  }
447
292
 
448
293
 
449
- static void uv_tcp_queue_read(uv_tcp_t* handle) {
294
+ static void uv_tcp_queue_read(uv_loop_t* loop, uv_tcp_t* handle) {
450
295
  uv_req_t* req;
451
296
  uv_buf_t buf;
452
297
  int result;
@@ -458,8 +303,20 @@ static void uv_tcp_queue_read(uv_tcp_t* handle) {
458
303
  req = &handle->read_req;
459
304
  memset(&req->overlapped, 0, sizeof(req->overlapped));
460
305
 
461
- buf.base = (char*) &uv_zero_;
462
- buf.len = 0;
306
+ /*
307
+ * Preallocate a read buffer if the number of active streams is below
308
+ * the threshold.
309
+ */
310
+ if (active_tcp_streams < uv_active_tcp_streams_threshold) {
311
+ handle->flags &= ~UV_HANDLE_ZERO_READ;
312
+ handle->read_buffer = handle->alloc_cb((uv_handle_t*) handle, 65536);
313
+ assert(handle->read_buffer.len > 0);
314
+ buf = handle->read_buffer;
315
+ } else {
316
+ handle->flags |= UV_HANDLE_ZERO_READ;
317
+ buf.base = (char*) &uv_zero_;
318
+ buf.len = 0;
319
+ }
463
320
 
464
321
  flags = 0;
465
322
  result = WSARecv(handle->socket,
@@ -469,31 +326,42 @@ static void uv_tcp_queue_read(uv_tcp_t* handle) {
469
326
  &flags,
470
327
  &req->overlapped,
471
328
  NULL);
472
- if (result != 0 && WSAGetLastError() != ERROR_IO_PENDING) {
329
+
330
+ if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) {
331
+ /* Process the req without IOCP. */
332
+ handle->flags |= UV_HANDLE_READ_PENDING;
333
+ req->overlapped.InternalHigh = bytes;
334
+ handle->reqs_pending++;
335
+ uv_insert_pending_req(loop, req);
336
+ } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) {
337
+ /* The req will be processed with IOCP. */
338
+ handle->flags |= UV_HANDLE_READ_PENDING;
339
+ handle->reqs_pending++;
340
+ } else {
473
341
  /* Make this req pending reporting an error. */
474
- req->error = uv_new_sys_error(WSAGetLastError());
475
- uv_insert_pending_req(req);
342
+ SET_REQ_ERROR(req, WSAGetLastError());
343
+ uv_insert_pending_req(loop, req);
476
344
  handle->reqs_pending++;
477
- return;
478
345
  }
479
-
480
- handle->flags |= UV_HANDLE_READ_PENDING;
481
- handle->reqs_pending++;
482
346
  }
483
347
 
484
348
 
485
349
  int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) {
350
+ uv_loop_t* loop = handle->loop;
351
+ unsigned int i;
352
+ uv_tcp_accept_t* req;
353
+
486
354
  assert(backlog > 0);
487
355
 
488
356
  if (handle->flags & UV_HANDLE_BIND_ERROR) {
489
- LOOP->last_error = handle->error;
357
+ loop->last_error = handle->bind_error;
490
358
  return -1;
491
359
  }
492
360
 
493
361
  if (handle->flags & UV_HANDLE_LISTENING ||
494
362
  handle->flags & UV_HANDLE_READING) {
495
363
  /* Already listening. */
496
- uv_set_sys_error(WSAEALREADY);
364
+ uv_set_sys_error(loop, WSAEALREADY);
497
365
  return -1;
498
366
  }
499
367
 
@@ -502,60 +370,88 @@ int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) {
502
370
  return -1;
503
371
 
504
372
  if (listen(handle->socket, backlog) == SOCKET_ERROR) {
505
- uv_set_sys_error(WSAGetLastError());
373
+ uv_set_sys_error(loop, WSAGetLastError());
506
374
  return -1;
507
375
  }
508
376
 
509
377
  handle->flags |= UV_HANDLE_LISTENING;
510
378
  handle->connection_cb = cb;
511
379
 
512
- uv_req_init(&(handle->accept_req));
513
- handle->accept_req.type = UV_ACCEPT;
514
- handle->accept_req.data = handle;
515
- uv_tcp_queue_accept(handle);
380
+ assert(!handle->accept_reqs);
381
+ handle->accept_reqs = (uv_tcp_accept_t*)
382
+ malloc(uv_simultaneous_server_accepts * sizeof(uv_tcp_accept_t));
383
+ if (!handle->accept_reqs) {
384
+ uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
385
+ }
386
+
387
+ for (i = 0; i < uv_simultaneous_server_accepts; i++) {
388
+ req = &handle->accept_reqs[i];
389
+ uv_req_init(loop, (uv_req_t*)req);
390
+ req->type = UV_ACCEPT;
391
+ req->accept_socket = INVALID_SOCKET;
392
+ req->data = handle;
393
+ uv_tcp_queue_accept(handle, req);
394
+ }
516
395
 
517
396
  return 0;
518
397
  }
519
398
 
520
399
 
521
400
  int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) {
401
+ uv_loop_t* loop = server->loop;
522
402
  int rv = 0;
523
403
 
524
- if (server->accept_socket == INVALID_SOCKET) {
525
- uv_set_sys_error(WSAENOTCONN);
404
+ uv_tcp_accept_t* req = server->pending_accepts;
405
+
406
+ if (!req) {
407
+ /* No valid connections found, so we error out. */
408
+ uv_set_sys_error(loop, WSAEWOULDBLOCK);
409
+ return -1;
410
+ }
411
+
412
+ if (req->accept_socket == INVALID_SOCKET) {
413
+ uv_set_sys_error(loop, WSAENOTCONN);
526
414
  return -1;
527
415
  }
528
416
 
529
- if (uv_tcp_set_socket(client, server->accept_socket) == -1) {
530
- closesocket(server->accept_socket);
417
+ if (uv_tcp_set_socket(client->loop, client, req->accept_socket) == -1) {
418
+ closesocket(req->accept_socket);
531
419
  rv = -1;
532
420
  } else {
533
- uv_connection_init((uv_stream_t*)client);
421
+ uv_connection_init((uv_stream_t*) client);
534
422
  }
535
423
 
536
- server->accept_socket = INVALID_SOCKET;
424
+ /* Prepare the req to pick up a new connection */
425
+ server->pending_accepts = req->next_pending;
426
+ req->next_pending = NULL;
427
+ req->accept_socket = INVALID_SOCKET;
537
428
 
538
429
  if (!(server->flags & UV_HANDLE_CLOSING)) {
539
- uv_tcp_queue_accept(server);
430
+ uv_tcp_queue_accept(server, req);
540
431
  }
541
432
 
433
+ active_tcp_streams++;
434
+
542
435
  return rv;
543
436
  }
544
437
 
545
438
 
546
- int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb) {
439
+ int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb,
440
+ uv_read_cb read_cb) {
441
+ uv_loop_t* loop = handle->loop;
442
+
547
443
  if (!(handle->flags & UV_HANDLE_CONNECTION)) {
548
- uv_set_sys_error(WSAEINVAL);
444
+ uv_set_sys_error(loop, WSAEINVAL);
549
445
  return -1;
550
446
  }
551
447
 
552
448
  if (handle->flags & UV_HANDLE_READING) {
553
- uv_set_sys_error(WSAEALREADY);
449
+ uv_set_sys_error(loop, WSAEALREADY);
554
450
  return -1;
555
451
  }
556
452
 
557
453
  if (handle->flags & UV_HANDLE_EOF) {
558
- uv_set_sys_error(WSAESHUTDOWN);
454
+ uv_set_sys_error(loop, WSAESHUTDOWN);
559
455
  return -1;
560
456
  }
561
457
 
@@ -566,7 +462,7 @@ int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb
566
462
  /* If reading was stopped and then started again, there could stell be a */
567
463
  /* read request pending. */
568
464
  if (!(handle->flags & UV_HANDLE_READ_PENDING))
569
- uv_tcp_queue_read(handle);
465
+ uv_tcp_queue_read(loop, handle);
570
466
 
571
467
  return 0;
572
468
  }
@@ -574,17 +470,18 @@ int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, uv_read_cb read_cb
574
470
 
575
471
  int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle,
576
472
  struct sockaddr_in address, uv_connect_cb cb) {
473
+ uv_loop_t* loop = handle->loop;
577
474
  int addrsize = sizeof(struct sockaddr_in);
578
475
  BOOL success;
579
476
  DWORD bytes;
580
477
 
581
478
  if (handle->flags & UV_HANDLE_BIND_ERROR) {
582
- LOOP->last_error = handle->error;
479
+ loop->last_error = handle->bind_error;
583
480
  return -1;
584
481
  }
585
482
 
586
483
  if (address.sin_family != AF_INET) {
587
- uv_set_sys_error(WSAEFAULT);
484
+ uv_set_sys_error(loop, WSAEFAULT);
588
485
  return -1;
589
486
  }
590
487
 
@@ -592,7 +489,7 @@ int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle,
592
489
  uv_tcp_bind(handle, uv_addr_ip4_any_) < 0)
593
490
  return -1;
594
491
 
595
- uv_req_init((uv_req_t*) req);
492
+ uv_req_init(loop, (uv_req_t*) req);
596
493
  req->type = UV_CONNECT;
597
494
  req->handle = (uv_stream_t*) handle;
598
495
  req->cb = cb;
@@ -606,35 +503,41 @@ int uv_tcp_connect(uv_connect_t* req, uv_tcp_t* handle,
606
503
  &bytes,
607
504
  &req->overlapped);
608
505
 
609
- if (!success && WSAGetLastError() != ERROR_IO_PENDING) {
610
- uv_set_sys_error(WSAGetLastError());
506
+ if (UV_SUCCEEDED_WITHOUT_IOCP(success)) {
507
+ /* Process the req without IOCP. */
508
+ handle->reqs_pending++;
509
+ uv_insert_pending_req(loop, (uv_req_t*)req);
510
+ } else if (UV_SUCCEEDED_WITH_IOCP(success)) {
511
+ /* The req will be processed with IOCP. */
512
+ handle->reqs_pending++;
513
+ } else {
514
+ uv_set_sys_error(loop, WSAGetLastError());
611
515
  return -1;
612
516
  }
613
517
 
614
- handle->reqs_pending++;
615
-
616
518
  return 0;
617
519
  }
618
520
 
619
521
 
620
522
  int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle,
621
523
  struct sockaddr_in6 address, uv_connect_cb cb) {
524
+ uv_loop_t* loop = handle->loop;
622
525
  int addrsize = sizeof(struct sockaddr_in6);
623
526
  BOOL success;
624
527
  DWORD bytes;
625
528
 
626
529
  if (!uv_allow_ipv6) {
627
- uv_new_sys_error(UV_EAFNOSUPPORT);
530
+ uv_new_sys_error(WSAEAFNOSUPPORT);
628
531
  return -1;
629
532
  }
630
533
 
631
534
  if (handle->flags & UV_HANDLE_BIND_ERROR) {
632
- LOOP->last_error = handle->error;
535
+ loop->last_error = handle->bind_error;
633
536
  return -1;
634
537
  }
635
538
 
636
539
  if (address.sin6_family != AF_INET6) {
637
- uv_set_sys_error(WSAEFAULT);
540
+ uv_set_sys_error(loop, WSAEFAULT);
638
541
  return -1;
639
542
  }
640
543
 
@@ -642,7 +545,7 @@ int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle,
642
545
  uv_tcp_bind6(handle, uv_addr_ip6_any_) < 0)
643
546
  return -1;
644
547
 
645
- uv_req_init((uv_req_t*) req);
548
+ uv_req_init(loop, (uv_req_t*) req);
646
549
  req->type = UV_CONNECT;
647
550
  req->handle = (uv_stream_t*) handle;
648
551
  req->cb = cb;
@@ -656,28 +559,32 @@ int uv_tcp_connect6(uv_connect_t* req, uv_tcp_t* handle,
656
559
  &bytes,
657
560
  &req->overlapped);
658
561
 
659
- if (!success && WSAGetLastError() != ERROR_IO_PENDING) {
660
- uv_set_sys_error(WSAGetLastError());
562
+ if (UV_SUCCEEDED_WITHOUT_IOCP(success)) {
563
+ handle->reqs_pending++;
564
+ uv_insert_pending_req(loop, (uv_req_t*)req);
565
+ } else if (UV_SUCCEEDED_WITH_IOCP(success)) {
566
+ handle->reqs_pending++;
567
+ } else {
568
+ uv_set_sys_error(loop, WSAGetLastError());
661
569
  return -1;
662
570
  }
663
571
 
664
- handle->reqs_pending++;
665
-
666
572
  return 0;
667
573
  }
668
574
 
669
575
 
670
- int uv_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen) {
576
+ int uv_tcp_getsockname(uv_loop_t* loop, uv_tcp_t* handle,
577
+ struct sockaddr* name, int* namelen) {
671
578
  int result;
672
579
 
673
580
  if (handle->flags & UV_HANDLE_SHUTTING) {
674
- uv_set_sys_error(WSAESHUTDOWN);
581
+ uv_set_sys_error(loop, WSAESHUTDOWN);
675
582
  return -1;
676
583
  }
677
584
 
678
585
  result = getsockname(handle->socket, name, namelen);
679
586
  if (result != 0) {
680
- uv_set_sys_error(WSAGetLastError());
587
+ uv_set_sys_error(loop, WSAGetLastError());
681
588
  return -1;
682
589
  }
683
590
 
@@ -685,22 +592,22 @@ int uv_getsockname(uv_tcp_t* handle, struct sockaddr* name, int* namelen) {
685
592
  }
686
593
 
687
594
 
688
- int uv_tcp_write(uv_write_t* req, uv_tcp_t* handle, uv_buf_t bufs[], int bufcnt,
689
- uv_write_cb cb) {
595
+ int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle,
596
+ uv_buf_t bufs[], int bufcnt, uv_write_cb cb) {
690
597
  int result;
691
- DWORD bytes, err;
598
+ DWORD bytes;
692
599
 
693
600
  if (!(handle->flags & UV_HANDLE_CONNECTION)) {
694
- uv_set_sys_error(WSAEINVAL);
601
+ uv_set_sys_error(loop, WSAEINVAL);
695
602
  return -1;
696
603
  }
697
604
 
698
605
  if (handle->flags & UV_HANDLE_SHUTTING) {
699
- uv_set_sys_error(WSAESHUTDOWN);
606
+ uv_set_sys_error(loop, WSAESHUTDOWN);
700
607
  return -1;
701
608
  }
702
609
 
703
- uv_req_init((uv_req_t*) req);
610
+ uv_req_init(loop, (uv_req_t*) req);
704
611
  req->type = UV_WRITE;
705
612
  req->handle = (uv_stream_t*) handle;
706
613
  req->cb = cb;
@@ -713,32 +620,31 @@ int uv_tcp_write(uv_write_t* req, uv_tcp_t* handle, uv_buf_t bufs[], int bufcnt,
713
620
  0,
714
621
  &req->overlapped,
715
622
  NULL);
716
- if (result != 0) {
717
- err = WSAGetLastError();
718
- if (err != WSA_IO_PENDING) {
719
- /* Send failed due to an error. */
720
- uv_set_sys_error(WSAGetLastError());
721
- return -1;
722
- }
723
- }
724
623
 
725
- if (result == 0) {
624
+ if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) {
726
625
  /* Request completed immediately. */
727
626
  req->queued_bytes = 0;
728
- } else {
627
+ handle->reqs_pending++;
628
+ handle->write_reqs_pending++;
629
+ uv_insert_pending_req(loop, (uv_req_t*) req);
630
+ } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) {
729
631
  /* Request queued by the kernel. */
730
632
  req->queued_bytes = uv_count_bufs(bufs, bufcnt);
633
+ handle->reqs_pending++;
634
+ handle->write_reqs_pending++;
731
635
  handle->write_queue_size += req->queued_bytes;
636
+ } else {
637
+ /* Send failed due to an error. */
638
+ uv_set_sys_error(loop, WSAGetLastError());
639
+ return -1;
732
640
  }
733
641
 
734
- handle->reqs_pending++;
735
- handle->write_reqs_pending++;
736
-
737
642
  return 0;
738
643
  }
739
644
 
740
645
 
741
- void uv_process_tcp_read_req(uv_tcp_t* handle, uv_req_t* req) {
646
+ void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle,
647
+ uv_req_t* req) {
742
648
  DWORD bytes, flags, err;
743
649
  uv_buf_t buf;
744
650
 
@@ -746,19 +652,43 @@ void uv_process_tcp_read_req(uv_tcp_t* handle, uv_req_t* req) {
746
652
 
747
653
  handle->flags &= ~UV_HANDLE_READ_PENDING;
748
654
 
749
- if (req->error.code != UV_OK) {
750
- /* An error occurred doing the 0-read. */
655
+ if (!REQ_SUCCESS(req)) {
656
+ /* An error occurred doing the read. */
751
657
  if ((handle->flags & UV_HANDLE_READING)) {
752
658
  handle->flags &= ~UV_HANDLE_READING;
753
- LOOP->last_error = req->error;
754
- buf.base = 0;
755
- buf.len = 0;
659
+ loop->last_error = GET_REQ_UV_SOCK_ERROR(req);
660
+ buf = (handle->flags & UV_HANDLE_ZERO_READ) ?
661
+ uv_buf_init(NULL, 0) : handle->read_buffer;
756
662
  handle->read_cb((uv_stream_t*)handle, -1, buf);
757
663
  }
758
664
  } else {
665
+ if (!(handle->flags & UV_HANDLE_ZERO_READ)) {
666
+ /* The read was done with a non-zero buffer length. */
667
+ if (req->overlapped.InternalHigh > 0) {
668
+ /* Successful read */
669
+ handle->read_cb((uv_stream_t*)handle,
670
+ req->overlapped.InternalHigh,
671
+ handle->read_buffer);
672
+ /* Read again only if bytes == buf.len */
673
+ if (req->overlapped.InternalHigh < handle->read_buffer.len) {
674
+ goto done;
675
+ }
676
+ } else {
677
+ /* Connection closed */
678
+ handle->flags &= ~UV_HANDLE_READING;
679
+ handle->flags |= UV_HANDLE_EOF;
680
+ loop->last_error.code = UV_EOF;
681
+ loop->last_error.sys_errno_ = ERROR_SUCCESS;
682
+ buf.base = 0;
683
+ buf.len = 0;
684
+ handle->read_cb((uv_stream_t*)handle, -1, handle->read_buffer);
685
+ goto done;
686
+ }
687
+ }
688
+
759
689
  /* Do nonblocking reads until the buffer is empty */
760
690
  while (handle->flags & UV_HANDLE_READING) {
761
- buf = handle->alloc_cb((uv_stream_t*)handle, 65536);
691
+ buf = handle->alloc_cb((uv_handle_t*) handle, 65536);
762
692
  assert(buf.len > 0);
763
693
  flags = 0;
764
694
  if (WSARecv(handle->socket,
@@ -779,8 +709,8 @@ void uv_process_tcp_read_req(uv_tcp_t* handle, uv_req_t* req) {
779
709
  /* Connection closed */
780
710
  handle->flags &= ~UV_HANDLE_READING;
781
711
  handle->flags |= UV_HANDLE_EOF;
782
- LOOP->last_error.code = UV_EOF;
783
- LOOP->last_error.sys_errno_ = ERROR_SUCCESS;
712
+ loop->last_error.code = UV_EOF;
713
+ loop->last_error.sys_errno_ = ERROR_SUCCESS;
784
714
  handle->read_cb((uv_stream_t*)handle, -1, buf);
785
715
  break;
786
716
  }
@@ -788,21 +718,23 @@ void uv_process_tcp_read_req(uv_tcp_t* handle, uv_req_t* req) {
788
718
  err = WSAGetLastError();
789
719
  if (err == WSAEWOULDBLOCK) {
790
720
  /* Read buffer was completely empty, report a 0-byte read. */
791
- uv_set_sys_error(WSAEWOULDBLOCK);
721
+ uv_set_sys_error(loop, WSAEWOULDBLOCK);
792
722
  handle->read_cb((uv_stream_t*)handle, 0, buf);
793
723
  } else {
794
724
  /* Ouch! serious error. */
795
- uv_set_sys_error(err);
725
+ uv_set_sys_error(loop, err);
726
+ handle->flags &= ~UV_HANDLE_READING;
796
727
  handle->read_cb((uv_stream_t*)handle, -1, buf);
797
728
  }
798
729
  break;
799
730
  }
800
731
  }
801
732
 
802
- /* Post another 0-read if still reading and not closing. */
733
+ done:
734
+ /* Post another read if still reading and not closing. */
803
735
  if ((handle->flags & UV_HANDLE_READING) &&
804
736
  !(handle->flags & UV_HANDLE_READ_PENDING)) {
805
- uv_tcp_queue_read(handle);
737
+ uv_tcp_queue_read(loop, handle);
806
738
  }
807
739
  }
808
740
 
@@ -810,47 +742,54 @@ void uv_process_tcp_read_req(uv_tcp_t* handle, uv_req_t* req) {
810
742
  }
811
743
 
812
744
 
813
- void uv_process_tcp_write_req(uv_tcp_t* handle, uv_write_t* req) {
745
+ void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle,
746
+ uv_write_t* req) {
814
747
  assert(handle->type == UV_TCP);
815
748
 
816
749
  handle->write_queue_size -= req->queued_bytes;
817
750
 
818
751
  if (req->cb) {
819
- LOOP->last_error = req->error;
820
- ((uv_write_cb)req->cb)(req, LOOP->last_error.code == UV_OK ? 0 : -1);
752
+ loop->last_error = GET_REQ_UV_SOCK_ERROR(req);
753
+ ((uv_write_cb)req->cb)(req, loop->last_error.code == UV_OK ? 0 : -1);
821
754
  }
822
755
 
823
756
  handle->write_reqs_pending--;
824
757
  if (handle->flags & UV_HANDLE_SHUTTING &&
825
758
  handle->write_reqs_pending == 0) {
826
- uv_want_endgame((uv_handle_t*)handle);
759
+ uv_want_endgame(loop, (uv_handle_t*)handle);
827
760
  }
828
761
 
829
762
  DECREASE_PENDING_REQ_COUNT(handle);
830
763
  }
831
764
 
832
765
 
833
- void uv_process_tcp_accept_req(uv_tcp_t* handle, uv_req_t* req) {
766
+ void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle,
767
+ uv_req_t* raw_req) {
768
+ uv_tcp_accept_t* req = (uv_tcp_accept_t*) raw_req;
769
+
834
770
  assert(handle->type == UV_TCP);
835
771
 
836
772
  /* If handle->accepted_socket is not a valid socket, then */
837
773
  /* uv_queue_accept must have failed. This is a serious error. We stop */
838
774
  /* accepting connections and report this error to the connection */
839
775
  /* callback. */
840
- if (handle->accept_socket == INVALID_SOCKET) {
776
+ if (req->accept_socket == INVALID_SOCKET) {
841
777
  if (handle->flags & UV_HANDLE_LISTENING) {
842
778
  handle->flags &= ~UV_HANDLE_LISTENING;
843
779
  if (handle->connection_cb) {
844
- LOOP->last_error = req->error;
780
+ loop->last_error = GET_REQ_UV_SOCK_ERROR(req);
845
781
  handle->connection_cb((uv_stream_t*)handle, -1);
846
782
  }
847
783
  }
848
- } else if (req->error.code == UV_OK &&
849
- setsockopt(handle->accept_socket,
784
+ } else if (REQ_SUCCESS(req) &&
785
+ setsockopt(req->accept_socket,
850
786
  SOL_SOCKET,
851
787
  SO_UPDATE_ACCEPT_CONTEXT,
852
788
  (char*)&handle->socket,
853
789
  sizeof(handle->socket)) == 0) {
790
+ req->next_pending = handle->pending_accepts;
791
+ handle->pending_accepts = req;
792
+
854
793
  /* Accept and SO_UPDATE_ACCEPT_CONTEXT were successful. */
855
794
  if (handle->connection_cb) {
856
795
  handle->connection_cb((uv_stream_t*)handle, 0);
@@ -859,9 +798,10 @@ void uv_process_tcp_accept_req(uv_tcp_t* handle, uv_req_t* req) {
859
798
  /* Error related to accepted socket is ignored because the server */
860
799
  /* socket may still be healthy. If the server socket is broken
861
800
  /* uv_queue_accept will detect it. */
862
- closesocket(handle->accept_socket);
801
+ closesocket(req->accept_socket);
802
+ req->accept_socket = INVALID_SOCKET;
863
803
  if (handle->flags & UV_HANDLE_LISTENING) {
864
- uv_tcp_queue_accept(handle);
804
+ uv_tcp_queue_accept(handle, req);
865
805
  }
866
806
  }
867
807
 
@@ -869,24 +809,26 @@ void uv_process_tcp_accept_req(uv_tcp_t* handle, uv_req_t* req) {
869
809
  }
870
810
 
871
811
 
872
- void uv_process_tcp_connect_req(uv_tcp_t* handle, uv_connect_t* req) {
812
+ void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle,
813
+ uv_connect_t* req) {
873
814
  assert(handle->type == UV_TCP);
874
815
 
875
816
  if (req->cb) {
876
- if (req->error.code == UV_OK) {
817
+ if (REQ_SUCCESS(req)) {
877
818
  if (setsockopt(handle->socket,
878
819
  SOL_SOCKET,
879
820
  SO_UPDATE_CONNECT_CONTEXT,
880
821
  NULL,
881
822
  0) == 0) {
882
823
  uv_connection_init((uv_stream_t*)handle);
824
+ active_tcp_streams++;
883
825
  ((uv_connect_cb)req->cb)(req, 0);
884
826
  } else {
885
- uv_set_sys_error(WSAGetLastError());
827
+ uv_set_sys_error(loop, WSAGetLastError());
886
828
  ((uv_connect_cb)req->cb)(req, -1);
887
829
  }
888
830
  } else {
889
- LOOP->last_error = req->error;
831
+ loop->last_error = GET_REQ_UV_SOCK_ERROR(req);
890
832
  ((uv_connect_cb)req->cb)(req, -1);
891
833
  }
892
834
  }