nutcracker 0.2.3 → 0.2.4.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (296) hide show
  1. data/README.md +53 -5
  2. data/Rakefile +14 -19
  3. data/bin/nutcracker +6 -1
  4. data/ext/nutcracker/ChangeLog +9 -0
  5. data/ext/nutcracker/LICENSE +0 -0
  6. data/ext/nutcracker/Makefile +643 -0
  7. data/ext/nutcracker/Makefile.am +0 -0
  8. data/ext/nutcracker/Makefile.in +66 -149
  9. data/ext/nutcracker/NOTICE +0 -0
  10. data/ext/nutcracker/README.md +13 -11
  11. data/ext/nutcracker/aclocal.m4 +112 -201
  12. data/ext/nutcracker/autom4te.cache/output.0 +18664 -0
  13. data/ext/nutcracker/autom4te.cache/output.1 +18664 -0
  14. data/ext/nutcracker/autom4te.cache/output.2 +18664 -0
  15. data/ext/nutcracker/autom4te.cache/requests +494 -0
  16. data/ext/nutcracker/autom4te.cache/traces.0 +2415 -0
  17. data/ext/nutcracker/autom4te.cache/traces.1 +945 -0
  18. data/ext/nutcracker/autom4te.cache/traces.2 +2415 -0
  19. data/ext/nutcracker/conf/nutcracker.leaf.yml +0 -0
  20. data/ext/nutcracker/conf/nutcracker.root.yml +0 -0
  21. data/ext/nutcracker/conf/nutcracker.yml +0 -0
  22. data/ext/nutcracker/config.h +332 -0
  23. data/ext/nutcracker/config.h.in +15 -0
  24. data/ext/nutcracker/config.log +2684 -0
  25. data/ext/nutcracker/config.status +2317 -0
  26. data/ext/nutcracker/config/config.guess +23 -84
  27. data/ext/nutcracker/config/config.sub +23 -93
  28. data/ext/nutcracker/config/depcomp +35 -81
  29. data/ext/nutcracker/config/install-sh +109 -122
  30. data/ext/nutcracker/config/ltmain.sh +1053 -721
  31. data/ext/nutcracker/config/missing +20 -29
  32. data/ext/nutcracker/configure +2122 -2320
  33. data/ext/nutcracker/configure.ac +35 -3
  34. data/ext/nutcracker/contrib/Makefile +494 -0
  35. data/ext/nutcracker/contrib/Makefile.am +0 -0
  36. data/ext/nutcracker/contrib/Makefile.in +41 -107
  37. data/ext/nutcracker/contrib/yaml-0.1.4.tar.gz +0 -0
  38. data/ext/nutcracker/contrib/yaml-0.1.4/Makefile +736 -0
  39. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.0 +13102 -0
  40. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.1 +13085 -0
  41. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.2 +13085 -0
  42. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/requests +476 -0
  43. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.0 +2339 -0
  44. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.1 +545 -0
  45. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.2 +2339 -0
  46. data/ext/nutcracker/contrib/yaml-0.1.4/config.h +81 -0
  47. data/ext/nutcracker/contrib/yaml-0.1.4/config.h.in~ +80 -0
  48. data/ext/nutcracker/contrib/yaml-0.1.4/config.log +688 -0
  49. data/ext/nutcracker/contrib/yaml-0.1.4/config.status +2032 -0
  50. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/annotated.html +51 -0
  51. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/bc_s.png +0 -0
  52. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/classes.html +41 -0
  53. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/closed.png +0 -0
  54. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/doxygen.css +656 -0
  55. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/doxygen.png +0 -0
  56. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/files.html +40 -0
  57. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions.html +91 -0
  58. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x62.html +84 -0
  59. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x63.html +87 -0
  60. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x64.html +83 -0
  61. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x65.html +110 -0
  62. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x66.html +79 -0
  63. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x68.html +80 -0
  64. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x69.html +92 -0
  65. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6b.html +71 -0
  66. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6c.html +88 -0
  67. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6d.html +96 -0
  68. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6e.html +71 -0
  69. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x6f.html +80 -0
  70. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x70.html +100 -0
  71. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x71.html +71 -0
  72. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x72.html +87 -0
  73. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x73.html +163 -0
  74. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x74.html +115 -0
  75. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x75.html +71 -0
  76. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x76.html +80 -0
  77. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_0x77.html +77 -0
  78. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars.html +91 -0
  79. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x62.html +84 -0
  80. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x63.html +87 -0
  81. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x64.html +83 -0
  82. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x65.html +110 -0
  83. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x66.html +79 -0
  84. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x68.html +80 -0
  85. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x69.html +92 -0
  86. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6b.html +71 -0
  87. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6c.html +88 -0
  88. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6d.html +96 -0
  89. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6e.html +71 -0
  90. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x6f.html +80 -0
  91. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x70.html +100 -0
  92. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x71.html +71 -0
  93. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x72.html +87 -0
  94. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x73.html +163 -0
  95. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x74.html +115 -0
  96. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x75.html +71 -0
  97. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x76.html +80 -0
  98. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/functions_vars_0x77.html +77 -0
  99. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals.html +667 -0
  100. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_defs.html +81 -0
  101. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_enum.html +78 -0
  102. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_eval.html +373 -0
  103. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_func.html +196 -0
  104. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/globals_type.html +126 -0
  105. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__basic.html +320 -0
  106. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__emitter.html +819 -0
  107. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__events.html +664 -0
  108. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__export.html +60 -0
  109. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__nodes.html +795 -0
  110. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__parser.html +606 -0
  111. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__styles.html +222 -0
  112. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__tokens.html +246 -0
  113. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/group__version.html +106 -0
  114. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/index.html +31 -0
  115. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/modules.html +42 -0
  116. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/nav_f.png +0 -0
  117. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/nav_h.png +0 -0
  118. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/open.png +0 -0
  119. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__alias__data__s.html +108 -0
  120. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__document__s.html +235 -0
  121. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__emitter__s.html +1300 -0
  122. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__event__s.html +496 -0
  123. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__mark__s.html +108 -0
  124. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__node__pair__s.html +91 -0
  125. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__node__s.html +420 -0
  126. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__parser__s.html +1229 -0
  127. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__simple__key__s.html +97 -0
  128. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__tag__directive__s.html +91 -0
  129. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__token__s.html +413 -0
  130. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/structyaml__version__directive__s.html +91 -0
  131. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_a.png +0 -0
  132. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_b.png +0 -0
  133. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_h.png +0 -0
  134. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tab_s.png +0 -0
  135. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/tabs.css +59 -0
  136. data/ext/nutcracker/contrib/yaml-0.1.4/doc/html/yaml_8h.html +525 -0
  137. data/ext/nutcracker/contrib/yaml-0.1.4/include/Makefile.am +17 -0
  138. data/ext/nutcracker/contrib/yaml-0.1.4/include/Makefile.in +470 -0
  139. data/ext/nutcracker/contrib/yaml-0.1.4/libtool +8890 -0
  140. data/ext/nutcracker/contrib/yaml-0.1.4/src/Makefile +484 -0
  141. data/ext/nutcracker/contrib/yaml-0.1.4/src/api.lo +12 -0
  142. data/ext/nutcracker/contrib/yaml-0.1.4/src/api.o +0 -0
  143. data/ext/nutcracker/contrib/yaml-0.1.4/src/dumper.lo +12 -0
  144. data/ext/nutcracker/contrib/yaml-0.1.4/src/dumper.o +0 -0
  145. data/ext/nutcracker/contrib/yaml-0.1.4/src/emitter.lo +12 -0
  146. data/ext/nutcracker/contrib/yaml-0.1.4/src/emitter.o +0 -0
  147. data/ext/nutcracker/contrib/yaml-0.1.4/src/libyaml.la +41 -0
  148. data/ext/nutcracker/contrib/yaml-0.1.4/src/loader.lo +12 -0
  149. data/ext/nutcracker/contrib/yaml-0.1.4/src/loader.o +0 -0
  150. data/ext/nutcracker/contrib/yaml-0.1.4/src/parser.lo +12 -0
  151. data/ext/nutcracker/contrib/yaml-0.1.4/src/parser.o +0 -0
  152. data/ext/nutcracker/contrib/yaml-0.1.4/src/reader.lo +12 -0
  153. data/ext/nutcracker/contrib/yaml-0.1.4/src/reader.o +0 -0
  154. data/ext/nutcracker/contrib/yaml-0.1.4/src/scanner.lo +12 -0
  155. data/ext/nutcracker/contrib/yaml-0.1.4/src/scanner.o +0 -0
  156. data/ext/nutcracker/contrib/yaml-0.1.4/src/writer.lo +12 -0
  157. data/ext/nutcracker/contrib/yaml-0.1.4/src/writer.o +0 -0
  158. data/ext/nutcracker/contrib/yaml-0.1.4/stamp-h1 +1 -0
  159. data/ext/nutcracker/contrib/yaml-0.1.4/tests/Makefile +675 -0
  160. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor +0 -0
  161. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor-alt +0 -0
  162. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor-alt.o +0 -0
  163. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor.o +0 -0
  164. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter +0 -0
  165. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter-alt +0 -0
  166. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter-alt.o +0 -0
  167. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter.o +0 -0
  168. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-dumper +0 -0
  169. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-dumper.o +0 -0
  170. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-emitter +0 -0
  171. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-emitter.o +0 -0
  172. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-loader +0 -0
  173. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-loader.o +0 -0
  174. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-parser +0 -0
  175. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-parser.o +0 -0
  176. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-scanner +0 -0
  177. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-scanner.o +0 -0
  178. data/ext/nutcracker/contrib/yaml-0.1.4/yaml-0.1.pc +10 -0
  179. data/ext/nutcracker/contrib/yaml-0.1.4/yaml-0.1.pc.in +10 -0
  180. data/ext/nutcracker/extconf.rb +0 -5
  181. data/ext/nutcracker/libtool +9403 -0
  182. data/ext/nutcracker/m4/libtool.m4 +553 -492
  183. data/ext/nutcracker/m4/ltoptions.m4 +7 -6
  184. data/ext/nutcracker/m4/ltversion.m4 +5 -5
  185. data/ext/nutcracker/m4/lt~obsolete.m4 +9 -3
  186. data/ext/nutcracker/notes/c-styleguide.txt +0 -0
  187. data/ext/nutcracker/notes/debug.txt +0 -0
  188. data/ext/nutcracker/notes/memcache.txt +0 -0
  189. data/ext/nutcracker/notes/recommendation.md +21 -2
  190. data/ext/nutcracker/notes/redis.md +9 -9
  191. data/ext/nutcracker/notes/socket.txt +0 -0
  192. data/ext/nutcracker/scripts/nutcracker.init +0 -0
  193. data/ext/nutcracker/scripts/nutcracker.spec +0 -0
  194. data/ext/nutcracker/scripts/redis-check.py +0 -0
  195. data/ext/nutcracker/scripts/redis-check.sh +9 -0
  196. data/ext/nutcracker/src/Makefile +647 -0
  197. data/ext/nutcracker/src/Makefile.am +1 -1
  198. data/ext/nutcracker/src/Makefile.in +74 -153
  199. data/ext/nutcracker/src/hashkit/Makefile +476 -0
  200. data/ext/nutcracker/src/hashkit/Makefile.am +1 -0
  201. data/ext/nutcracker/src/hashkit/Makefile.in +39 -64
  202. data/ext/nutcracker/src/hashkit/libhashkit.a +0 -0
  203. data/ext/nutcracker/src/hashkit/nc_crc16.c +66 -0
  204. data/ext/nutcracker/src/hashkit/nc_crc16.o +0 -0
  205. data/ext/nutcracker/src/hashkit/nc_crc32.c +0 -0
  206. data/ext/nutcracker/src/hashkit/nc_crc32.o +0 -0
  207. data/ext/nutcracker/src/hashkit/nc_fnv.c +0 -0
  208. data/ext/nutcracker/src/hashkit/nc_fnv.o +0 -0
  209. data/ext/nutcracker/src/hashkit/nc_hashkit.h +2 -0
  210. data/ext/nutcracker/src/hashkit/nc_hsieh.c +0 -0
  211. data/ext/nutcracker/src/hashkit/nc_hsieh.o +0 -0
  212. data/ext/nutcracker/src/hashkit/nc_jenkins.c +0 -0
  213. data/ext/nutcracker/src/hashkit/nc_jenkins.o +0 -0
  214. data/ext/nutcracker/src/hashkit/nc_ketama.c +0 -0
  215. data/ext/nutcracker/src/hashkit/nc_ketama.o +0 -0
  216. data/ext/nutcracker/src/hashkit/nc_md5.c +0 -0
  217. data/ext/nutcracker/src/hashkit/nc_md5.o +0 -0
  218. data/ext/nutcracker/src/hashkit/nc_modula.c +18 -6
  219. data/ext/nutcracker/src/hashkit/nc_modula.o +0 -0
  220. data/ext/nutcracker/src/hashkit/nc_murmur.c +0 -0
  221. data/ext/nutcracker/src/hashkit/nc_murmur.o +0 -0
  222. data/ext/nutcracker/src/hashkit/nc_one_at_a_time.c +0 -0
  223. data/ext/nutcracker/src/hashkit/nc_one_at_a_time.o +0 -0
  224. data/ext/nutcracker/src/hashkit/nc_random.c +0 -0
  225. data/ext/nutcracker/src/hashkit/nc_random.o +0 -0
  226. data/ext/nutcracker/src/nc.c +0 -0
  227. data/ext/nutcracker/src/nc.o +0 -0
  228. data/ext/nutcracker/src/nc_array.c +0 -0
  229. data/ext/nutcracker/src/nc_array.h +0 -0
  230. data/ext/nutcracker/src/nc_array.o +0 -0
  231. data/ext/nutcracker/src/nc_client.c +0 -0
  232. data/ext/nutcracker/src/nc_client.h +0 -0
  233. data/ext/nutcracker/src/nc_client.o +0 -0
  234. data/ext/nutcracker/src/nc_conf.c +14 -35
  235. data/ext/nutcracker/src/nc_conf.h +1 -1
  236. data/ext/nutcracker/src/nc_conf.o +0 -0
  237. data/ext/nutcracker/src/nc_connection.c +0 -0
  238. data/ext/nutcracker/src/nc_connection.h +0 -0
  239. data/ext/nutcracker/src/nc_connection.o +0 -0
  240. data/ext/nutcracker/src/nc_core.c +29 -26
  241. data/ext/nutcracker/src/nc_core.h +13 -5
  242. data/ext/nutcracker/src/nc_core.o +0 -0
  243. data/ext/nutcracker/src/{nc_event.c → nc_epoll.c} +94 -30
  244. data/ext/nutcracker/src/nc_epoll.o +0 -0
  245. data/ext/nutcracker/src/nc_event.h +33 -13
  246. data/ext/nutcracker/src/nc_kqueue.c +296 -0
  247. data/ext/nutcracker/src/nc_kqueue.o +0 -0
  248. data/ext/nutcracker/src/nc_log.c +0 -0
  249. data/ext/nutcracker/src/nc_log.h +0 -0
  250. data/ext/nutcracker/src/nc_log.o +0 -0
  251. data/ext/nutcracker/src/nc_mbuf.c +0 -0
  252. data/ext/nutcracker/src/nc_mbuf.h +0 -0
  253. data/ext/nutcracker/src/nc_mbuf.o +0 -0
  254. data/ext/nutcracker/src/nc_message.c +0 -0
  255. data/ext/nutcracker/src/nc_message.h +2 -0
  256. data/ext/nutcracker/src/nc_message.o +0 -0
  257. data/ext/nutcracker/src/nc_proxy.c +8 -8
  258. data/ext/nutcracker/src/nc_proxy.h +0 -0
  259. data/ext/nutcracker/src/nc_proxy.o +0 -0
  260. data/ext/nutcracker/src/nc_queue.h +0 -0
  261. data/ext/nutcracker/src/nc_rbtree.c +0 -0
  262. data/ext/nutcracker/src/nc_rbtree.h +0 -0
  263. data/ext/nutcracker/src/nc_rbtree.o +0 -0
  264. data/ext/nutcracker/src/nc_request.c +3 -3
  265. data/ext/nutcracker/src/nc_request.o +0 -0
  266. data/ext/nutcracker/src/nc_response.c +4 -6
  267. data/ext/nutcracker/src/nc_response.o +0 -0
  268. data/ext/nutcracker/src/nc_server.c +14 -12
  269. data/ext/nutcracker/src/nc_server.h +0 -0
  270. data/ext/nutcracker/src/nc_server.o +0 -0
  271. data/ext/nutcracker/src/nc_signal.c +0 -0
  272. data/ext/nutcracker/src/nc_signal.h +0 -0
  273. data/ext/nutcracker/src/nc_signal.o +0 -0
  274. data/ext/nutcracker/src/nc_stats.c +16 -21
  275. data/ext/nutcracker/src/nc_stats.h +3 -4
  276. data/ext/nutcracker/src/nc_stats.o +0 -0
  277. data/ext/nutcracker/src/nc_string.c +0 -0
  278. data/ext/nutcracker/src/nc_string.h +0 -0
  279. data/ext/nutcracker/src/nc_string.o +0 -0
  280. data/ext/nutcracker/src/nc_util.c +16 -0
  281. data/ext/nutcracker/src/nc_util.h +1 -0
  282. data/ext/nutcracker/src/nc_util.o +0 -0
  283. data/ext/nutcracker/src/nutcracker +0 -0
  284. data/ext/nutcracker/src/proto/Makefile +454 -0
  285. data/ext/nutcracker/src/proto/Makefile.am +0 -0
  286. data/ext/nutcracker/src/proto/Makefile.in +32 -60
  287. data/ext/nutcracker/src/proto/libproto.a +0 -0
  288. data/ext/nutcracker/src/proto/nc_memcache.c +0 -0
  289. data/ext/nutcracker/src/proto/nc_memcache.o +0 -0
  290. data/ext/nutcracker/src/proto/nc_proto.h +0 -0
  291. data/ext/nutcracker/src/proto/nc_redis.c +17 -4
  292. data/ext/nutcracker/src/proto/nc_redis.o +0 -0
  293. data/ext/nutcracker/stamp-h1 +1 -0
  294. data/lib/nutcracker.rb +64 -2
  295. data/lib/nutcracker/version.rb +1 -1
  296. metadata +237 -9
File without changes
File without changes
File without changes
File without changes
Binary file
File without changes
File without changes
Binary file
File without changes
File without changes
Binary file
@@ -1109,14 +1109,6 @@ conf_pre_validate(struct conf *cf)
1109
1109
  return NC_OK;
1110
1110
  }
1111
1111
 
1112
- static int
1113
- conf_server_pname_cmp(const void *t1, const void *t2)
1114
- {
1115
- const struct conf_server *s1 = t1, *s2 = t2;
1116
-
1117
- return string_compare(&s1->pname, &s2->pname);
1118
- }
1119
-
1120
1112
  static int
1121
1113
  conf_server_name_cmp(const void *t1, const void *t2)
1122
1114
  {
@@ -1156,27 +1148,10 @@ conf_validate_server(struct conf *cf, struct conf_pool *cp)
1156
1148
 
1157
1149
  /*
1158
1150
  * Disallow duplicate servers - servers with identical "host:port:weight"
1159
- * or "name" combination are considered as duplicates
1151
+ * or "name" combination are considered as duplicates. When server name
1152
+ * is configured, we only check for duplicate "name" and not for duplicate
1153
+ * "host:port:weight"
1160
1154
  */
1161
- array_sort(&cp->server, conf_server_pname_cmp);
1162
- for (valid = true, i = 0; i < nserver - 1; i++) {
1163
- struct conf_server *cs1, *cs2;
1164
-
1165
- cs1 = array_get(&cp->server, i);
1166
- cs2 = array_get(&cp->server, i + 1);
1167
-
1168
- if (string_compare(&cs1->pname, &cs2->pname) == 0) {
1169
- log_error("conf: pool '%.*s' has servers with same name '%.*s'",
1170
- cp->name.len, cp->name.data, cs1->pname.len,
1171
- cs1->pname.data);
1172
- valid = false;
1173
- break;
1174
- }
1175
- }
1176
- if (!valid) {
1177
- return NC_ERROR;
1178
- }
1179
-
1180
1155
  array_sort(&cp->server, conf_server_name_cmp);
1181
1156
  for (valid = true, i = 0; i < nserver - 1; i++) {
1182
1157
  struct conf_server *cs1, *cs2;
@@ -1497,7 +1472,7 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1497
1472
  struct conf_server *field;
1498
1473
  uint8_t *p, *q, *start;
1499
1474
  uint8_t *pname, *addr, *port, *weight, *name;
1500
- uint32_t k, pnamelen, addrlen, portlen, weightlen, namelen;
1475
+ uint32_t k, delimlen, pnamelen, addrlen, portlen, weightlen, namelen;
1501
1476
  struct string address;
1502
1477
  char delim[] = " ::";
1503
1478
 
@@ -1514,7 +1489,7 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1514
1489
 
1515
1490
  value = array_top(&cf->arg);
1516
1491
 
1517
- /* parse "hostname:port:weight [name]" from the end */
1492
+ /* parse "hostname:port:weight [name]" or "/path/unix_socket:weight [name]" from the end */
1518
1493
  p = value->data + value->len - 1;
1519
1494
  start = value->data;
1520
1495
  addr = NULL;
@@ -1526,6 +1501,8 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1526
1501
  name = NULL;
1527
1502
  namelen = 0;
1528
1503
 
1504
+ delimlen = value->data[0] == '/' ? 2 : 3;
1505
+
1529
1506
  for (k = 0; k < sizeof(delim); k++) {
1530
1507
  q = nc_strrchr(p, start, delim[k]);
1531
1508
  if (q == NULL) {
@@ -1562,8 +1539,8 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1562
1539
  p = q - 1;
1563
1540
  }
1564
1541
 
1565
- if (k != 3) {
1566
- return "has an invalid \"hostname:port:weight [name]\" format string";
1542
+ if (k != delimlen) {
1543
+ return "has an invalid \"hostname:port:weight [name]\"or \"/path/unix_socket:weight [name]\" format string";
1567
1544
  }
1568
1545
 
1569
1546
  pname = value->data;
@@ -1582,9 +1559,11 @@ conf_add_server(struct conf *cf, struct command *cmd, void *conf)
1582
1559
  return "has an invalid weight in \"hostname:port:weight [name]\" format string";
1583
1560
  }
1584
1561
 
1585
- field->port = nc_atoi(port, portlen);
1586
- if (field->port < 0 || !nc_valid_port(field->port)) {
1587
- return "has an invalid port in \"hostname:port:weight [name]\" format string";
1562
+ if (value->data[0] != '/') {
1563
+ field->port = nc_atoi(port, portlen);
1564
+ if (field->port < 0 || !nc_valid_port(field->port)) {
1565
+ return "has an invalid port in \"hostname:port:weight [name]\" format string";
1566
+ }
1588
1567
  }
1589
1568
 
1590
1569
  if (name == NULL) {
@@ -120,7 +120,7 @@ char *conf_set_string(struct conf *cf, struct command *cmd, void *conf);
120
120
  char *conf_set_listen(struct conf *cf, struct command *cmd, void *conf);
121
121
  char *conf_add_server(struct conf *cf, struct command *cmd, void *conf);
122
122
  char *conf_set_num(struct conf *cf, struct command *cmd, void *conf);
123
- char * conf_set_bool(struct conf *cf, struct command *cmd, void *conf);
123
+ char *conf_set_bool(struct conf *cf, struct command *cmd, void *conf);
124
124
  char *conf_set_hash(struct conf *cf, struct command *cmd, void *conf);
125
125
  char *conf_set_distribution(struct conf *cf, struct command *cmd, void *conf);
126
126
  char *conf_set_hashtag(struct conf *cf, struct command *cmd, void *conf);
Binary file
File without changes
File without changes
Binary file
@@ -17,9 +17,6 @@
17
17
 
18
18
  #include <stdlib.h>
19
19
  #include <unistd.h>
20
-
21
- #include <sys/epoll.h>
22
-
23
20
  #include <nc_core.h>
24
21
  #include <nc_event.h>
25
22
  #include <nc_conf.h>
@@ -28,6 +25,10 @@
28
25
 
29
26
  static uint32_t ctx_id; /* context generation */
30
27
 
28
+ /* function prototype for use in core_ctx_create() */
29
+ static void
30
+ core_core(void *arg, uint32_t evflags);
31
+
31
32
  static struct context *
32
33
  core_ctx_create(struct instance *nci)
33
34
  {
@@ -41,12 +42,10 @@ core_ctx_create(struct instance *nci)
41
42
  ctx->id = ++ctx_id;
42
43
  ctx->cf = NULL;
43
44
  ctx->stats = NULL;
45
+ ctx->evb = NULL;
44
46
  array_null(&ctx->pool);
45
- ctx->ep = -1;
46
- ctx->nevent = EVENT_SIZE_HINT;
47
47
  ctx->max_timeout = nci->stats_interval;
48
48
  ctx->timeout = ctx->max_timeout;
49
- ctx->event = NULL;
50
49
 
51
50
  /* parse and create configuration */
52
51
  ctx->cf = conf_create(nci->conf_filename);
@@ -74,8 +73,8 @@ core_ctx_create(struct instance *nci)
74
73
  }
75
74
 
76
75
  /* initialize event handling for client, proxy and server */
77
- status = event_init(ctx, EVENT_SIZE_HINT);
78
- if (status != NC_OK) {
76
+ ctx->evb = evbase_create(NC_EVENT_SIZE, &core_core);
77
+ if (ctx->evb == NULL) {
79
78
  stats_destroy(ctx->stats);
80
79
  server_pool_deinit(&ctx->pool);
81
80
  conf_destroy(ctx->cf);
@@ -87,7 +86,7 @@ core_ctx_create(struct instance *nci)
87
86
  status = server_pool_preconnect(ctx);
88
87
  if (status != NC_OK) {
89
88
  server_pool_disconnect(ctx);
90
- event_deinit(ctx);
89
+ evbase_destroy(ctx->evb);
91
90
  stats_destroy(ctx->stats);
92
91
  server_pool_deinit(&ctx->pool);
93
92
  conf_destroy(ctx->cf);
@@ -99,7 +98,7 @@ core_ctx_create(struct instance *nci)
99
98
  status = proxy_init(ctx);
100
99
  if (status != NC_OK) {
101
100
  server_pool_disconnect(ctx);
102
- event_deinit(ctx);
101
+ evbase_destroy(ctx->evb);
103
102
  stats_destroy(ctx->stats);
104
103
  server_pool_deinit(&ctx->pool);
105
104
  conf_destroy(ctx->cf);
@@ -118,7 +117,7 @@ core_ctx_destroy(struct context *ctx)
118
117
  log_debug(LOG_VVERB, "destroy ctx %p id %"PRIu32"", ctx, ctx->id);
119
118
  proxy_deinit(ctx);
120
119
  server_pool_disconnect(ctx);
121
- event_deinit(ctx);
120
+ evbase_destroy(ctx->evb);
122
121
  stats_destroy(ctx->stats);
123
122
  server_pool_deinit(&ctx->pool);
124
123
  conf_destroy(ctx->cf);
@@ -206,9 +205,9 @@ core_close(struct context *ctx, struct conn *conn)
206
205
  conn->eof, conn->done, conn->recv_bytes, conn->send_bytes,
207
206
  conn->err ? ':' : ' ', conn->err ? strerror(conn->err) : "");
208
207
 
209
- status = event_del_conn(ctx->ep, conn);
208
+ status = event_del_conn(ctx->evb, conn);
210
209
  if (status < 0) {
211
- log_warn("event del conn e %d %c %d failed, ignored: %s", ctx->ep,
210
+ log_warn("event del conn %c %d failed, ignored: %s",
212
211
  type, conn->sd, strerror(errno));
213
212
  }
214
213
 
@@ -277,23 +276,33 @@ core_timeout(struct context *ctx)
277
276
  }
278
277
 
279
278
  static void
280
- core_core(struct context *ctx, struct conn *conn, uint32_t events)
279
+ core_core(void *arg, uint32_t evflags)
281
280
  {
282
281
  rstatus_t status;
282
+ struct conn *conn = (struct conn *) arg;
283
+ struct context *ctx;
283
284
 
284
- log_debug(LOG_VVERB, "event %04"PRIX32" on %c %d", events,
285
+
286
+
287
+ if ((conn->proxy) || (conn->client)) {
288
+ ctx = ((struct server_pool *) (conn -> owner)) -> ctx;
289
+ } else {
290
+ ctx = ((struct server_pool *) (((struct server *) (conn -> owner)) -> owner )) -> ctx;
291
+ }
292
+
293
+ log_debug(LOG_VVERB, "event %04"PRIX32" on %c %d", evflags,
285
294
  conn->client ? 'c' : (conn->proxy ? 'p' : 's'), conn->sd);
286
295
 
287
- conn->events = events;
296
+ conn->events = evflags;
288
297
 
289
298
  /* error takes precedence over read | write */
290
- if (events & EPOLLERR) {
299
+ if (evflags & EV_ERR) {
291
300
  core_error(ctx, conn);
292
301
  return;
293
302
  }
294
303
 
295
304
  /* read takes precedence over write */
296
- if (events & (EPOLLIN | EPOLLHUP)) {
305
+ if (evflags & EV_READ) {
297
306
  status = core_recv(ctx, conn);
298
307
  if (status != NC_OK || conn->done || conn->err) {
299
308
  core_close(ctx, conn);
@@ -301,7 +310,7 @@ core_core(struct context *ctx, struct conn *conn, uint32_t events)
301
310
  }
302
311
  }
303
312
 
304
- if (events & EPOLLOUT) {
313
+ if (evflags & EV_WRITE) {
305
314
  status = core_send(ctx, conn);
306
315
  if (status != NC_OK || conn->done || conn->err) {
307
316
  core_close(ctx, conn);
@@ -315,17 +324,11 @@ core_loop(struct context *ctx)
315
324
  {
316
325
  int i, nsd;
317
326
 
318
- nsd = event_wait(ctx->ep, ctx->event, ctx->nevent, ctx->timeout);
327
+ nsd = event_wait(ctx->evb, ctx->timeout);
319
328
  if (nsd < 0) {
320
329
  return nsd;
321
330
  }
322
331
 
323
- for (i = 0; i < nsd; i++) {
324
- struct epoll_event *ev = &ctx->event[i];
325
-
326
- core_core(ctx, ev->data.ptr, ev->events);
327
- }
328
-
329
332
  core_timeout(ctx);
330
333
 
331
334
  stats_swap(ctx->stats);
@@ -40,10 +40,20 @@
40
40
  # define NC_STATS 0
41
41
  #endif
42
42
 
43
+ #ifdef HAVE_EPOLL
44
+ #define NC_HAVE_EPOLL 1
45
+ #elif HAVE_KQUEUE
46
+ #define NC_HAVE_KQUEUE 1
47
+ #endif
48
+
43
49
  #ifdef HAVE_LITTLE_ENDIAN
44
50
  # define NC_LITTLE_ENDIAN 1
45
51
  #endif
46
52
 
53
+ #ifdef HAVE_BACKTRACE
54
+ #define NC_HAVE_BACKTRACE 1
55
+ #endif
56
+
47
57
  #define NC_OK 0
48
58
  #define NC_ERROR -1
49
59
  #define NC_EAGAIN -2
@@ -101,14 +111,12 @@ struct context {
101
111
  struct stats *stats; /* stats */
102
112
 
103
113
  struct array pool; /* server_pool[] */
104
-
105
- int ep; /* epoll device */
106
- int nevent; /* # epoll event */
114
+ struct evbase *evb;
107
115
  int max_timeout; /* epoll wait max timeout in msec */
108
- int timeout; /* epoll wait timeout in msec */
109
- struct epoll_event *event; /* epoll event */
116
+ int timeout;
110
117
  };
111
118
 
119
+
112
120
  struct instance {
113
121
  struct context *ctx; /* active context */
114
122
  int log_level; /* log level */
Binary file
@@ -16,66 +16,86 @@
16
16
  */
17
17
 
18
18
  #include <unistd.h>
19
- #include <sys/epoll.h>
20
-
21
19
  #include <nc_core.h>
22
20
  #include <nc_event.h>
23
21
 
24
- int
25
- event_init(struct context *ctx, int size)
22
+ #ifdef NC_HAVE_EPOLL
23
+ #include <sys/epoll.h>
24
+
25
+ struct evbase *
26
+ evbase_create(int nevent, void (*callback_fp)(void *, uint32_t))
26
27
  {
28
+
29
+ struct evbase *evb;
27
30
  int status, ep;
28
31
  struct epoll_event *event;
29
32
 
30
- ASSERT(ctx->ep < 0);
31
- ASSERT(ctx->nevent != 0);
32
- ASSERT(ctx->event == NULL);
33
+ if (nevent <= 0) {
34
+ log_error("nevent has to be positive %d", nevent);
35
+ return NULL;
36
+ }
33
37
 
34
- ep = epoll_create(size);
38
+ ep = epoll_create(nevent);
35
39
  if (ep < 0) {
36
- log_error("epoll create of size %d failed: %s", size, strerror(errno));
37
- return -1;
40
+ log_error("epoll create of size %d failed: %s", nevent, strerror(errno));
41
+ return NULL;
38
42
  }
39
43
 
40
- event = nc_calloc(ctx->nevent, sizeof(*ctx->event));
44
+ event = nc_calloc(nevent, sizeof(*event));
41
45
  if (event == NULL) {
42
46
  status = close(ep);
43
47
  if (status < 0) {
44
48
  log_error("close e %d failed, ignored: %s", ep, strerror(errno));
45
49
  }
46
- return -1;
50
+ return NULL;
47
51
  }
48
52
 
49
- ctx->ep = ep;
50
- ctx->event = event;
53
+ evb = nc_alloc(sizeof(*evb));
54
+ if (evb == NULL) {
55
+ nc_free(event);
56
+ status = close(ep);
57
+ if (status < 0) {
58
+ log_error("close e %d failed, ignored: %s", ep, strerror(errno));
59
+ }
60
+ return NULL;
51
61
 
52
- log_debug(LOG_INFO, "e %d with nevent %d timeout %d", ctx->ep,
53
- ctx->nevent, ctx->timeout);
62
+ }
54
63
 
55
- return 0;
64
+ evb->nevent = nevent;
65
+ evb->ep = ep;
66
+ evb->event = event;
67
+ evb->callback_fp = callback_fp;
68
+
69
+ log_debug(LOG_INFO, "e %d with nevent %d", evb->ep,
70
+ evb->nevent);
71
+
72
+ return evb;
56
73
  }
57
74
 
58
75
  void
59
- event_deinit(struct context *ctx)
76
+ evbase_destroy(struct evbase *evb)
60
77
  {
61
78
  int status;
62
79
 
63
- ASSERT(ctx->ep >= 0);
80
+ if (evb == NULL) return;
64
81
 
65
- nc_free(ctx->event);
82
+ ASSERT(evb->ep >= 0);
66
83
 
67
- status = close(ctx->ep);
84
+ nc_free(evb->event);
85
+
86
+ status = close(evb->ep);
68
87
  if (status < 0) {
69
- log_error("close e %d failed, ignored: %s", ctx->ep, strerror(errno));
88
+ log_error("close e %d failed, ignored: %s", evb->ep, strerror(errno));
70
89
  }
71
- ctx->ep = -1;
90
+ nc_free(evb);
72
91
  }
73
92
 
74
93
  int
75
- event_add_out(int ep, struct conn *c)
94
+ event_add_out(struct evbase *evb, struct conn *c)
76
95
  {
77
96
  int status;
78
97
  struct epoll_event event;
98
+ int ep = evb->ep;
79
99
 
80
100
  ASSERT(ep > 0);
81
101
  ASSERT(c != NULL);
@@ -101,10 +121,11 @@ event_add_out(int ep, struct conn *c)
101
121
  }
102
122
 
103
123
  int
104
- event_del_out(int ep, struct conn *c)
124
+ event_del_out(struct evbase *evb, struct conn *c)
105
125
  {
106
126
  int status;
107
127
  struct epoll_event event;
128
+ int ep = evb->ep;
108
129
 
109
130
  ASSERT(ep > 0);
110
131
  ASSERT(c != NULL);
@@ -130,10 +151,11 @@ event_del_out(int ep, struct conn *c)
130
151
  }
131
152
 
132
153
  int
133
- event_add_conn(int ep, struct conn *c)
154
+ event_add_conn(struct evbase *evb, struct conn *c)
134
155
  {
135
156
  int status;
136
157
  struct epoll_event event;
158
+ int ep = evb->ep;
137
159
 
138
160
  ASSERT(ep > 0);
139
161
  ASSERT(c != NULL);
@@ -155,9 +177,10 @@ event_add_conn(int ep, struct conn *c)
155
177
  }
156
178
 
157
179
  int
158
- event_del_conn(int ep, struct conn *c)
180
+ event_del_conn(struct evbase *evb, struct conn *c)
159
181
  {
160
182
  int status;
183
+ int ep = evb->ep;
161
184
 
162
185
  ASSERT(ep > 0);
163
186
  ASSERT(c != NULL);
@@ -176,9 +199,14 @@ event_del_conn(int ep, struct conn *c)
176
199
  }
177
200
 
178
201
  int
179
- event_wait(int ep, struct epoll_event *event, int nevent, int timeout)
202
+ event_wait(struct evbase *evb, int timeout)
180
203
  {
181
- int nsd;
204
+ int nsd, i;
205
+ uint32_t evflags = 0;
206
+ int ep = evb->ep;
207
+ struct epoll_event *event = evb->event;
208
+ int nevent = evb->nevent;
209
+ void (*callback_fp)(void *, uint32_t) = evb->callback_fp;
182
210
 
183
211
  ASSERT(ep > 0);
184
212
  ASSERT(event != NULL);
@@ -187,6 +215,22 @@ event_wait(int ep, struct epoll_event *event, int nevent, int timeout)
187
215
  for (;;) {
188
216
  nsd = epoll_wait(ep, event, nevent, timeout);
189
217
  if (nsd > 0) {
218
+ for (i = 0; i < nsd; i++) {
219
+ struct epoll_event *ev = &evb->event[i];
220
+
221
+ evflags = 0;
222
+ if (ev->events & EPOLLERR)
223
+ evflags |= EV_ERR;
224
+
225
+ if (ev->events & EPOLLIN)
226
+ evflags |= EV_READ;
227
+
228
+ if (ev->events & EPOLLOUT)
229
+ evflags |= EV_WRITE;
230
+
231
+ if (callback_fp != NULL)
232
+ (*callback_fp)((void *) ev->data.ptr, evflags);
233
+ }
190
234
  return nsd;
191
235
  }
192
236
 
@@ -209,6 +253,26 @@ event_wait(int ep, struct epoll_event *event, int nevent, int timeout)
209
253
 
210
254
  return -1;
211
255
  }
212
-
213
256
  NOT_REACHED();
214
257
  }
258
+
259
+ int
260
+ event_add_st(struct evbase *evb, int fd)
261
+ {
262
+ int status;
263
+ struct epoll_event ev;
264
+
265
+ ev.data.fd = fd;
266
+ ev.events = EPOLLIN;
267
+
268
+ status = epoll_ctl(evb->ep, EPOLL_CTL_ADD, fd, &ev);
269
+ if (status < 0) {
270
+ log_error("epoll ctl on e %d sd %d failed: %s", evb->ep, fd,
271
+ strerror(errno));
272
+ return status;
273
+ }
274
+
275
+ return status;
276
+ }
277
+
278
+ #endif /* NC_HAVE_EPOLL */