vinted-memcached 1.8.0

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 (210) hide show
  1. checksums.yaml +7 -0
  2. data/BENCHMARKS +142 -0
  3. data/CHANGELOG +176 -0
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +45 -0
  6. data/LICENSE +184 -0
  7. data/Manifest +209 -0
  8. data/README.rdoc +124 -0
  9. data/Rakefile +134 -0
  10. data/TODO +1 -0
  11. data/ext/extconf-make.rb +25 -0
  12. data/ext/extconf.rb +78 -0
  13. data/ext/libmemcached-0.32/AUTHORS +7 -0
  14. data/ext/libmemcached-0.32/COPYING +32 -0
  15. data/ext/libmemcached-0.32/ChangeLog +303 -0
  16. data/ext/libmemcached-0.32/INSTALL +302 -0
  17. data/ext/libmemcached-0.32/Makefile.am +36 -0
  18. data/ext/libmemcached-0.32/Makefile.in +911 -0
  19. data/ext/libmemcached-0.32/NEWS +1 -0
  20. data/ext/libmemcached-0.32/README +33 -0
  21. data/ext/libmemcached-0.32/THANKS +14 -0
  22. data/ext/libmemcached-0.32/TODO +11 -0
  23. data/ext/libmemcached-0.32/aclocal.m4 +2108 -0
  24. data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
  25. data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
  26. data/ext/libmemcached-0.32/clients/client_options.h +32 -0
  27. data/ext/libmemcached-0.32/clients/execute.c +64 -0
  28. data/ext/libmemcached-0.32/clients/execute.h +5 -0
  29. data/ext/libmemcached-0.32/clients/generator.c +74 -0
  30. data/ext/libmemcached-0.32/clients/generator.h +20 -0
  31. data/ext/libmemcached-0.32/clients/memcat.c +178 -0
  32. data/ext/libmemcached-0.32/clients/memcp.c +251 -0
  33. data/ext/libmemcached-0.32/clients/memdump.c +170 -0
  34. data/ext/libmemcached-0.32/clients/memerror.c +80 -0
  35. data/ext/libmemcached-0.32/clients/memflush.c +143 -0
  36. data/ext/libmemcached-0.32/clients/memrm.c +160 -0
  37. data/ext/libmemcached-0.32/clients/memslap.c +441 -0
  38. data/ext/libmemcached-0.32/clients/memstat.c +326 -0
  39. data/ext/libmemcached-0.32/clients/utilities.c +207 -0
  40. data/ext/libmemcached-0.32/clients/utilities.h +41 -0
  41. data/ext/libmemcached-0.32/config/compile +143 -0
  42. data/ext/libmemcached-0.32/config/config.guess +1561 -0
  43. data/ext/libmemcached-0.32/config/config.rpath +666 -0
  44. data/ext/libmemcached-0.32/config/config.sub +1686 -0
  45. data/ext/libmemcached-0.32/config/depcomp +630 -0
  46. data/ext/libmemcached-0.32/config/install-sh +520 -0
  47. data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
  48. data/ext/libmemcached-0.32/config/missing +376 -0
  49. data/ext/libmemcached-0.32/config.h.in +254 -0
  50. data/ext/libmemcached-0.32/configure +23843 -0
  51. data/ext/libmemcached-0.32/configure.ac +120 -0
  52. data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
  53. data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
  54. data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
  55. data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
  56. data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
  57. data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
  58. data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
  59. data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
  60. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
  61. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
  62. data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
  63. data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
  64. data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
  65. data/ext/libmemcached-0.32/libmemcached/memcached.c +153 -0
  66. data/ext/libmemcached-0.32/libmemcached/memcached.h +305 -0
  67. data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
  68. data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
  69. data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
  70. data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
  71. data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +290 -0
  72. data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
  73. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
  74. data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
  75. data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +146 -0
  76. data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  77. data/ext/libmemcached-0.32/libmemcached/memcached_do.c +72 -0
  78. data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
  79. data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
  80. data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
  81. data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
  82. data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
  83. data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +23 -0
  84. data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
  85. data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
  86. data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
  87. data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
  88. data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
  89. data/ext/libmemcached-0.32/libmemcached/memcached_io.c +594 -0
  90. data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
  91. data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
  92. data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
  93. data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
  94. data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
  95. data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
  96. data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
  97. data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
  98. data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
  99. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
  100. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
  101. data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
  102. data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
  103. data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
  104. data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +514 -0
  105. data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
  106. data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
  107. data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
  108. data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
  109. data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
  110. data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
  111. data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
  112. data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
  113. data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
  114. data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
  115. data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
  116. data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
  117. data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
  118. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
  119. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
  120. data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
  121. data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
  122. data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
  123. data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
  124. data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
  125. data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
  126. data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
  127. data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
  128. data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
  129. data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
  130. data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
  131. data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
  132. data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
  133. data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
  134. data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
  135. data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
  136. data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
  137. data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
  138. data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
  139. data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
  140. data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
  141. data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
  142. data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
  143. data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
  144. data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
  145. data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
  146. data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
  147. data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
  148. data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
  149. data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
  150. data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
  151. data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
  152. data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
  153. data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
  154. data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
  155. data/ext/libmemcached-0.32/support/Makefile.am +4 -0
  156. data/ext/libmemcached-0.32/support/Makefile.in +487 -0
  157. data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
  158. data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
  159. data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
  160. data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
  161. data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
  162. data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
  163. data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
  164. data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
  165. data/ext/libmemcached-0.32/tests/function.c +4904 -0
  166. data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
  167. data/ext/libmemcached-0.32/tests/output.cmp +7 -0
  168. data/ext/libmemcached-0.32/tests/output.res +7 -0
  169. data/ext/libmemcached-0.32/tests/output2.res +46 -0
  170. data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
  171. data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
  172. data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
  173. data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
  174. data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
  175. data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
  176. data/ext/libmemcached-0.32/tests/server.c +118 -0
  177. data/ext/libmemcached-0.32/tests/server.h +25 -0
  178. data/ext/libmemcached-0.32/tests/start.c +16 -0
  179. data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
  180. data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
  181. data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
  182. data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
  183. data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
  184. data/ext/libmemcached-0.32/tests/test.c +137 -0
  185. data/ext/libmemcached-0.32/tests/test.h +46 -0
  186. data/ext/libmemcached-0.32/tests/udp.c +76 -0
  187. data/ext/rlibmemcached.i +258 -0
  188. data/ext/rlibmemcached_wrap.c +13917 -0
  189. data/lib/memcached/auth.rb +16 -0
  190. data/lib/memcached/behaviors.rb +78 -0
  191. data/lib/memcached/exceptions.rb +84 -0
  192. data/lib/memcached/experimental.rb +48 -0
  193. data/lib/memcached/marshal_codec.rb +10 -0
  194. data/lib/memcached/memcached.rb +732 -0
  195. data/lib/memcached/rails.rb +250 -0
  196. data/lib/memcached.rb +33 -0
  197. data/memcached.gemspec +0 -0
  198. data/test/profile/benchmark.rb +280 -0
  199. data/test/profile/c_profiler.rb +14 -0
  200. data/test/profile/exercise.rb +185 -0
  201. data/test/profile/rb_profiler.rb +21 -0
  202. data/test/profile/valgrind.rb +10 -0
  203. data/test/setup.rb +30 -0
  204. data/test/teardown.rb +0 -0
  205. data/test/test_helper.rb +18 -0
  206. data/test/unit/binding_test.rb +8 -0
  207. data/test/unit/memcached_experimental_test.rb +272 -0
  208. data/test/unit/memcached_test.rb +1487 -0
  209. data/test/unit/rails_test.rb +330 -0
  210. metadata +336 -0
@@ -0,0 +1,74 @@
1
+ /*
2
+ I debated about putting this in the client library since it does an
3
+ action I don't really believe belongs in the library.
4
+
5
+ Frankly its too damn useful not to be here though.
6
+ */
7
+
8
+ #include "common.h"
9
+
10
+ memcached_server_st *memcached_servers_parse(const char *server_strings)
11
+ {
12
+ char *string;
13
+ uint32_t port;
14
+ uint32_t weight;
15
+ const char *begin_ptr;
16
+ const char *end_ptr;
17
+ memcached_server_st *servers= NULL;
18
+ memcached_return rc;
19
+
20
+ WATCHPOINT_ASSERT(server_strings);
21
+
22
+ end_ptr= server_strings + strlen(server_strings);
23
+
24
+ for (begin_ptr= server_strings, string= index(server_strings, ',');
25
+ begin_ptr != end_ptr;
26
+ string= index(begin_ptr, ','))
27
+ {
28
+ char buffer[HUGE_STRING_LEN];
29
+ char *ptr, *ptr2;
30
+ port= 0;
31
+ weight= 0;
32
+
33
+ if (string)
34
+ {
35
+ memcpy(buffer, begin_ptr, (size_t) (string - begin_ptr));
36
+ buffer[(unsigned int)(string - begin_ptr)]= 0;
37
+ begin_ptr= string+1;
38
+ }
39
+ else
40
+ {
41
+ size_t length= strlen(begin_ptr);
42
+ memcpy(buffer, begin_ptr, length);
43
+ buffer[length]= 0;
44
+ begin_ptr= end_ptr;
45
+ }
46
+
47
+ ptr= index(buffer, ':');
48
+
49
+ if (ptr)
50
+ {
51
+ ptr[0]= 0;
52
+
53
+ ptr++;
54
+
55
+ port= (uint32_t) strtoul(ptr, (char **)NULL, 10);
56
+
57
+ ptr2= index(ptr, ' ');
58
+ if (! ptr2)
59
+ ptr2= index(ptr, ':');
60
+ if (ptr2)
61
+ {
62
+ ptr2++;
63
+ weight = (uint32_t) strtoul(ptr2, (char **)NULL, 10);
64
+ }
65
+ }
66
+
67
+ servers= memcached_server_list_append_with_weight(servers, buffer, port, weight, &rc);
68
+
69
+ if (isspace(*begin_ptr))
70
+ begin_ptr++;
71
+ }
72
+
73
+ return servers;
74
+ }
@@ -0,0 +1,38 @@
1
+ /*
2
+ * Summary: Connection pool implementation for libmemcached.
3
+ *
4
+ * Copy: See Copyright for the status of this software.
5
+ *
6
+ * Author: Trond Norbye
7
+ */
8
+
9
+ #ifndef MEMCACHED_POOL_H
10
+ #define MEMCACHED_POOL_H
11
+
12
+ #include <libmemcached/memcached.h>
13
+
14
+ #ifdef __cplusplus
15
+ extern "C" {
16
+ #endif
17
+
18
+ struct memcached_pool_st;
19
+ typedef struct memcached_pool_st memcached_pool_st;
20
+
21
+ LIBMEMCACHED_API
22
+ memcached_pool_st *memcached_pool_create(memcached_st* mmc, uint32_t initial,
23
+ uint32_t max);
24
+ LIBMEMCACHED_API
25
+ memcached_st* memcached_pool_destroy(memcached_pool_st* pool);
26
+ LIBMEMCACHED_API
27
+ memcached_st* memcached_pool_pop(memcached_pool_st* pool,
28
+ bool block,
29
+ memcached_return* rc);
30
+ LIBMEMCACHED_API
31
+ memcached_return memcached_pool_push(memcached_pool_st* pool,
32
+ memcached_st* mmc);
33
+
34
+ #ifdef __cplusplus
35
+ }
36
+ #endif
37
+
38
+ #endif /* MEMCACHED_POOL_H */
@@ -0,0 +1,76 @@
1
+ #include "common.h"
2
+ #include "memcached_io.h"
3
+ #include "memcached_constants.h"
4
+
5
+ memcached_return memcached_purge(memcached_server_st *ptr)
6
+ {
7
+ uint32_t x;
8
+ memcached_return ret= MEMCACHED_SUCCESS;
9
+
10
+ if (ptr->root->purging || /* already purging */
11
+ (memcached_server_response_count(ptr) < ptr->root->io_msg_watermark &&
12
+ ptr->io_bytes_sent < ptr->root->io_bytes_watermark) ||
13
+ (ptr->io_bytes_sent > ptr->root->io_bytes_watermark &&
14
+ memcached_server_response_count(ptr) < 2))
15
+ {
16
+ return MEMCACHED_SUCCESS;
17
+ }
18
+
19
+ /* memcached_io_write and memcached_response may call memcached_purge
20
+ so we need to be able stop any recursion.. */
21
+ ptr->root->purging= 1;
22
+
23
+ WATCHPOINT_ASSERT(ptr->fd != -1);
24
+ /* Force a flush of the buffer to ensure that we don't have the n-1 pending
25
+ requests buffered up.. */
26
+ if (memcached_io_write(ptr, NULL, 0, 1) == -1)
27
+ {
28
+ ptr->root->purging= 0;
29
+ return MEMCACHED_WRITE_FAILURE;
30
+ }
31
+ WATCHPOINT_ASSERT(ptr->fd != -1);
32
+
33
+ uint32_t no_msg= memcached_server_response_count(ptr) - 1;
34
+ if (no_msg > 0)
35
+ {
36
+ memcached_result_st result;
37
+ memcached_result_st *result_ptr;
38
+ char buffer[SMALL_STRING_LEN];
39
+
40
+ /*
41
+ * We need to increase the timeout, because we might be waiting for
42
+ * data to be sent from the server (the commands was in the output buffer
43
+ * and just flushed
44
+ */
45
+ int32_t timeo= ptr->root->poll_timeout;
46
+ ptr->root->poll_timeout= 2000;
47
+
48
+ result_ptr= memcached_result_create(ptr->root, &result);
49
+ WATCHPOINT_ASSERT(result_ptr);
50
+
51
+ for (x= 0; x < no_msg; x++)
52
+ {
53
+ memcached_result_reset(result_ptr);
54
+ memcached_return rc= memcached_read_one_response(ptr, buffer,
55
+ sizeof (buffer),
56
+ result_ptr);
57
+ /*
58
+ * Purge doesn't care for what kind of command results that is received.
59
+ * The only kind of errors I care about if is I'm out of sync with the
60
+ * protocol or have problems reading data from the network..
61
+ */
62
+ if (rc== MEMCACHED_PROTOCOL_ERROR || rc == MEMCACHED_UNKNOWN_READ_FAILURE)
63
+ {
64
+ WATCHPOINT_ERROR(rc);
65
+ ret = rc;
66
+ memcached_io_reset(ptr);
67
+ }
68
+ }
69
+
70
+ memcached_result_free(result_ptr);
71
+ ptr->root->poll_timeout= timeo;
72
+ }
73
+ ptr->root->purging= 0;
74
+
75
+ return ret;
76
+ }
@@ -0,0 +1,75 @@
1
+ #include "common.h"
2
+
3
+ /*
4
+ This closes all connections (forces flush of input as well).
5
+
6
+ Maybe add a host specific, or key specific version?
7
+
8
+ The reason we send "quit" is that in case we have buffered IO, this
9
+ will force data to be completed.
10
+ */
11
+
12
+ void memcached_quit_server(memcached_server_st *ptr, uint8_t io_death)
13
+ {
14
+ if (ptr->fd != -1)
15
+ {
16
+ if (io_death == 0 && ptr->type != MEMCACHED_CONNECTION_UDP)
17
+ {
18
+ memcached_return rc;
19
+ char buffer[MEMCACHED_MAX_BUFFER];
20
+
21
+ if (ptr->root->flags & MEM_BINARY_PROTOCOL)
22
+ {
23
+ protocol_binary_request_quit request = {.bytes= {0}};
24
+ request.message.header.request.magic = PROTOCOL_BINARY_REQ;
25
+ request.message.header.request.opcode = PROTOCOL_BINARY_CMD_QUIT;
26
+ request.message.header.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
27
+ rc= memcached_do(ptr, request.bytes, sizeof(request.bytes), 1);
28
+ }
29
+ else
30
+ rc= memcached_do(ptr, "quit\r\n", 6, 1);
31
+
32
+ WATCHPOINT_ASSERT(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_FETCH_NOTFINISHED);
33
+
34
+ /* read until socket is closed, or there is an error
35
+ * closing the socket before all data is read
36
+ * results in server throwing away all data which is
37
+ * not read
38
+ */
39
+ ssize_t nread;
40
+ while (memcached_io_read(ptr, buffer, sizeof(buffer)/sizeof(*buffer),
41
+ &nread) == MEMCACHED_SUCCESS);
42
+ }
43
+ memcached_io_close(ptr);
44
+
45
+ ptr->fd= -1;
46
+ ptr->write_buffer_offset= (size_t) ((ptr->type == MEMCACHED_CONNECTION_UDP) ? UDP_DATAGRAM_HEADER_LENGTH : 0);
47
+ ptr->read_buffer_length= 0;
48
+ ptr->read_ptr= ptr->read_buffer;
49
+ memcached_server_response_reset(ptr);
50
+ }
51
+
52
+ if (io_death)
53
+ {
54
+ ptr->server_failure_counter++;
55
+ }
56
+ else
57
+ {
58
+ ptr->server_failure_counter = 0;
59
+ }
60
+ }
61
+
62
+ void memcached_quit(memcached_st *ptr)
63
+ {
64
+ unsigned int x;
65
+
66
+ if (ptr->hosts == NULL ||
67
+ ptr->number_of_hosts == 0)
68
+ return;
69
+
70
+ if (ptr->hosts && ptr->number_of_hosts)
71
+ {
72
+ for (x= 0; x < ptr->number_of_hosts; x++)
73
+ memcached_quit_server(&ptr->hosts[x], 0);
74
+ }
75
+ }