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
@@ -0,0 +1,727 @@
1
+ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2
+ *
3
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ * of this software and associated documentation files (the "Software"), to
5
+ * deal in the Software without restriction, including without limitation the
6
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ * sell copies of the Software, and to permit persons to whom the Software is
8
+ * furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in
11
+ * all copies or substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ * IN THE SOFTWARE.
20
+ */
21
+
22
+ #include "uv.h"
23
+ #include "internal.h"
24
+
25
+ #include <assert.h>
26
+ #include <errno.h>
27
+ #include <unistd.h>
28
+ #include <stdlib.h>
29
+ #include <sys/uio.h>
30
+
31
+
32
+ static void uv__stream_connect(uv_stream_t*);
33
+ static uv_write_t* uv__write(uv_stream_t* stream);
34
+ static void uv__read(uv_stream_t* stream);
35
+
36
+
37
+ static size_t uv__buf_count(uv_buf_t bufs[], int bufcnt) {
38
+ size_t total = 0;
39
+ int i;
40
+
41
+ for (i = 0; i < bufcnt; i++) {
42
+ total += bufs[i].len;
43
+ }
44
+
45
+ return total;
46
+ }
47
+
48
+
49
+ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
50
+ socklen_t yes;
51
+
52
+ assert(fd >= 0);
53
+ stream->fd = fd;
54
+
55
+ ((uv_handle_t*)stream)->flags |= flags;
56
+
57
+ /* Reuse the port address if applicable. */
58
+ yes = 1;
59
+ if (stream->type == UV_TCP
60
+ && setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
61
+ uv_err_new(stream->loop, errno);
62
+ return -1;
63
+ }
64
+
65
+ /* Associate the fd with each ev_io watcher. */
66
+ ev_io_set(&stream->read_watcher, fd, EV_READ);
67
+ ev_io_set(&stream->write_watcher, fd, EV_WRITE);
68
+
69
+ /* These should have been set up by uv_tcp_init or uv_pipe_init. */
70
+ assert(stream->read_watcher.cb == uv__stream_io);
71
+ assert(stream->write_watcher.cb == uv__stream_io);
72
+
73
+ return 0;
74
+ }
75
+
76
+
77
+ void uv__server_io(EV_P_ ev_io* watcher, int revents) {
78
+ int fd;
79
+ struct sockaddr_storage addr;
80
+ uv_stream_t* stream = watcher->data;
81
+
82
+ assert(watcher == &stream->read_watcher ||
83
+ watcher == &stream->write_watcher);
84
+ assert(revents == EV_READ);
85
+
86
+ assert(!(stream->flags & UV_CLOSING));
87
+
88
+ if (stream->accepted_fd >= 0) {
89
+ ev_io_stop(EV_A, &stream->read_watcher);
90
+ return;
91
+ }
92
+
93
+ /* connection_cb can close the server socket while we're
94
+ * in the loop so check it on each iteration.
95
+ */
96
+ while (stream->fd != -1) {
97
+ assert(stream->accepted_fd < 0);
98
+ fd = uv__accept(stream->fd, (struct sockaddr*)&addr, sizeof addr);
99
+
100
+ if (fd < 0) {
101
+ if (errno == EAGAIN) {
102
+ /* No problem. */
103
+ return;
104
+ } else if (errno == EMFILE) {
105
+ /* TODO special trick. unlock reserved socket, accept, close. */
106
+ return;
107
+ } else {
108
+ uv_err_new(stream->loop, errno);
109
+ stream->connection_cb((uv_stream_t*)stream, -1);
110
+ }
111
+ } else {
112
+ stream->accepted_fd = fd;
113
+ stream->connection_cb((uv_stream_t*)stream, 0);
114
+ if (stream->accepted_fd >= 0) {
115
+ /* The user hasn't yet accepted called uv_accept() */
116
+ ev_io_stop(stream->loop->ev, &stream->read_watcher);
117
+ return;
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+
124
+ int uv_accept(uv_stream_t* server, uv_stream_t* client) {
125
+ uv_stream_t* streamServer;
126
+ uv_stream_t* streamClient;
127
+ int saved_errno;
128
+ int status;
129
+
130
+ /* TODO document this */
131
+ assert(server->loop == client->loop);
132
+
133
+ saved_errno = errno;
134
+ status = -1;
135
+
136
+ streamServer = (uv_stream_t*)server;
137
+ streamClient = (uv_stream_t*)client;
138
+
139
+ if (streamServer->accepted_fd < 0) {
140
+ uv_err_new(server->loop, EAGAIN);
141
+ goto out;
142
+ }
143
+
144
+ if (uv__stream_open(streamClient, streamServer->accepted_fd,
145
+ UV_READABLE | UV_WRITABLE)) {
146
+ /* TODO handle error */
147
+ streamServer->accepted_fd = -1;
148
+ uv__close(streamServer->accepted_fd);
149
+ goto out;
150
+ }
151
+
152
+ ev_io_start(streamServer->loop->ev, &streamServer->read_watcher);
153
+ streamServer->accepted_fd = -1;
154
+ status = 0;
155
+
156
+ out:
157
+ errno = saved_errno;
158
+ return status;
159
+ }
160
+
161
+
162
+ int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) {
163
+ switch (stream->type) {
164
+ case UV_TCP:
165
+ return uv_tcp_listen((uv_tcp_t*)stream, backlog, cb);
166
+ case UV_NAMED_PIPE:
167
+ return uv_pipe_listen((uv_pipe_t*)stream, backlog, cb);
168
+ default:
169
+ assert(0);
170
+ return -1;
171
+ }
172
+ }
173
+
174
+
175
+ uv_write_t* uv_write_queue_head(uv_stream_t* stream) {
176
+ ngx_queue_t* q;
177
+ uv_write_t* req;
178
+
179
+ if (ngx_queue_empty(&stream->write_queue)) {
180
+ return NULL;
181
+ }
182
+
183
+ q = ngx_queue_head(&stream->write_queue);
184
+ if (!q) {
185
+ return NULL;
186
+ }
187
+
188
+ req = ngx_queue_data(q, struct uv_write_s, queue);
189
+ assert(req);
190
+
191
+ return req;
192
+ }
193
+
194
+
195
+ static void uv__drain(uv_stream_t* stream) {
196
+ uv_shutdown_t* req;
197
+
198
+ assert(!uv_write_queue_head(stream));
199
+ assert(stream->write_queue_size == 0);
200
+
201
+ ev_io_stop(stream->loop->ev, &stream->write_watcher);
202
+
203
+ /* Shutdown? */
204
+ if ((stream->flags & UV_SHUTTING) &&
205
+ !(stream->flags & UV_CLOSING) &&
206
+ !(stream->flags & UV_SHUT)) {
207
+ assert(stream->shutdown_req);
208
+
209
+ req = stream->shutdown_req;
210
+
211
+ if (shutdown(stream->fd, SHUT_WR)) {
212
+ /* Error. Report it. User should call uv_close(). */
213
+ uv_err_new(stream->loop, errno);
214
+ if (req->cb) {
215
+ req->cb(req, -1);
216
+ }
217
+ } else {
218
+ uv_err_new(stream->loop, 0);
219
+ ((uv_handle_t*) stream)->flags |= UV_SHUT;
220
+ if (req->cb) {
221
+ req->cb(req, 0);
222
+ }
223
+ }
224
+ }
225
+ }
226
+
227
+
228
+ /* On success returns NULL. On error returns a pointer to the write request
229
+ * which had the error.
230
+ */
231
+ static uv_write_t* uv__write(uv_stream_t* stream) {
232
+ uv_write_t* req;
233
+ struct iovec* iov;
234
+ int iovcnt;
235
+ ssize_t n;
236
+
237
+ assert(stream->fd >= 0);
238
+
239
+ /* TODO: should probably while(1) here until EAGAIN */
240
+
241
+ /* Get the request at the head of the queue. */
242
+ req = uv_write_queue_head(stream);
243
+ if (!req) {
244
+ assert(stream->write_queue_size == 0);
245
+ return NULL;
246
+ }
247
+
248
+ assert(req->handle == stream);
249
+
250
+ /* Cast to iovec. We had to have our own uv_buf_t instead of iovec
251
+ * because Windows's WSABUF is not an iovec.
252
+ */
253
+ assert(sizeof(uv_buf_t) == sizeof(struct iovec));
254
+ iov = (struct iovec*) &(req->bufs[req->write_index]);
255
+ iovcnt = req->bufcnt - req->write_index;
256
+
257
+ /* Now do the actual writev. Note that we've been updating the pointers
258
+ * inside the iov each time we write. So there is no need to offset it.
259
+ */
260
+
261
+ do {
262
+ if (iovcnt == 1) {
263
+ n = write(stream->fd, iov[0].iov_base, iov[0].iov_len);
264
+ } else {
265
+ n = writev(stream->fd, iov, iovcnt);
266
+ }
267
+ }
268
+ while (n == -1 && errno == EINTR);
269
+
270
+ if (n < 0) {
271
+ if (errno != EAGAIN) {
272
+ /* Error */
273
+ uv_err_new(stream->loop, errno);
274
+ return req;
275
+ }
276
+ } else {
277
+ /* Successful write */
278
+
279
+ /* Update the counters. */
280
+ while (n >= 0) {
281
+ uv_buf_t* buf = &(req->bufs[req->write_index]);
282
+ size_t len = buf->len;
283
+
284
+ assert(req->write_index < req->bufcnt);
285
+
286
+ if ((size_t)n < len) {
287
+ buf->base += n;
288
+ buf->len -= n;
289
+ stream->write_queue_size -= n;
290
+ n = 0;
291
+
292
+ /* There is more to write. Break and ensure the watcher is pending. */
293
+ break;
294
+
295
+ } else {
296
+ /* Finished writing the buf at index req->write_index. */
297
+ req->write_index++;
298
+
299
+ assert((size_t)n >= len);
300
+ n -= len;
301
+
302
+ assert(stream->write_queue_size >= len);
303
+ stream->write_queue_size -= len;
304
+
305
+ if (req->write_index == req->bufcnt) {
306
+ /* Then we're done! */
307
+ assert(n == 0);
308
+
309
+ /* Pop the req off tcp->write_queue. */
310
+ ngx_queue_remove(&req->queue);
311
+ if (req->bufs != req->bufsml) {
312
+ free(req->bufs);
313
+ }
314
+ req->bufs = NULL;
315
+
316
+ /* Add it to the write_completed_queue where it will have its
317
+ * callback called in the near future.
318
+ * TODO: start trying to write the next request.
319
+ */
320
+ ngx_queue_insert_tail(&stream->write_completed_queue, &req->queue);
321
+ ev_feed_event(stream->loop->ev, &stream->write_watcher, EV_WRITE);
322
+ return NULL;
323
+ }
324
+ }
325
+ }
326
+ }
327
+
328
+ /* Either we've counted n down to zero or we've got EAGAIN. */
329
+ assert(n == 0 || n == -1);
330
+
331
+ /* We're not done. */
332
+ ev_io_start(stream->loop->ev, &stream->write_watcher);
333
+
334
+ return NULL;
335
+ }
336
+
337
+
338
+ static void uv__write_callbacks(uv_stream_t* stream) {
339
+ int callbacks_made = 0;
340
+ ngx_queue_t* q;
341
+ uv_write_t* req;
342
+
343
+ while (!ngx_queue_empty(&stream->write_completed_queue)) {
344
+ /* Pop a req off write_completed_queue. */
345
+ q = ngx_queue_head(&stream->write_completed_queue);
346
+ assert(q);
347
+ req = ngx_queue_data(q, struct uv_write_s, queue);
348
+ ngx_queue_remove(q);
349
+
350
+ /* NOTE: call callback AFTER freeing the request data. */
351
+ if (req->cb) {
352
+ req->cb(req, 0);
353
+ }
354
+
355
+ callbacks_made++;
356
+ }
357
+
358
+ assert(ngx_queue_empty(&stream->write_completed_queue));
359
+
360
+ /* Write queue drained. */
361
+ if (!uv_write_queue_head(stream)) {
362
+ uv__drain(stream);
363
+ }
364
+ }
365
+
366
+
367
+ static void uv__read(uv_stream_t* stream) {
368
+ uv_buf_t buf;
369
+ ssize_t nread;
370
+ struct ev_loop* ev = stream->loop->ev;
371
+
372
+ /* XXX: Maybe instead of having UV_READING we just test if
373
+ * tcp->read_cb is NULL or not?
374
+ */
375
+ while (stream->read_cb && ((uv_handle_t*)stream)->flags & UV_READING) {
376
+ assert(stream->alloc_cb);
377
+ buf = stream->alloc_cb((uv_handle_t*)stream, 64 * 1024);
378
+
379
+ assert(buf.len > 0);
380
+ assert(buf.base);
381
+ assert(stream->fd >= 0);
382
+
383
+ do {
384
+ nread = read(stream->fd, buf.base, buf.len);
385
+ }
386
+ while (nread < 0 && errno == EINTR);
387
+
388
+ if (nread < 0) {
389
+ /* Error */
390
+ if (errno == EAGAIN) {
391
+ /* Wait for the next one. */
392
+ if (stream->flags & UV_READING) {
393
+ ev_io_start(ev, &stream->read_watcher);
394
+ }
395
+ uv_err_new(stream->loop, EAGAIN);
396
+ stream->read_cb(stream, 0, buf);
397
+ return;
398
+ } else {
399
+ /* Error. User should call uv_close(). */
400
+ uv_err_new(stream->loop, errno);
401
+ stream->read_cb(stream, -1, buf);
402
+ assert(!ev_is_active(&stream->read_watcher));
403
+ return;
404
+ }
405
+ } else if (nread == 0) {
406
+ /* EOF */
407
+ uv_err_new_artificial(stream->loop, UV_EOF);
408
+ ev_io_stop(ev, &stream->read_watcher);
409
+ stream->read_cb(stream, -1, buf);
410
+ return;
411
+ } else {
412
+ /* Successful read */
413
+ stream->read_cb(stream, nread, buf);
414
+ }
415
+ }
416
+ }
417
+
418
+
419
+ int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) {
420
+ assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE) &&
421
+ "uv_shutdown (unix) only supports uv_handle_t right now");
422
+ assert(stream->fd >= 0);
423
+
424
+ if (!(stream->flags & UV_WRITABLE) ||
425
+ stream->flags & UV_SHUT ||
426
+ stream->flags & UV_CLOSED ||
427
+ stream->flags & UV_CLOSING) {
428
+ uv_err_new(stream->loop, EINVAL);
429
+ return -1;
430
+ }
431
+
432
+ /* Initialize request */
433
+ uv__req_init((uv_req_t*)req);
434
+ req->handle = stream;
435
+ req->cb = cb;
436
+
437
+ stream->shutdown_req = req;
438
+ req->type = UV_SHUTDOWN;
439
+
440
+ ((uv_handle_t*)stream)->flags |= UV_SHUTTING;
441
+
442
+
443
+ ev_io_start(stream->loop->ev, &stream->write_watcher);
444
+
445
+ return 0;
446
+ }
447
+
448
+
449
+ void uv__stream_io(EV_P_ ev_io* watcher, int revents) {
450
+ uv_stream_t* stream = watcher->data;
451
+
452
+ assert(stream->type == UV_TCP ||
453
+ stream->type == UV_NAMED_PIPE);
454
+ assert(watcher == &stream->read_watcher ||
455
+ watcher == &stream->write_watcher);
456
+ assert(!(stream->flags & UV_CLOSING));
457
+
458
+ if (stream->connect_req) {
459
+ uv__stream_connect(stream);
460
+ } else {
461
+ assert(revents & (EV_READ | EV_WRITE));
462
+ assert(stream->fd >= 0);
463
+
464
+ if (revents & EV_READ) {
465
+ uv__read((uv_stream_t*)stream);
466
+ }
467
+
468
+ if (revents & EV_WRITE) {
469
+ uv_write_t* req = uv__write(stream);
470
+ if (req) {
471
+ /* Error. Notify the user. */
472
+ if (req->cb) {
473
+ req->cb(req, -1);
474
+ }
475
+ } else {
476
+ uv__write_callbacks(stream);
477
+ }
478
+ }
479
+ }
480
+ }
481
+
482
+
483
+ /**
484
+ * We get called here from directly following a call to connect(2).
485
+ * In order to determine if we've errored out or succeeded must call
486
+ * getsockopt.
487
+ */
488
+ static void uv__stream_connect(uv_stream_t* stream) {
489
+ int error;
490
+ uv_connect_t* req = stream->connect_req;
491
+ socklen_t errorsize = sizeof(int);
492
+
493
+ assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE);
494
+ assert(req);
495
+
496
+ if (stream->delayed_error) {
497
+ /* To smooth over the differences between unixes errors that
498
+ * were reported synchronously on the first connect can be delayed
499
+ * until the next tick--which is now.
500
+ */
501
+ error = stream->delayed_error;
502
+ stream->delayed_error = 0;
503
+ } else {
504
+ /* Normal situation: we need to get the socket error from the kernel. */
505
+ assert(stream->fd >= 0);
506
+ getsockopt(stream->fd, SOL_SOCKET, SO_ERROR, &error, &errorsize);
507
+ }
508
+
509
+ if (!error) {
510
+ ev_io_start(stream->loop->ev, &stream->read_watcher);
511
+
512
+ /* Successful connection */
513
+ stream->connect_req = NULL;
514
+ if (req->cb) {
515
+ req->cb(req, 0);
516
+ }
517
+
518
+ } else if (error == EINPROGRESS) {
519
+ /* Still connecting. */
520
+ return;
521
+ } else {
522
+ /* Error */
523
+ uv_err_new(stream->loop, error);
524
+
525
+ stream->connect_req = NULL;
526
+ if (req->cb) {
527
+ req->cb(req, -1);
528
+ }
529
+ }
530
+ }
531
+
532
+
533
+ int uv__connect(uv_connect_t* req, uv_stream_t* stream, struct sockaddr* addr,
534
+ socklen_t addrlen, uv_connect_cb cb) {
535
+ int sockfd;
536
+ int r;
537
+
538
+ if (stream->fd <= 0) {
539
+ if ((sockfd = uv__socket(addr->sa_family, SOCK_STREAM, 0)) == -1) {
540
+ uv_err_new(stream->loop, errno);
541
+ return -1;
542
+ }
543
+
544
+ if (uv__stream_open(stream, sockfd, UV_READABLE | UV_WRITABLE)) {
545
+ uv__close(sockfd);
546
+ return -2;
547
+ }
548
+ }
549
+
550
+ uv__req_init((uv_req_t*)req);
551
+ req->cb = cb;
552
+ req->handle = stream;
553
+ req->type = UV_CONNECT;
554
+ ngx_queue_init(&req->queue);
555
+
556
+ if (stream->connect_req) {
557
+ uv_err_new(stream->loop, EALREADY);
558
+ return -1;
559
+ }
560
+
561
+ if (stream->type != UV_TCP) {
562
+ uv_err_new(stream->loop, ENOTSOCK);
563
+ return -1;
564
+ }
565
+
566
+ stream->connect_req = req;
567
+
568
+ do {
569
+ r = connect(stream->fd, addr, addrlen);
570
+ }
571
+ while (r == -1 && errno == EINTR);
572
+
573
+ stream->delayed_error = 0;
574
+
575
+ if (r != 0 && errno != EINPROGRESS) {
576
+ switch (errno) {
577
+ /* If we get a ECONNREFUSED wait until the next tick to report the
578
+ * error. Solaris wants to report immediately--other unixes want to
579
+ * wait.
580
+ */
581
+ case ECONNREFUSED:
582
+ stream->delayed_error = errno;
583
+ break;
584
+
585
+ default:
586
+ uv_err_new(stream->loop, errno);
587
+ return -1;
588
+ }
589
+ }
590
+
591
+ assert(stream->write_watcher.data == stream);
592
+ ev_io_start(stream->loop->ev, &stream->write_watcher);
593
+
594
+ if (stream->delayed_error) {
595
+ ev_feed_event(stream->loop->ev, &stream->write_watcher, EV_WRITE);
596
+ }
597
+
598
+ return 0;
599
+ }
600
+
601
+
602
+ /* The buffers to be written must remain valid until the callback is called.
603
+ * This is not required for the uv_buf_t array.
604
+ */
605
+ int uv_write(uv_write_t* req, uv_stream_t* handle, uv_buf_t bufs[], int bufcnt,
606
+ uv_write_cb cb) {
607
+ uv_stream_t* stream;
608
+ int empty_queue;
609
+
610
+ stream = (uv_stream_t*)handle;
611
+
612
+ /* Initialize the req */
613
+ uv__req_init((uv_req_t*) req);
614
+ req->cb = cb;
615
+ req->handle = handle;
616
+ ngx_queue_init(&req->queue);
617
+
618
+ assert((handle->type == UV_TCP || handle->type == UV_NAMED_PIPE)
619
+ && "uv_write (unix) does not yet support other types of streams");
620
+
621
+ empty_queue = (stream->write_queue_size == 0);
622
+
623
+ if (stream->fd < 0) {
624
+ uv_err_new(stream->loop, EBADF);
625
+ return -1;
626
+ }
627
+
628
+ ngx_queue_init(&req->queue);
629
+ req->type = UV_WRITE;
630
+
631
+
632
+ if (bufcnt < UV_REQ_BUFSML_SIZE) {
633
+ req->bufs = req->bufsml;
634
+ }
635
+ else {
636
+ req->bufs = malloc(sizeof(uv_buf_t) * bufcnt);
637
+ }
638
+
639
+ memcpy(req->bufs, bufs, bufcnt * sizeof(uv_buf_t));
640
+ req->bufcnt = bufcnt;
641
+
642
+ /*
643
+ * fprintf(stderr, "cnt: %d bufs: %p bufsml: %p\n", bufcnt, req->bufs, req->bufsml);
644
+ */
645
+
646
+ req->write_index = 0;
647
+ stream->write_queue_size += uv__buf_count(bufs, bufcnt);
648
+
649
+ /* Append the request to write_queue. */
650
+ ngx_queue_insert_tail(&stream->write_queue, &req->queue);
651
+
652
+ assert(!ngx_queue_empty(&stream->write_queue));
653
+ assert(stream->write_watcher.cb == uv__stream_io);
654
+ assert(stream->write_watcher.data == stream);
655
+ assert(stream->write_watcher.fd == stream->fd);
656
+
657
+ /* If the queue was empty when this function began, we should attempt to
658
+ * do the write immediately. Otherwise start the write_watcher and wait
659
+ * for the fd to become writable.
660
+ */
661
+ if (empty_queue) {
662
+ if (uv__write(stream)) {
663
+ /* Error. uv_last_error has been set. */
664
+ return -1;
665
+ }
666
+ }
667
+
668
+ /* If the queue is now empty - we've flushed the request already. That
669
+ * means we need to make the callback. The callback can only be done on a
670
+ * fresh stack so we feed the event loop in order to service it.
671
+ */
672
+ if (ngx_queue_empty(&stream->write_queue)) {
673
+ ev_feed_event(stream->loop->ev, &stream->write_watcher, EV_WRITE);
674
+ } else {
675
+ /* Otherwise there is data to write - so we should wait for the file
676
+ * descriptor to become writable.
677
+ */
678
+ ev_io_start(stream->loop->ev, &stream->write_watcher);
679
+ }
680
+
681
+ return 0;
682
+ }
683
+
684
+
685
+ int uv_read_start(uv_stream_t* stream, uv_alloc_cb alloc_cb, uv_read_cb read_cb) {
686
+ assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE);
687
+
688
+ if (stream->flags & UV_CLOSING) {
689
+ uv_err_new(stream->loop, EINVAL);
690
+ return -1;
691
+ }
692
+
693
+ /* The UV_READING flag is irrelevant of the state of the tcp - it just
694
+ * expresses the desired state of the user.
695
+ */
696
+ ((uv_handle_t*)stream)->flags |= UV_READING;
697
+
698
+ /* TODO: try to do the read inline? */
699
+ /* TODO: keep track of tcp state. If we've gotten a EOF then we should
700
+ * not start the IO watcher.
701
+ */
702
+ assert(stream->fd >= 0);
703
+ assert(alloc_cb);
704
+
705
+ stream->read_cb = read_cb;
706
+ stream->alloc_cb = alloc_cb;
707
+
708
+ /* These should have been set by uv_tcp_init. */
709
+ assert(stream->read_watcher.cb == uv__stream_io);
710
+
711
+ ev_io_start(stream->loop->ev, &stream->read_watcher);
712
+ return 0;
713
+ }
714
+
715
+
716
+ int uv_read_stop(uv_stream_t* stream) {
717
+ uv_tcp_t* tcp = (uv_tcp_t*)stream;
718
+
719
+ ((uv_handle_t*)tcp)->flags &= ~UV_READING;
720
+
721
+ ev_io_stop(tcp->loop->ev, &tcp->read_watcher);
722
+ tcp->read_cb = NULL;
723
+ tcp->alloc_cb = NULL;
724
+ return 0;
725
+ }
726
+
727
+