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,524 @@
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 <string.h>
27
+ #include <errno.h>
28
+ #include <stdlib.h>
29
+
30
+
31
+ static void uv__udp_watcher_start(uv_udp_t* handle, ev_io* w);
32
+ static void uv__udp_run_completed(uv_udp_t* handle);
33
+ static void uv__udp_run_pending(uv_udp_t* handle);
34
+ static void uv__udp_recvmsg(uv_udp_t* handle);
35
+ static void uv__udp_sendmsg(uv_udp_t* handle);
36
+ static void uv__udp_io(EV_P_ ev_io* w, int events);
37
+ static int uv__udp_bind(uv_udp_t* handle, int domain, struct sockaddr* addr,
38
+ socklen_t len, unsigned flags);
39
+ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain);
40
+ static int uv__udp_send(uv_udp_send_t* req, uv_udp_t* handle, uv_buf_t bufs[],
41
+ int bufcnt, struct sockaddr* addr, socklen_t addrlen, uv_udp_send_cb send_cb);
42
+
43
+
44
+ static void uv__udp_watcher_start(uv_udp_t* handle, ev_io* w) {
45
+ int flags;
46
+
47
+ assert(w == &handle->read_watcher
48
+ || w == &handle->write_watcher);
49
+
50
+ flags = (w == &handle->read_watcher ? EV_READ : EV_WRITE);
51
+
52
+ w->data = handle;
53
+ ev_set_cb(w, uv__udp_io);
54
+ ev_io_set(w, handle->fd, flags);
55
+ ev_io_start(handle->loop->ev, w);
56
+ }
57
+
58
+
59
+ void uv__udp_watcher_stop(uv_udp_t* handle, ev_io* w) {
60
+ int flags;
61
+
62
+ assert(w == &handle->read_watcher
63
+ || w == &handle->write_watcher);
64
+
65
+ flags = (w == &handle->read_watcher ? EV_READ : EV_WRITE);
66
+
67
+ ev_io_stop(handle->loop->ev, w);
68
+ ev_io_set(w, -1, flags);
69
+ ev_set_cb(w, NULL);
70
+ w->data = (void*)0xDEADBABE;
71
+ }
72
+
73
+
74
+ void uv__udp_destroy(uv_udp_t* handle) {
75
+ uv_udp_send_t* req;
76
+ ngx_queue_t* q;
77
+
78
+ uv__udp_run_completed(handle);
79
+
80
+ while (!ngx_queue_empty(&handle->write_queue)) {
81
+ q = ngx_queue_head(&handle->write_queue);
82
+ ngx_queue_remove(q);
83
+
84
+ req = ngx_queue_data(q, uv_udp_send_t, queue);
85
+ if (req->send_cb) {
86
+ /* FIXME proper error code like UV_EABORTED */
87
+ uv_err_new_artificial(handle->loop, UV_EINTR);
88
+ req->send_cb(req, -1);
89
+ }
90
+ }
91
+
92
+ /* Now tear down the handle. */
93
+ handle->flags = 0;
94
+ handle->recv_cb = NULL;
95
+ handle->alloc_cb = NULL;
96
+ /* but _do not_ touch close_cb */
97
+
98
+ if (handle->fd != -1) {
99
+ uv__close(handle->fd);
100
+ handle->fd = -1;
101
+ }
102
+
103
+ uv__udp_watcher_stop(handle, &handle->read_watcher);
104
+ uv__udp_watcher_stop(handle, &handle->write_watcher);
105
+ }
106
+
107
+
108
+ static void uv__udp_run_pending(uv_udp_t* handle) {
109
+ uv_udp_send_t* req;
110
+ ngx_queue_t* q;
111
+ struct msghdr h;
112
+ ssize_t size;
113
+
114
+ while (!ngx_queue_empty(&handle->write_queue)) {
115
+ q = ngx_queue_head(&handle->write_queue);
116
+ assert(q != NULL);
117
+
118
+ req = ngx_queue_data(q, uv_udp_send_t, queue);
119
+ assert(req != NULL);
120
+
121
+ memset(&h, 0, sizeof h);
122
+ h.msg_name = &req->addr;
123
+ h.msg_namelen = req->addrlen;
124
+ h.msg_iov = (struct iovec*)req->bufs;
125
+ h.msg_iovlen = req->bufcnt;
126
+
127
+ do {
128
+ size = sendmsg(handle->fd, &h, 0);
129
+ }
130
+ while (size == -1 && errno == EINTR);
131
+
132
+ /* TODO try to write once or twice more in the
133
+ * hope that the socket becomes readable again?
134
+ */
135
+ if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
136
+ break;
137
+
138
+ req->status = (size == -1 ? -errno : size);
139
+
140
+ #ifndef NDEBUG
141
+ /* Sanity check. */
142
+ if (size != -1) {
143
+ ssize_t nbytes;
144
+ int i;
145
+
146
+ for (nbytes = i = 0; i < req->bufcnt; i++)
147
+ nbytes += req->bufs[i].len;
148
+
149
+ assert(size == nbytes);
150
+ }
151
+ #endif
152
+
153
+ /* Sending a datagram is an atomic operation: either all data
154
+ * is written or nothing is (and EMSGSIZE is raised). That is
155
+ * why we don't handle partial writes. Just pop the request
156
+ * off the write queue and onto the completed queue, done.
157
+ */
158
+ ngx_queue_remove(&req->queue);
159
+ ngx_queue_insert_tail(&handle->write_completed_queue, &req->queue);
160
+ }
161
+ }
162
+
163
+
164
+ static void uv__udp_run_completed(uv_udp_t* handle) {
165
+ uv_udp_send_t* req;
166
+ ngx_queue_t* q;
167
+
168
+ while (!ngx_queue_empty(&handle->write_completed_queue)) {
169
+ q = ngx_queue_head(&handle->write_completed_queue);
170
+ assert(q != NULL);
171
+
172
+ ngx_queue_remove(q);
173
+
174
+ req = ngx_queue_data(q, uv_udp_send_t, queue);
175
+ assert(req != NULL);
176
+
177
+ if (req->bufs != req->bufsml)
178
+ free(req->bufs);
179
+
180
+ if (req->send_cb == NULL)
181
+ continue;
182
+
183
+ /* req->status >= 0 == bytes written
184
+ * req->status < 0 == errno
185
+ */
186
+ if (req->status >= 0) {
187
+ req->send_cb(req, 0);
188
+ }
189
+ else {
190
+ uv_err_new(handle->loop, -req->status);
191
+ req->send_cb(req, -1);
192
+ }
193
+ }
194
+ }
195
+
196
+
197
+ static void uv__udp_recvmsg(uv_udp_t* handle) {
198
+ struct sockaddr_storage peer;
199
+ struct msghdr h;
200
+ ssize_t nread;
201
+ uv_buf_t buf;
202
+ int flags;
203
+
204
+ assert(handle->recv_cb != NULL);
205
+ assert(handle->alloc_cb != NULL);
206
+
207
+ do {
208
+ /* FIXME: hoist alloc_cb out the loop but for now follow uv__read() */
209
+ buf = handle->alloc_cb((uv_handle_t*)handle, 64 * 1024);
210
+ assert(buf.len > 0);
211
+ assert(buf.base != NULL);
212
+
213
+ memset(&h, 0, sizeof h);
214
+ h.msg_name = &peer;
215
+ h.msg_namelen = sizeof peer;
216
+ h.msg_iov = (struct iovec*)&buf;
217
+ h.msg_iovlen = 1;
218
+
219
+ do {
220
+ nread = recvmsg(handle->fd, &h, 0);
221
+ }
222
+ while (nread == -1 && errno == EINTR);
223
+
224
+ if (nread == -1) {
225
+ if (errno == EAGAIN || errno == EWOULDBLOCK) {
226
+ uv_err_new(handle->loop, EAGAIN);
227
+ handle->recv_cb(handle, 0, buf, NULL, 0);
228
+ }
229
+ else {
230
+ uv_err_new(handle->loop, errno);
231
+ handle->recv_cb(handle, -1, buf, NULL, 0);
232
+ }
233
+ }
234
+ else {
235
+ flags = 0;
236
+
237
+ if (h.msg_flags & MSG_TRUNC)
238
+ flags |= UV_UDP_PARTIAL;
239
+
240
+ handle->recv_cb(handle,
241
+ nread,
242
+ buf,
243
+ (struct sockaddr*)&peer,
244
+ flags);
245
+ }
246
+ }
247
+ /* recv_cb callback may decide to pause or close the handle */
248
+ while (nread != -1
249
+ && handle->fd != -1
250
+ && handle->recv_cb != NULL);
251
+ }
252
+
253
+
254
+ static void uv__udp_sendmsg(uv_udp_t* handle) {
255
+ assert(!ngx_queue_empty(&handle->write_queue)
256
+ || !ngx_queue_empty(&handle->write_completed_queue));
257
+
258
+ /* Write out pending data first. */
259
+ uv__udp_run_pending(handle);
260
+
261
+ /* Drain 'request completed' queue. */
262
+ uv__udp_run_completed(handle);
263
+
264
+ if (!ngx_queue_empty(&handle->write_completed_queue)) {
265
+ /* Schedule completion callbacks. */
266
+ ev_feed_event(handle->loop->ev, &handle->write_watcher, EV_WRITE);
267
+ }
268
+ else if (ngx_queue_empty(&handle->write_queue)) {
269
+ /* Pending queue and completion queue empty, stop watcher. */
270
+ uv__udp_watcher_stop(handle, &handle->write_watcher);
271
+ }
272
+ }
273
+
274
+
275
+ static void uv__udp_io(EV_P_ ev_io* w, int events) {
276
+ uv_udp_t* handle;
277
+
278
+ handle = w->data;
279
+ assert(handle != NULL);
280
+ assert(handle->type == UV_UDP);
281
+ assert(handle->fd >= 0);
282
+ assert(!(events & ~(EV_READ|EV_WRITE)));
283
+
284
+ if (events & EV_READ)
285
+ uv__udp_recvmsg(handle);
286
+
287
+ if (events & EV_WRITE)
288
+ uv__udp_sendmsg(handle);
289
+ }
290
+
291
+
292
+ static int uv__udp_bind(uv_udp_t* handle,
293
+ int domain,
294
+ struct sockaddr* addr,
295
+ socklen_t len,
296
+ unsigned flags) {
297
+ int saved_errno;
298
+ int status;
299
+ int yes;
300
+ int fd;
301
+
302
+ saved_errno = errno;
303
+ status = -1;
304
+
305
+ /* Check for bad flags. */
306
+ if (flags & ~UV_UDP_IPV6ONLY) {
307
+ uv_err_new(handle->loop, EINVAL);
308
+ goto out;
309
+ }
310
+
311
+ /* Cannot set IPv6-only mode on non-IPv6 socket. */
312
+ if ((flags & UV_UDP_IPV6ONLY) && domain != AF_INET6) {
313
+ uv_err_new(handle->loop, EINVAL);
314
+ goto out;
315
+ }
316
+
317
+ /* Check for already active socket. */
318
+ if (handle->fd != -1) {
319
+ uv_err_new_artificial(handle->loop, UV_EALREADY);
320
+ goto out;
321
+ }
322
+
323
+ if ((fd = uv__socket(domain, SOCK_DGRAM, 0)) == -1) {
324
+ uv_err_new(handle->loop, errno);
325
+ goto out;
326
+ }
327
+
328
+ if (flags & UV_UDP_IPV6ONLY) {
329
+ #ifdef IPV6_V6ONLY
330
+ yes = 1;
331
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) {
332
+ uv_err_new(handle->loop, errno);
333
+ goto out;
334
+ }
335
+ #else
336
+ uv_err_new((uv_handle_t*)handle, ENOTSUP);
337
+ goto out;
338
+ #endif
339
+ }
340
+
341
+ if (bind(fd, addr, len) == -1) {
342
+ uv_err_new(handle->loop, errno);
343
+ goto out;
344
+ }
345
+
346
+ handle->fd = fd;
347
+ status = 0;
348
+
349
+ out:
350
+ if (status)
351
+ uv__close(fd);
352
+
353
+ errno = saved_errno;
354
+ return status;
355
+ }
356
+
357
+
358
+ static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, int domain) {
359
+ struct sockaddr_storage taddr;
360
+ socklen_t addrlen;
361
+
362
+ assert(domain == AF_INET || domain == AF_INET6);
363
+
364
+ if (handle->fd != -1)
365
+ return 0;
366
+
367
+ switch (domain) {
368
+ case AF_INET:
369
+ {
370
+ struct sockaddr_in* addr = (void*)&taddr;
371
+ memset(addr, 0, sizeof *addr);
372
+ addr->sin_family = AF_INET;
373
+ addr->sin_addr.s_addr = INADDR_ANY;
374
+ addrlen = sizeof *addr;
375
+ break;
376
+ }
377
+ case AF_INET6:
378
+ {
379
+ struct sockaddr_in6* addr = (void*)&taddr;
380
+ memset(addr, 0, sizeof *addr);
381
+ addr->sin6_family = AF_INET6;
382
+ addr->sin6_addr = in6addr_any;
383
+ addrlen = sizeof *addr;
384
+ break;
385
+ }
386
+ default:
387
+ assert(0 && "unsupported address family");
388
+ abort();
389
+ }
390
+
391
+ return uv__udp_bind(handle, domain, (struct sockaddr*)&taddr, addrlen, 0);
392
+ }
393
+
394
+
395
+ static int uv__udp_send(uv_udp_send_t* req,
396
+ uv_udp_t* handle,
397
+ uv_buf_t bufs[],
398
+ int bufcnt,
399
+ struct sockaddr* addr,
400
+ socklen_t addrlen,
401
+ uv_udp_send_cb send_cb) {
402
+ if (uv__udp_maybe_deferred_bind(handle, addr->sa_family))
403
+ return -1;
404
+
405
+ /* Don't use uv__req_init(), it zeroes the data field. */
406
+ handle->loop->counters.req_init++;
407
+
408
+ memcpy(&req->addr, addr, addrlen);
409
+ req->addrlen = addrlen;
410
+ req->send_cb = send_cb;
411
+ req->handle = handle;
412
+ req->bufcnt = bufcnt;
413
+ req->type = UV_UDP_SEND;
414
+
415
+ if (bufcnt <= UV_REQ_BUFSML_SIZE) {
416
+ req->bufs = req->bufsml;
417
+ }
418
+ else if ((req->bufs = malloc(bufcnt * sizeof(bufs[0]))) == NULL) {
419
+ uv_err_new(handle->loop, ENOMEM);
420
+ return -1;
421
+ }
422
+ memcpy(req->bufs, bufs, bufcnt * sizeof(bufs[0]));
423
+
424
+ ngx_queue_insert_tail(&handle->write_queue, &req->queue);
425
+ uv__udp_watcher_start(handle, &handle->write_watcher);
426
+
427
+ return 0;
428
+ }
429
+
430
+
431
+ int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) {
432
+ memset(handle, 0, sizeof *handle);
433
+
434
+ uv__handle_init(loop, (uv_handle_t*)handle, UV_UDP);
435
+ loop->counters.udp_init++;
436
+
437
+ handle->fd = -1;
438
+ ngx_queue_init(&handle->write_queue);
439
+ ngx_queue_init(&handle->write_completed_queue);
440
+
441
+ return 0;
442
+ }
443
+
444
+
445
+ int uv_udp_bind(uv_udp_t* handle, struct sockaddr_in addr, unsigned flags) {
446
+ return uv__udp_bind(handle,
447
+ AF_INET,
448
+ (struct sockaddr*)&addr,
449
+ sizeof addr,
450
+ flags);
451
+ }
452
+
453
+
454
+ int uv_udp_bind6(uv_udp_t* handle, struct sockaddr_in6 addr, unsigned flags) {
455
+ return uv__udp_bind(handle,
456
+ AF_INET6,
457
+ (struct sockaddr*)&addr,
458
+ sizeof addr,
459
+ flags);
460
+ }
461
+
462
+
463
+ int uv_udp_send(uv_udp_send_t* req,
464
+ uv_udp_t* handle,
465
+ uv_buf_t bufs[],
466
+ int bufcnt,
467
+ struct sockaddr_in addr,
468
+ uv_udp_send_cb send_cb) {
469
+ return uv__udp_send(req,
470
+ handle,
471
+ bufs,
472
+ bufcnt,
473
+ (struct sockaddr*)&addr,
474
+ sizeof addr,
475
+ send_cb);
476
+ }
477
+
478
+
479
+ int uv_udp_send6(uv_udp_send_t* req,
480
+ uv_udp_t* handle,
481
+ uv_buf_t bufs[],
482
+ int bufcnt,
483
+ struct sockaddr_in6 addr,
484
+ uv_udp_send_cb send_cb) {
485
+ return uv__udp_send(req,
486
+ handle,
487
+ bufs,
488
+ bufcnt,
489
+ (struct sockaddr*)&addr,
490
+ sizeof addr,
491
+ send_cb);
492
+ }
493
+
494
+
495
+ int uv_udp_recv_start(uv_udp_t* handle,
496
+ uv_alloc_cb alloc_cb,
497
+ uv_udp_recv_cb recv_cb) {
498
+ if (alloc_cb == NULL || recv_cb == NULL) {
499
+ uv_err_new_artificial(handle->loop, UV_EINVAL);
500
+ return -1;
501
+ }
502
+
503
+ if (ev_is_active(&handle->read_watcher)) {
504
+ uv_err_new_artificial(handle->loop, UV_EALREADY);
505
+ return -1;
506
+ }
507
+
508
+ if (uv__udp_maybe_deferred_bind(handle, AF_INET))
509
+ return -1;
510
+
511
+ handle->alloc_cb = alloc_cb;
512
+ handle->recv_cb = recv_cb;
513
+ uv__udp_watcher_start(handle, &handle->read_watcher);
514
+
515
+ return 0;
516
+ }
517
+
518
+
519
+ int uv_udp_recv_stop(uv_udp_t* handle) {
520
+ uv__udp_watcher_stop(handle, &handle->read_watcher);
521
+ handle->alloc_cb = NULL;
522
+ handle->recv_cb = NULL;
523
+ return 0;
524
+ }
@@ -22,51 +22,55 @@
22
22
 
23
23
  #include "uv.h"
24
24
  #include "eio.h"
25
+
25
26
  #include <assert.h>
27
+ #include <stdio.h>
26
28
 
27
29
 
28
- static uv_async_t uv_eio_want_poll_notifier;
29
- static uv_async_t uv_eio_done_poll_notifier;
30
- static uv_idle_t uv_eio_poller;
31
- static int uv_eio_init_count;
30
+ /* TODO remove me! */
31
+ static uv_loop_t* main_loop;
32
32
 
33
33
 
34
34
  static void uv_eio_do_poll(uv_idle_t* watcher, int status) {
35
- assert(watcher == &uv_eio_poller);
35
+ assert(watcher == &(watcher->loop->uv_eio_poller));
36
36
 
37
37
  /* printf("uv_eio_poller\n"); */
38
38
 
39
- if (eio_poll() != -1 && uv_is_active((uv_handle_t*) &uv_eio_poller)) {
39
+ if (eio_poll() != -1 && uv_is_active((uv_handle_t*) watcher)) {
40
40
  /* printf("uv_eio_poller stop\n"); */
41
- uv_idle_stop(&uv_eio_poller);
42
- uv_unref();
41
+ uv_idle_stop(watcher);
42
+ uv_unref(watcher->loop);
43
43
  }
44
44
  }
45
45
 
46
46
 
47
47
  /* Called from the main thread. */
48
48
  static void uv_eio_want_poll_notifier_cb(uv_async_t* watcher, int status) {
49
- assert(watcher == &uv_eio_want_poll_notifier);
49
+ uv_loop_t* loop = watcher->loop;
50
+
51
+ assert(watcher == &loop->uv_eio_want_poll_notifier);
50
52
 
51
53
  /* printf("want poll notifier\n"); */
52
54
 
53
- if (eio_poll() == -1 && !uv_is_active((uv_handle_t*) &uv_eio_poller)) {
55
+ if (eio_poll() == -1 && !uv_is_active((uv_handle_t*) &loop->uv_eio_poller)) {
54
56
  /* printf("uv_eio_poller start\n"); */
55
- uv_idle_start(&uv_eio_poller, uv_eio_do_poll);
56
- uv_ref();
57
+ uv_idle_start(&loop->uv_eio_poller, uv_eio_do_poll);
58
+ uv_ref(loop);
57
59
  }
58
60
  }
59
61
 
60
62
 
61
63
  static void uv_eio_done_poll_notifier_cb(uv_async_t* watcher, int revents) {
62
- assert(watcher == &uv_eio_done_poll_notifier);
64
+ uv_loop_t* loop = watcher->loop;
65
+
66
+ assert(watcher == &loop->uv_eio_done_poll_notifier);
63
67
 
64
68
  /* printf("done poll notifier\n"); */
65
69
 
66
- if (eio_poll() != -1 && uv_is_active((uv_handle_t*) &uv_eio_poller)) {
70
+ if (eio_poll() != -1 && uv_is_active((uv_handle_t*) &loop->uv_eio_poller)) {
67
71
  /* printf("uv_eio_poller stop\n"); */
68
- uv_idle_stop(&uv_eio_poller);
69
- uv_unref();
72
+ uv_idle_stop(&loop->uv_eio_poller);
73
+ uv_unref(loop);
70
74
  }
71
75
  }
72
76
 
@@ -77,7 +81,13 @@ static void uv_eio_done_poll_notifier_cb(uv_async_t* watcher, int revents) {
77
81
  */
78
82
  static void uv_eio_want_poll(void) {
79
83
  /* Signal the main thread that eio_poll need to be processed. */
80
- uv_async_send(&uv_eio_want_poll_notifier);
84
+
85
+ /*
86
+ * TODO need to select the correct uv_loop_t and async_send to
87
+ * uv_eio_want_poll_notifier.
88
+ */
89
+
90
+ uv_async_send(&main_loop->uv_eio_want_poll_notifier);
81
91
  }
82
92
 
83
93
 
@@ -86,22 +96,27 @@ static void uv_eio_done_poll(void) {
86
96
  * Signal the main thread that we should stop calling eio_poll().
87
97
  * from the idle watcher.
88
98
  */
89
- uv_async_send(&uv_eio_done_poll_notifier);
99
+ uv_async_send(&main_loop->uv_eio_done_poll_notifier);
90
100
  }
91
101
 
92
102
 
93
- void uv_eio_init() {
94
- if (uv_eio_init_count == 0) {
95
- uv_eio_init_count++;
103
+ void uv_eio_init(uv_loop_t* loop) {
104
+ if (loop->counters.eio_init == 0) {
105
+ loop->counters.eio_init++;
106
+
107
+ main_loop = loop;
96
108
 
97
- uv_idle_init(&uv_eio_poller);
98
- uv_idle_start(&uv_eio_poller, uv_eio_do_poll);
109
+ uv_idle_init(loop, &loop->uv_eio_poller);
110
+ uv_idle_start(&loop->uv_eio_poller, uv_eio_do_poll);
99
111
 
100
- uv_async_init(&uv_eio_want_poll_notifier, uv_eio_want_poll_notifier_cb);
101
- uv_unref();
112
+ loop->uv_eio_want_poll_notifier.data = loop;
113
+ uv_async_init(loop, &loop->uv_eio_want_poll_notifier,
114
+ uv_eio_want_poll_notifier_cb);
115
+ uv_unref(loop);
102
116
 
103
- uv_async_init(&uv_eio_done_poll_notifier, uv_eio_done_poll_notifier_cb);
104
- uv_unref();
117
+ uv_async_init(loop, &loop->uv_eio_done_poll_notifier,
118
+ uv_eio_done_poll_notifier_cb);
119
+ uv_unref(loop);
105
120
 
106
121
  eio_init(uv_eio_want_poll, uv_eio_done_poll);
107
122
  /*
@@ -109,5 +124,11 @@ void uv_eio_init() {
109
124
  * race conditions. See Node's test/simple/test-eio-race.js
110
125
  */
111
126
  eio_set_max_poll_reqs(10);
127
+ } else {
128
+ /*
129
+ * If this assertion breaks then Ryan hasn't implemented support for
130
+ * receiving thread pool requests back to multiple threads.
131
+ */
132
+ assert(main_loop == loop);
112
133
  }
113
134
  }
@@ -9,5 +9,5 @@
9
9
  * safe to call more than once.
10
10
  * TODO: uv_eio_deinit
11
11
  */
12
- void uv_eio_init(void);
12
+ void uv_eio_init(uv_loop_t*);
13
13
  #endif