@platformatic/rdkafka 4.0.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 (767) hide show
  1. package/.editorconfig +5 -0
  2. package/.jshintignore +1 -0
  3. package/.jshintrc +23 -0
  4. package/CONTRIBUTING.md +237 -0
  5. package/LICENSE.txt +21 -0
  6. package/Makefile +94 -0
  7. package/README.md +630 -0
  8. package/bench/consumer-raw-rdkafka.js +76 -0
  9. package/bench/consumer-subscribe.js +77 -0
  10. package/bench/kafka-consumer-stream.js +100 -0
  11. package/bench/producer-raw-rdkafka.js +125 -0
  12. package/bench/producer-rdkafka.js +117 -0
  13. package/bench/seed.sh +38 -0
  14. package/binding.gyp +155 -0
  15. package/ci/checks/librdkafka-correct-version.js +67 -0
  16. package/ci/checks/librdkafka-exists.js +13 -0
  17. package/ci/librdkafka-defs-generator.js +193 -0
  18. package/ci/prepublish.js +3 -0
  19. package/config.d.ts +1132 -0
  20. package/configure +15 -0
  21. package/cpplint.py +6325 -0
  22. package/deploy.enc +0 -0
  23. package/deps/librdkafka/.clang-format +136 -0
  24. package/deps/librdkafka/.clang-format-cpp +103 -0
  25. package/deps/librdkafka/.dir-locals.el +10 -0
  26. package/deps/librdkafka/.formatignore +33 -0
  27. package/deps/librdkafka/.gdbmacros +19 -0
  28. package/deps/librdkafka/.semaphore/project.yml +43 -0
  29. package/deps/librdkafka/.semaphore/project_public.yml +20 -0
  30. package/deps/librdkafka/.semaphore/semaphore.yml +355 -0
  31. package/deps/librdkafka/CHANGELOG.md +1738 -0
  32. package/deps/librdkafka/CMakeLists.txt +291 -0
  33. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  34. package/deps/librdkafka/CONFIGURATION.md +189 -0
  35. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  36. package/deps/librdkafka/Doxyfile +2375 -0
  37. package/deps/librdkafka/INTRODUCTION.md +2173 -0
  38. package/deps/librdkafka/LICENSE +26 -0
  39. package/deps/librdkafka/LICENSE.cjson +22 -0
  40. package/deps/librdkafka/LICENSE.crc32c +28 -0
  41. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  42. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  43. package/deps/librdkafka/LICENSE.lz4 +26 -0
  44. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  45. package/deps/librdkafka/LICENSE.nanopb +22 -0
  46. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  47. package/deps/librdkafka/LICENSE.pycrc +23 -0
  48. package/deps/librdkafka/LICENSE.queue +31 -0
  49. package/deps/librdkafka/LICENSE.regexp +5 -0
  50. package/deps/librdkafka/LICENSE.snappy +36 -0
  51. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  52. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  53. package/deps/librdkafka/LICENSES.txt +625 -0
  54. package/deps/librdkafka/Makefile +124 -0
  55. package/deps/librdkafka/README.md +199 -0
  56. package/deps/librdkafka/README.win32 +26 -0
  57. package/deps/librdkafka/STATISTICS.md +624 -0
  58. package/deps/librdkafka/configure +214 -0
  59. package/deps/librdkafka/configure.self +331 -0
  60. package/deps/librdkafka/debian/changelog +111 -0
  61. package/deps/librdkafka/debian/compat +1 -0
  62. package/deps/librdkafka/debian/control +71 -0
  63. package/deps/librdkafka/debian/copyright +99 -0
  64. package/deps/librdkafka/debian/gbp.conf +9 -0
  65. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  66. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  67. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  68. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  69. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  70. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  71. package/deps/librdkafka/debian/rules +19 -0
  72. package/deps/librdkafka/debian/source/format +1 -0
  73. package/deps/librdkafka/debian/watch +2 -0
  74. package/deps/librdkafka/dev-conf.sh +123 -0
  75. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  76. package/deps/librdkafka/examples/Makefile +167 -0
  77. package/deps/librdkafka/examples/README.md +42 -0
  78. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  79. package/deps/librdkafka/examples/consumer.c +261 -0
  80. package/deps/librdkafka/examples/delete_records.c +233 -0
  81. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  82. package/deps/librdkafka/examples/describe_consumer_groups.c +436 -0
  83. package/deps/librdkafka/examples/describe_topics.c +427 -0
  84. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  85. package/deps/librdkafka/examples/globals.json +11 -0
  86. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  87. package/deps/librdkafka/examples/incremental_alter_configs.c +348 -0
  88. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +961 -0
  89. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  90. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  91. package/deps/librdkafka/examples/list_offsets.c +327 -0
  92. package/deps/librdkafka/examples/misc.c +287 -0
  93. package/deps/librdkafka/examples/openssl_engine_example.cpp +249 -0
  94. package/deps/librdkafka/examples/producer.c +251 -0
  95. package/deps/librdkafka/examples/producer.cpp +228 -0
  96. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  97. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  98. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  99. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  100. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  101. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  102. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  103. package/deps/librdkafka/examples/transactions.c +665 -0
  104. package/deps/librdkafka/examples/user_scram.c +492 -0
  105. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +395 -0
  106. package/deps/librdkafka/lds-gen.py +73 -0
  107. package/deps/librdkafka/mainpage.doxy +40 -0
  108. package/deps/librdkafka/mklove/Makefile.base +329 -0
  109. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  110. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  111. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  112. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  113. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  114. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  115. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  116. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  117. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  118. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  119. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  120. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  121. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  122. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  123. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  124. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  125. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  126. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  127. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  128. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  129. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  130. package/deps/librdkafka/packaging/RELEASE.md +311 -0
  131. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  132. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  133. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  134. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  135. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  136. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  137. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  138. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  139. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  140. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  141. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  142. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  143. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  144. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  145. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  146. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  147. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  148. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  149. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  150. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  151. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  152. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  153. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  154. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  155. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  156. package/deps/librdkafka/packaging/cp/README.md +13 -0
  157. package/deps/librdkafka/packaging/cp/check_features.c +64 -0
  158. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  159. package/deps/librdkafka/packaging/cp/verify-packages.sh +48 -0
  160. package/deps/librdkafka/packaging/cp/verify-rpm.sh +39 -0
  161. package/deps/librdkafka/packaging/debian/changelog +66 -0
  162. package/deps/librdkafka/packaging/debian/compat +1 -0
  163. package/deps/librdkafka/packaging/debian/control +49 -0
  164. package/deps/librdkafka/packaging/debian/copyright +84 -0
  165. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  166. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  167. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  168. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  169. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  170. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  171. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  172. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  173. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  174. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  175. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  176. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  177. package/deps/librdkafka/packaging/debian/rules +19 -0
  178. package/deps/librdkafka/packaging/debian/source/format +1 -0
  179. package/deps/librdkafka/packaging/debian/watch +2 -0
  180. package/deps/librdkafka/packaging/get_version.py +21 -0
  181. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  182. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  183. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  184. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  185. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  186. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  187. package/deps/librdkafka/packaging/mingw-w64/travis-before-install.sh +20 -0
  188. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  189. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  190. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  191. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  192. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  193. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  194. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  195. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  196. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  197. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  198. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  199. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  200. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  201. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  202. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  203. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  204. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  205. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  206. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  207. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  208. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  209. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  210. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  211. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  212. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  213. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  214. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  215. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  216. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  217. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  218. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +10 -0
  219. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  220. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  221. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  222. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  223. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  224. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  225. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  226. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  227. package/deps/librdkafka/packaging/tools/style-format.sh +148 -0
  228. package/deps/librdkafka/service.yml +18 -0
  229. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  230. package/deps/librdkafka/src/Makefile +103 -0
  231. package/deps/librdkafka/src/README.lz4.md +30 -0
  232. package/deps/librdkafka/src/cJSON.c +2834 -0
  233. package/deps/librdkafka/src/cJSON.h +398 -0
  234. package/deps/librdkafka/src/crc32c.c +430 -0
  235. package/deps/librdkafka/src/crc32c.h +38 -0
  236. package/deps/librdkafka/src/generate_proto.sh +66 -0
  237. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  238. package/deps/librdkafka/src/lz4.c +2727 -0
  239. package/deps/librdkafka/src/lz4.h +842 -0
  240. package/deps/librdkafka/src/lz4frame.c +2078 -0
  241. package/deps/librdkafka/src/lz4frame.h +692 -0
  242. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  243. package/deps/librdkafka/src/lz4hc.c +1631 -0
  244. package/deps/librdkafka/src/lz4hc.h +413 -0
  245. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  246. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  247. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  248. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  249. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  250. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  251. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  252. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  253. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  254. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  255. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  256. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  257. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  258. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  259. package/deps/librdkafka/src/queue.h +850 -0
  260. package/deps/librdkafka/src/rd.h +441 -0
  261. package/deps/librdkafka/src/rdaddr.c +255 -0
  262. package/deps/librdkafka/src/rdaddr.h +203 -0
  263. package/deps/librdkafka/src/rdatomic.h +226 -0
  264. package/deps/librdkafka/src/rdavg.h +259 -0
  265. package/deps/librdkafka/src/rdavl.c +210 -0
  266. package/deps/librdkafka/src/rdavl.h +250 -0
  267. package/deps/librdkafka/src/rdbase64.c +169 -0
  268. package/deps/librdkafka/src/rdbase64.h +41 -0
  269. package/deps/librdkafka/src/rdbuf.c +1884 -0
  270. package/deps/librdkafka/src/rdbuf.h +375 -0
  271. package/deps/librdkafka/src/rdcrc32.c +114 -0
  272. package/deps/librdkafka/src/rdcrc32.h +170 -0
  273. package/deps/librdkafka/src/rddl.c +179 -0
  274. package/deps/librdkafka/src/rddl.h +43 -0
  275. package/deps/librdkafka/src/rdendian.h +174 -0
  276. package/deps/librdkafka/src/rdfloat.h +67 -0
  277. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  278. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  279. package/deps/librdkafka/src/rdgz.c +120 -0
  280. package/deps/librdkafka/src/rdgz.h +46 -0
  281. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  282. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  283. package/deps/librdkafka/src/rdhttp.c +512 -0
  284. package/deps/librdkafka/src/rdhttp.h +83 -0
  285. package/deps/librdkafka/src/rdinterval.h +177 -0
  286. package/deps/librdkafka/src/rdkafka.c +5351 -0
  287. package/deps/librdkafka/src/rdkafka.h +10603 -0
  288. package/deps/librdkafka/src/rdkafka_admin.c +9417 -0
  289. package/deps/librdkafka/src/rdkafka_admin.h +619 -0
  290. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  291. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  292. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  293. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  294. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  295. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  296. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  297. package/deps/librdkafka/src/rdkafka_broker.c +6186 -0
  298. package/deps/librdkafka/src/rdkafka_broker.h +686 -0
  299. package/deps/librdkafka/src/rdkafka_buf.c +540 -0
  300. package/deps/librdkafka/src/rdkafka_buf.h +1524 -0
  301. package/deps/librdkafka/src/rdkafka_cert.c +552 -0
  302. package/deps/librdkafka/src/rdkafka_cert.h +61 -0
  303. package/deps/librdkafka/src/rdkafka_cgrp.c +7262 -0
  304. package/deps/librdkafka/src/rdkafka_cgrp.h +443 -0
  305. package/deps/librdkafka/src/rdkafka_conf.c +4456 -0
  306. package/deps/librdkafka/src/rdkafka_conf.h +668 -0
  307. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  308. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  309. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  310. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  311. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  312. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  313. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  314. package/deps/librdkafka/src/rdkafka_feature.c +461 -0
  315. package/deps/librdkafka/src/rdkafka_feature.h +102 -0
  316. package/deps/librdkafka/src/rdkafka_fetcher.c +1402 -0
  317. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  318. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  319. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  320. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  321. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  322. package/deps/librdkafka/src/rdkafka_int.h +1222 -0
  323. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  324. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  325. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  326. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  327. package/deps/librdkafka/src/rdkafka_metadata.c +2124 -0
  328. package/deps/librdkafka/src/rdkafka_metadata.h +341 -0
  329. package/deps/librdkafka/src/rdkafka_metadata_cache.c +977 -0
  330. package/deps/librdkafka/src/rdkafka_mock.c +2885 -0
  331. package/deps/librdkafka/src/rdkafka_mock.h +491 -0
  332. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +710 -0
  333. package/deps/librdkafka/src/rdkafka_mock_handlers.c +2817 -0
  334. package/deps/librdkafka/src/rdkafka_mock_int.h +591 -0
  335. package/deps/librdkafka/src/rdkafka_msg.c +2573 -0
  336. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  337. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  338. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  339. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  340. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1470 -0
  341. package/deps/librdkafka/src/rdkafka_offset.c +1537 -0
  342. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  343. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  344. package/deps/librdkafka/src/rdkafka_op.h +834 -0
  345. package/deps/librdkafka/src/rdkafka_partition.c +4801 -0
  346. package/deps/librdkafka/src/rdkafka_partition.h +1173 -0
  347. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  348. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  349. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  350. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  351. package/deps/librdkafka/src/rdkafka_proto.h +733 -0
  352. package/deps/librdkafka/src/rdkafka_protocol.h +127 -0
  353. package/deps/librdkafka/src/rdkafka_queue.c +1153 -0
  354. package/deps/librdkafka/src/rdkafka_queue.h +1201 -0
  355. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  356. package/deps/librdkafka/src/rdkafka_request.c +6817 -0
  357. package/deps/librdkafka/src/rdkafka_request.h +709 -0
  358. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  359. package/deps/librdkafka/src/rdkafka_sasl.c +528 -0
  360. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  361. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  362. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  363. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1829 -0
  364. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  365. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +589 -0
  366. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +37 -0
  367. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  368. package/deps/librdkafka/src/rdkafka_sasl_scram.c +857 -0
  369. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  370. package/deps/librdkafka/src/rdkafka_ssl.c +1904 -0
  371. package/deps/librdkafka/src/rdkafka_ssl.h +64 -0
  372. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4781 -0
  373. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  374. package/deps/librdkafka/src/rdkafka_telemetry.c +703 -0
  375. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  376. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  377. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  378. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +993 -0
  379. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  380. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  381. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  382. package/deps/librdkafka/src/rdkafka_topic.c +2078 -0
  383. package/deps/librdkafka/src/rdkafka_topic.h +328 -0
  384. package/deps/librdkafka/src/rdkafka_transport.c +1297 -0
  385. package/deps/librdkafka/src/rdkafka_transport.h +94 -0
  386. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  387. package/deps/librdkafka/src/rdkafka_txnmgr.c +3251 -0
  388. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  389. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  390. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  391. package/deps/librdkafka/src/rdlist.c +576 -0
  392. package/deps/librdkafka/src/rdlist.h +434 -0
  393. package/deps/librdkafka/src/rdlog.c +89 -0
  394. package/deps/librdkafka/src/rdlog.h +41 -0
  395. package/deps/librdkafka/src/rdmap.c +503 -0
  396. package/deps/librdkafka/src/rdmap.h +492 -0
  397. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  398. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  399. package/deps/librdkafka/src/rdports.c +61 -0
  400. package/deps/librdkafka/src/rdports.h +38 -0
  401. package/deps/librdkafka/src/rdposix.h +250 -0
  402. package/deps/librdkafka/src/rdrand.c +70 -0
  403. package/deps/librdkafka/src/rdrand.h +43 -0
  404. package/deps/librdkafka/src/rdregex.c +156 -0
  405. package/deps/librdkafka/src/rdregex.h +43 -0
  406. package/deps/librdkafka/src/rdsignal.h +57 -0
  407. package/deps/librdkafka/src/rdstring.c +645 -0
  408. package/deps/librdkafka/src/rdstring.h +98 -0
  409. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  410. package/deps/librdkafka/src/rdtime.h +325 -0
  411. package/deps/librdkafka/src/rdtypes.h +86 -0
  412. package/deps/librdkafka/src/rdunittest.c +532 -0
  413. package/deps/librdkafka/src/rdunittest.h +230 -0
  414. package/deps/librdkafka/src/rdvarint.c +134 -0
  415. package/deps/librdkafka/src/rdvarint.h +165 -0
  416. package/deps/librdkafka/src/rdwin32.h +382 -0
  417. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  418. package/deps/librdkafka/src/rdxxhash.h +328 -0
  419. package/deps/librdkafka/src/regexp.c +1347 -0
  420. package/deps/librdkafka/src/regexp.h +41 -0
  421. package/deps/librdkafka/src/snappy.c +1866 -0
  422. package/deps/librdkafka/src/snappy.h +62 -0
  423. package/deps/librdkafka/src/snappy_compat.h +138 -0
  424. package/deps/librdkafka/src/statistics_schema.json +444 -0
  425. package/deps/librdkafka/src/tinycthread.c +932 -0
  426. package/deps/librdkafka/src/tinycthread.h +503 -0
  427. package/deps/librdkafka/src/tinycthread_extra.c +175 -0
  428. package/deps/librdkafka/src/tinycthread_extra.h +208 -0
  429. package/deps/librdkafka/src/win32_config.h +58 -0
  430. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  431. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  432. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  433. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  434. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  435. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  436. package/deps/librdkafka/src-cpp/Makefile +55 -0
  437. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  438. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  439. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  440. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  441. package/deps/librdkafka/src-cpp/README.md +16 -0
  442. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  443. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  444. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  445. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3771 -0
  446. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  447. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  448. package/deps/librdkafka/tests/0001-multiobj.c +98 -0
  449. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  450. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  451. package/deps/librdkafka/tests/0004-conf.c +867 -0
  452. package/deps/librdkafka/tests/0005-order.c +133 -0
  453. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  454. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  455. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  456. package/deps/librdkafka/tests/0009-mock_cluster.c +96 -0
  457. package/deps/librdkafka/tests/0011-produce_batch.c +752 -0
  458. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  459. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  460. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  461. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  462. package/deps/librdkafka/tests/0016-client_swname.c +166 -0
  463. package/deps/librdkafka/tests/0017-compression.c +142 -0
  464. package/deps/librdkafka/tests/0018-cgrp_term.c +333 -0
  465. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  466. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  467. package/deps/librdkafka/tests/0021-rkt_destroy.c +71 -0
  468. package/deps/librdkafka/tests/0022-consume_batch.c +276 -0
  469. package/deps/librdkafka/tests/0025-timers.c +147 -0
  470. package/deps/librdkafka/tests/0026-consume_pause.c +549 -0
  471. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  472. package/deps/librdkafka/tests/0029-assign_offset.c +204 -0
  473. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  474. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  475. package/deps/librdkafka/tests/0033-regex_subscribe.c +520 -0
  476. package/deps/librdkafka/tests/0034-offset_reset.c +377 -0
  477. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  478. package/deps/librdkafka/tests/0036-partial_fetch.c +86 -0
  479. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  480. package/deps/librdkafka/tests/0038-performance.c +120 -0
  481. package/deps/librdkafka/tests/0039-event.c +284 -0
  482. package/deps/librdkafka/tests/0040-io_event.c +251 -0
  483. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +96 -0
  484. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  485. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  486. package/deps/librdkafka/tests/0044-partition_cnt.c +93 -0
  487. package/deps/librdkafka/tests/0045-subscribe_update.c +746 -0
  488. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  489. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +97 -0
  490. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  491. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  492. package/deps/librdkafka/tests/0050-subscribe_adds.c +144 -0
  493. package/deps/librdkafka/tests/0051-assign_adds.c +125 -0
  494. package/deps/librdkafka/tests/0052-msg_timestamps.c +220 -0
  495. package/deps/librdkafka/tests/0053-stats_cb.cpp +535 -0
  496. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  497. package/deps/librdkafka/tests/0055-producer_latency.c +366 -0
  498. package/deps/librdkafka/tests/0056-balanced_group_mt.c +311 -0
  499. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  500. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  501. package/deps/librdkafka/tests/0059-bsearch.cpp +237 -0
  502. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  503. package/deps/librdkafka/tests/0061-consumer_lag.cpp +275 -0
  504. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  505. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  506. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  507. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  508. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  509. package/deps/librdkafka/tests/0067-empty_topic.cpp +148 -0
  510. package/deps/librdkafka/tests/0068-produce_timeout.c +138 -0
  511. package/deps/librdkafka/tests/0069-consumer_add_parts.c +123 -0
  512. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  513. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  514. package/deps/librdkafka/tests/0073-headers.c +381 -0
  515. package/deps/librdkafka/tests/0074-producev.c +87 -0
  516. package/deps/librdkafka/tests/0075-retry.c +253 -0
  517. package/deps/librdkafka/tests/0076-produce_retry.c +450 -0
  518. package/deps/librdkafka/tests/0077-compaction.c +357 -0
  519. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  520. package/deps/librdkafka/tests/0079-fork.c +93 -0
  521. package/deps/librdkafka/tests/0080-admin_ut.c +3065 -0
  522. package/deps/librdkafka/tests/0081-admin.c +5333 -0
  523. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +133 -0
  524. package/deps/librdkafka/tests/0083-cb_event.c +228 -0
  525. package/deps/librdkafka/tests/0084-destroy_flags.c +212 -0
  526. package/deps/librdkafka/tests/0085-headers.cpp +388 -0
  527. package/deps/librdkafka/tests/0086-purge.c +335 -0
  528. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  529. package/deps/librdkafka/tests/0089-max_poll_interval.c +506 -0
  530. package/deps/librdkafka/tests/0090-idempotence.c +172 -0
  531. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +297 -0
  532. package/deps/librdkafka/tests/0092-mixed_msgver.c +97 -0
  533. package/deps/librdkafka/tests/0093-holb.c +197 -0
  534. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +230 -0
  535. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  536. package/deps/librdkafka/tests/0097-ssl_verify.cpp +466 -0
  537. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  538. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  539. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  540. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  541. package/deps/librdkafka/tests/0102-static_group_rebalance.c +535 -0
  542. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  543. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +624 -0
  544. package/deps/librdkafka/tests/0105-transactions_mock.c +3923 -0
  545. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +297 -0
  546. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  547. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +218 -0
  548. package/deps/librdkafka/tests/0110-batch_size.cpp +183 -0
  549. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  550. package/deps/librdkafka/tests/0112-assign_unknown_part.c +98 -0
  551. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3329 -0
  552. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  553. package/deps/librdkafka/tests/0115-producer_auth.cpp +179 -0
  554. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +214 -0
  555. package/deps/librdkafka/tests/0117-mock_errors.c +321 -0
  556. package/deps/librdkafka/tests/0118-commit_rebalance.c +121 -0
  557. package/deps/librdkafka/tests/0119-consumer_auth.cpp +148 -0
  558. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +180 -0
  559. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  560. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  561. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  562. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  563. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  564. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +213 -0
  565. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  566. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  567. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +78 -0
  568. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  569. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  570. package/deps/librdkafka/tests/0132-strategy_ordering.c +171 -0
  571. package/deps/librdkafka/tests/0133-ssl_keys.c +128 -0
  572. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  573. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  574. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  575. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +609 -0
  576. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  577. package/deps/librdkafka/tests/0139-offset_validation_mock.c +442 -0
  578. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  579. package/deps/librdkafka/tests/0142-reauthentication.c +495 -0
  580. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +553 -0
  581. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  582. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  583. package/deps/librdkafka/tests/0146-metadata_mock.c +444 -0
  584. package/deps/librdkafka/tests/0150-telemetry_mock.c +648 -0
  585. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  586. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  587. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  588. package/deps/librdkafka/tests/CMakeLists.txt +164 -0
  589. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +266 -0
  590. package/deps/librdkafka/tests/Makefile +182 -0
  591. package/deps/librdkafka/tests/README.md +509 -0
  592. package/deps/librdkafka/tests/autotest.sh +33 -0
  593. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  594. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  595. package/deps/librdkafka/tests/buildbox.sh +17 -0
  596. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  597. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  598. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +109 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +34 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +93 -0
  605. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  606. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  607. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  608. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  609. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  610. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  611. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  612. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  613. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  614. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  615. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  616. package/deps/librdkafka/tests/java/Makefile +12 -0
  617. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  618. package/deps/librdkafka/tests/java/README.md +14 -0
  619. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  620. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  621. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  622. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  623. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  624. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  625. package/deps/librdkafka/tests/performance_plot.py +115 -0
  626. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  627. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  628. package/deps/librdkafka/tests/requirements.txt +2 -0
  629. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  630. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-test.sh +140 -0
  632. package/deps/librdkafka/tests/rusage.c +249 -0
  633. package/deps/librdkafka/tests/sasl_test.py +289 -0
  634. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  635. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  636. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  637. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  638. package/deps/librdkafka/tests/sockem.c +801 -0
  639. package/deps/librdkafka/tests/sockem.h +85 -0
  640. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  641. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  642. package/deps/librdkafka/tests/test.c +7318 -0
  643. package/deps/librdkafka/tests/test.conf.example +27 -0
  644. package/deps/librdkafka/tests/test.h +979 -0
  645. package/deps/librdkafka/tests/testcpp.cpp +126 -0
  646. package/deps/librdkafka/tests/testcpp.h +360 -0
  647. package/deps/librdkafka/tests/testshared.h +402 -0
  648. package/deps/librdkafka/tests/tools/README.md +4 -0
  649. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  650. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  651. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  652. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  653. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  654. package/deps/librdkafka/tests/until-fail.sh +87 -0
  655. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  656. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  657. package/deps/librdkafka/vcpkg.json +23 -0
  658. package/deps/librdkafka/win32/README.md +5 -0
  659. package/deps/librdkafka/win32/build-package.bat +3 -0
  660. package/deps/librdkafka/win32/build.bat +19 -0
  661. package/deps/librdkafka/win32/common.vcxproj +84 -0
  662. package/deps/librdkafka/win32/install-openssl.ps1 +33 -0
  663. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  664. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  665. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  666. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  667. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  668. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  669. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  670. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  671. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  672. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  673. package/deps/librdkafka/win32/push-package.bat +4 -0
  674. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  675. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  676. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  677. package/deps/librdkafka/win32/setup-msys2.ps1 +31 -0
  678. package/deps/librdkafka/win32/setup-vcpkg.ps1 +12 -0
  679. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  680. package/deps/librdkafka/win32/tests/tests.vcxproj +247 -0
  681. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  682. package/deps/librdkafka/win32/wingetopt.c +564 -0
  683. package/deps/librdkafka/win32/wingetopt.h +100 -0
  684. package/deps/librdkafka/win32/wintime.h +33 -0
  685. package/deps/librdkafka.gyp +62 -0
  686. package/deps/windows-install.py +73 -0
  687. package/docker-compose.yml +23 -0
  688. package/e2e/admin.spec.js +187 -0
  689. package/e2e/both.spec.js +726 -0
  690. package/e2e/consumer.spec.js +386 -0
  691. package/e2e/groups.spec.js +132 -0
  692. package/e2e/listener.js +51 -0
  693. package/e2e/producer-transaction.spec.js +333 -0
  694. package/e2e/producer.spec.js +283 -0
  695. package/errors.d.ts +347 -0
  696. package/examples/consumer-flow.md +76 -0
  697. package/examples/consumer.md +45 -0
  698. package/examples/docker-alpine.md +30 -0
  699. package/examples/high-level-producer.md +32 -0
  700. package/examples/metadata.md +27 -0
  701. package/examples/oauthbearer-default-flow.md +80 -0
  702. package/examples/producer-cluster.md +103 -0
  703. package/examples/producer.md +73 -0
  704. package/index.d.ts +357 -0
  705. package/lib/admin.js +233 -0
  706. package/lib/client.js +578 -0
  707. package/lib/error.js +472 -0
  708. package/lib/index.js +34 -0
  709. package/lib/kafka-consumer-stream.js +397 -0
  710. package/lib/kafka-consumer.js +698 -0
  711. package/lib/producer/high-level-producer.js +323 -0
  712. package/lib/producer-stream.js +307 -0
  713. package/lib/producer.js +375 -0
  714. package/lib/tools/ref-counter.js +52 -0
  715. package/lib/topic-partition.js +88 -0
  716. package/lib/topic.js +42 -0
  717. package/lib/util.js +29 -0
  718. package/librdkafka.js +12 -0
  719. package/make_docs.sh +59 -0
  720. package/package.json +53 -0
  721. package/renovate.json +30 -0
  722. package/run_docker.sh +42 -0
  723. package/src/admin.cc +624 -0
  724. package/src/admin.h +78 -0
  725. package/src/binding.cc +73 -0
  726. package/src/binding.h +25 -0
  727. package/src/callbacks.cc +614 -0
  728. package/src/callbacks.h +265 -0
  729. package/src/common.cc +582 -0
  730. package/src/common.h +134 -0
  731. package/src/config.cc +167 -0
  732. package/src/config.h +45 -0
  733. package/src/connection.cc +482 -0
  734. package/src/connection.h +108 -0
  735. package/src/errors.cc +96 -0
  736. package/src/errors.h +53 -0
  737. package/src/kafka-consumer.cc +1457 -0
  738. package/src/kafka-consumer.h +136 -0
  739. package/src/per-isolate-data.cc +57 -0
  740. package/src/per-isolate-data.h +39 -0
  741. package/src/producer.cc +873 -0
  742. package/src/producer.h +125 -0
  743. package/src/topic.cc +180 -0
  744. package/src/topic.h +56 -0
  745. package/src/workers.cc +1245 -0
  746. package/src/workers.h +511 -0
  747. package/test/binding.spec.js +66 -0
  748. package/test/consumer.spec.js +91 -0
  749. package/test/error.spec.js +8 -0
  750. package/test/index.spec.js +8 -0
  751. package/test/kafka-consumer-stream.spec.js +298 -0
  752. package/test/kafka-consumer-worker.js +51 -0
  753. package/test/kafka-consumer.spec.js +86 -0
  754. package/test/mocha.opts +1 -0
  755. package/test/mock.js +55 -0
  756. package/test/producer/high-level-producer.spec.js +496 -0
  757. package/test/producer-stream.spec.js +723 -0
  758. package/test/producer-worker.js +53 -0
  759. package/test/producer.spec.js +120 -0
  760. package/test/tools/ref-counter.spec.js +53 -0
  761. package/test/topic-partition.spec.js +104 -0
  762. package/test/util.spec.js +46 -0
  763. package/util/configure.js +30 -0
  764. package/util/get-env.js +6 -0
  765. package/util/test-compile.js +11 -0
  766. package/util/test-producer-delivery.js +100 -0
  767. package/win_install.ps1 +2 -0
@@ -0,0 +1,1201 @@
1
+ /*
2
+ * librdkafka - The Apache Kafka C/C++ library
3
+ *
4
+ * Copyright (c) 2016-2022, Magnus Edenhill,
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #ifndef _RDKAFKA_QUEUE_H_
31
+ #define _RDKAFKA_QUEUE_H_
32
+
33
+ #include "rdkafka_op.h"
34
+ #include "rdkafka_int.h"
35
+
36
+ #ifdef _WIN32
37
+ #include <io.h> /* for _write() */
38
+ #endif
39
+
40
+ /** @brief Queueing strategy */
41
+ #define RD_KAFKA_QUEUE_FIFO 0
42
+ #define RD_KAFKA_QUEUE_LIFO 1
43
+
44
+ TAILQ_HEAD(rd_kafka_op_tailq, rd_kafka_op_s);
45
+
46
+ /**
47
+ * @struct Queue for rd_kafka_op_t*.
48
+ *
49
+ * @remark All readers of the queue must call rd_kafka_q_mark_served()
50
+ * after reading the queue (while still holding the queue lock) to
51
+ * clear the wakeup-sent flag.
52
+ */
53
+ struct rd_kafka_q_s {
54
+ mtx_t rkq_lock;
55
+ cnd_t rkq_cond;
56
+ struct rd_kafka_q_s *rkq_fwdq; /* Forwarded/Routed queue.
57
+ * Used in place of this queue
58
+ * for all operations. */
59
+
60
+ struct rd_kafka_op_tailq rkq_q; /* TAILQ_HEAD(, rd_kafka_op_s) */
61
+ int rkq_qlen; /* Number of entries in queue */
62
+ int64_t rkq_qsize; /* Size of all entries in queue */
63
+ int rkq_refcnt;
64
+ int rkq_flags;
65
+ #define RD_KAFKA_Q_F_ALLOCATED 0x1 /* Allocated: rd_free on destroy */
66
+ #define RD_KAFKA_Q_F_READY \
67
+ 0x2 /* Queue is ready to be used. \
68
+ * Flag is cleared on destroy */
69
+ #define RD_KAFKA_Q_F_FWD_APP \
70
+ 0x4 /* Queue is being forwarded by a call \
71
+ * to rd_kafka_queue_forward. */
72
+ #define RD_KAFKA_Q_F_YIELD \
73
+ 0x8 /* Have waiters return even if \
74
+ * no rko was enqueued. \
75
+ * This is used to wake up a waiter \
76
+ * by triggering the cond-var \
77
+ * but without having to enqueue \
78
+ * an op. */
79
+ #define RD_KAFKA_Q_F_CONSUMER \
80
+ 0x10 /* If this flag is set, this queue might contain fetched messages \
81
+ from partitions. Polling this queue will reset the \
82
+ max.poll.interval.ms timer. Once set, this flag is never \
83
+ reset. */
84
+
85
+ rd_kafka_t *rkq_rk;
86
+ struct rd_kafka_q_io *rkq_qio; /* FD-based application signalling */
87
+
88
+ /* Op serve callback (optional).
89
+ * Mainly used for forwarded queues to use the original queue's
90
+ * serve function from the forwarded position.
91
+ * Shall return 1 if op was handled, else 0. */
92
+ rd_kafka_q_serve_cb_t *rkq_serve;
93
+ void *rkq_opaque;
94
+
95
+ #if ENABLE_DEVEL
96
+ char rkq_name[64]; /* Debugging: queue name (FUNC:LINE) */
97
+ #else
98
+ const char *rkq_name; /* Debugging: queue name (FUNC) */
99
+ #endif
100
+ };
101
+
102
+
103
+ /* Application signalling state holder. */
104
+ struct rd_kafka_q_io {
105
+ /* For FD-based signalling */
106
+ rd_socket_t fd;
107
+ void *payload;
108
+ size_t size;
109
+ rd_bool_t sent; /**< Wake-up has been sent.
110
+ * This field is reset to false by the queue
111
+ * reader, allowing a new wake-up to be sent by a
112
+ * subsequent writer. */
113
+ /* For callback-based signalling */
114
+ void (*event_cb)(rd_kafka_t *rk, void *opaque);
115
+ void *event_cb_opaque;
116
+ };
117
+
118
+
119
+
120
+ /**
121
+ * @return true if queue is ready/enabled, else false.
122
+ * @remark queue luck must be held by caller (if applicable)
123
+ */
124
+ static RD_INLINE RD_UNUSED int rd_kafka_q_ready(rd_kafka_q_t *rkq) {
125
+ return rkq->rkq_flags & RD_KAFKA_Q_F_READY;
126
+ }
127
+
128
+
129
+
130
+ void rd_kafka_q_init0(rd_kafka_q_t *rkq,
131
+ rd_kafka_t *rk,
132
+ rd_bool_t for_consume,
133
+ const char *func,
134
+ int line);
135
+ #define rd_kafka_q_init(rkq, rk) \
136
+ rd_kafka_q_init0(rkq, rk, rd_false, __FUNCTION__, __LINE__)
137
+ #define rd_kafka_consume_q_init(rkq, rk) \
138
+ rd_kafka_q_init0(rkq, rk, rd_true, __FUNCTION__, __LINE__)
139
+ rd_kafka_q_t *rd_kafka_q_new0(rd_kafka_t *rk,
140
+ rd_bool_t for_consume,
141
+ const char *func,
142
+ int line);
143
+ #define rd_kafka_q_new(rk) rd_kafka_q_new0(rk, rd_false, __FUNCTION__, __LINE__)
144
+ #define rd_kafka_consume_q_new(rk) \
145
+ rd_kafka_q_new0(rk, rd_true, __FUNCTION__, __LINE__)
146
+ void rd_kafka_q_destroy_final(rd_kafka_q_t *rkq);
147
+
148
+ #define rd_kafka_q_lock(rkqu) mtx_lock(&(rkqu)->rkq_lock)
149
+ #define rd_kafka_q_unlock(rkqu) mtx_unlock(&(rkqu)->rkq_lock)
150
+
151
+ static RD_INLINE RD_UNUSED rd_kafka_q_t *rd_kafka_q_keep(rd_kafka_q_t *rkq) {
152
+ mtx_lock(&rkq->rkq_lock);
153
+ rkq->rkq_refcnt++;
154
+ mtx_unlock(&rkq->rkq_lock);
155
+ return rkq;
156
+ }
157
+
158
+ static RD_INLINE RD_UNUSED rd_kafka_q_t *
159
+ rd_kafka_q_keep_nolock(rd_kafka_q_t *rkq) {
160
+ rkq->rkq_refcnt++;
161
+ return rkq;
162
+ }
163
+
164
+
165
+ /**
166
+ * @returns the queue's name (used for debugging)
167
+ */
168
+ static RD_INLINE RD_UNUSED const char *rd_kafka_q_name(rd_kafka_q_t *rkq) {
169
+ return rkq->rkq_name;
170
+ }
171
+
172
+ /**
173
+ * @returns the final destination queue name (after forwarding)
174
+ * @remark rkq MUST NOT be locked
175
+ */
176
+ static RD_INLINE RD_UNUSED const char *rd_kafka_q_dest_name(rd_kafka_q_t *rkq) {
177
+ const char *ret;
178
+ mtx_lock(&rkq->rkq_lock);
179
+ if (rkq->rkq_fwdq)
180
+ ret = rd_kafka_q_dest_name(rkq->rkq_fwdq);
181
+ else
182
+ ret = rd_kafka_q_name(rkq);
183
+ mtx_unlock(&rkq->rkq_lock);
184
+ return ret;
185
+ }
186
+
187
+ /**
188
+ * @brief Disable a queue.
189
+ * Attempting to enqueue ops to the queue will destroy the ops.
190
+ */
191
+ static RD_INLINE RD_UNUSED void rd_kafka_q_disable0(rd_kafka_q_t *rkq,
192
+ int do_lock) {
193
+ if (do_lock)
194
+ mtx_lock(&rkq->rkq_lock);
195
+ rkq->rkq_flags &= ~RD_KAFKA_Q_F_READY;
196
+ if (do_lock)
197
+ mtx_unlock(&rkq->rkq_lock);
198
+ }
199
+ #define rd_kafka_q_disable(rkq) rd_kafka_q_disable0(rkq, 1 /*lock*/)
200
+
201
+ int rd_kafka_q_purge0(rd_kafka_q_t *rkq, int do_lock);
202
+ #define rd_kafka_q_purge(rkq) rd_kafka_q_purge0(rkq, 1 /*lock*/)
203
+ void rd_kafka_q_purge_toppar_version(rd_kafka_q_t *rkq,
204
+ rd_kafka_toppar_t *rktp,
205
+ int version);
206
+
207
+ /**
208
+ * @brief Loose reference to queue, when refcount reaches 0 the queue
209
+ * will be destroyed.
210
+ *
211
+ * @param disable Also disable the queue, to be used by owner of the queue.
212
+ */
213
+ static RD_INLINE RD_UNUSED void rd_kafka_q_destroy0(rd_kafka_q_t *rkq,
214
+ int disable) {
215
+ int do_delete = 0;
216
+
217
+ if (disable) {
218
+ /* To avoid recursive locking (from ops being purged
219
+ * that reference this queue somehow),
220
+ * we disable the queue and purge it with individual
221
+ * locking. */
222
+ rd_kafka_q_disable0(rkq, 1 /*lock*/);
223
+ rd_kafka_q_purge0(rkq, 1 /*lock*/);
224
+ }
225
+
226
+ mtx_lock(&rkq->rkq_lock);
227
+ rd_kafka_assert(NULL, rkq->rkq_refcnt > 0);
228
+ do_delete = !--rkq->rkq_refcnt;
229
+ mtx_unlock(&rkq->rkq_lock);
230
+
231
+ if (unlikely(do_delete))
232
+ rd_kafka_q_destroy_final(rkq);
233
+ }
234
+
235
+ #define rd_kafka_q_destroy(rkq) rd_kafka_q_destroy0(rkq, 0 /*dont-disable*/)
236
+
237
+ /**
238
+ * @brief Queue destroy method to be used by the owner (poller) of
239
+ * the queue. The only difference to q_destroy() is that this
240
+ * method also disables the queue so that any q_enq() operations
241
+ * will fail.
242
+ * Failure to disable a queue on the poller when it destroys its
243
+ * queue reference results in ops being enqueued on the queue
244
+ * but there is noone left to poll it, possibly resulting in a
245
+ * hang on termination due to refcounts held by the op.
246
+ */
247
+ static RD_INLINE RD_UNUSED void rd_kafka_q_destroy_owner(rd_kafka_q_t *rkq) {
248
+ rd_kafka_q_destroy0(rkq, 1 /*disable*/);
249
+ }
250
+
251
+
252
+ /**
253
+ * Reset a queue.
254
+ * WARNING: All messages will be lost and leaked.
255
+ * NOTE: No locking is performed.
256
+ */
257
+ static RD_INLINE RD_UNUSED void rd_kafka_q_reset(rd_kafka_q_t *rkq) {
258
+ TAILQ_INIT(&rkq->rkq_q);
259
+ rd_dassert(TAILQ_EMPTY(&rkq->rkq_q));
260
+ rkq->rkq_qlen = 0;
261
+ rkq->rkq_qsize = 0;
262
+ }
263
+
264
+
265
+
266
+ /**
267
+ * Forward 'srcq' to 'destq'
268
+ */
269
+ void rd_kafka_q_fwd_set0(rd_kafka_q_t *srcq,
270
+ rd_kafka_q_t *destq,
271
+ int do_lock,
272
+ int fwd_app);
273
+ #define rd_kafka_q_fwd_set(S, D) \
274
+ rd_kafka_q_fwd_set0(S, D, 1 /*lock*/, 0 /*no fwd_app*/)
275
+
276
+ /**
277
+ * @returns the forward queue (if any) with its refcount increased.
278
+ * @locks rd_kafka_q_lock(rkq) == !do_lock
279
+ */
280
+ static RD_INLINE RD_UNUSED rd_kafka_q_t *rd_kafka_q_fwd_get(rd_kafka_q_t *rkq,
281
+ int do_lock) {
282
+ rd_kafka_q_t *fwdq;
283
+ if (do_lock)
284
+ mtx_lock(&rkq->rkq_lock);
285
+
286
+ if ((fwdq = rkq->rkq_fwdq))
287
+ rd_kafka_q_keep(fwdq);
288
+
289
+ if (do_lock)
290
+ mtx_unlock(&rkq->rkq_lock);
291
+
292
+ return fwdq;
293
+ }
294
+
295
+
296
+ /**
297
+ * @returns true if queue is forwarded, else false.
298
+ *
299
+ * @remark Thread-safe.
300
+ */
301
+ static RD_INLINE RD_UNUSED int rd_kafka_q_is_fwded(rd_kafka_q_t *rkq) {
302
+ int r;
303
+ mtx_lock(&rkq->rkq_lock);
304
+ r = rkq->rkq_fwdq ? 1 : 0;
305
+ mtx_unlock(&rkq->rkq_lock);
306
+ return r;
307
+ }
308
+
309
+
310
+
311
+ /**
312
+ * @brief Trigger an IO event for this queue.
313
+ *
314
+ * @remark Queue MUST be locked
315
+ */
316
+ static RD_INLINE RD_UNUSED void rd_kafka_q_io_event(rd_kafka_q_t *rkq) {
317
+
318
+ if (likely(!rkq->rkq_qio))
319
+ return;
320
+
321
+ if (rkq->rkq_qio->event_cb) {
322
+ rkq->rkq_qio->event_cb(rkq->rkq_rk,
323
+ rkq->rkq_qio->event_cb_opaque);
324
+ return;
325
+ }
326
+
327
+
328
+ /* Only one wake-up event should be sent per non-polling period.
329
+ * As the queue reader calls poll/reads the channel it calls to
330
+ * rd_kafka_q_mark_served() to reset the wakeup sent flag, allowing
331
+ * further wakeups in the next non-polling period. */
332
+ if (rkq->rkq_qio->sent)
333
+ return; /* Wake-up event already written */
334
+
335
+ rkq->rkq_qio->sent = rd_true;
336
+
337
+ /* Write wake-up event to socket.
338
+ * Ignore errors, not much to do anyway. */
339
+ if (rd_socket_write(rkq->rkq_qio->fd, rkq->rkq_qio->payload,
340
+ (int)rkq->rkq_qio->size) == -1)
341
+ ;
342
+ }
343
+
344
+
345
+ /**
346
+ * @brief rko->rko_prio comparator
347
+ * @remark: descending order: higher priority takes preceedence.
348
+ */
349
+ static RD_INLINE RD_UNUSED int rd_kafka_op_cmp_prio(const void *_a,
350
+ const void *_b) {
351
+ const rd_kafka_op_t *a = _a, *b = _b;
352
+
353
+ return RD_CMP(b->rko_prio, a->rko_prio);
354
+ }
355
+
356
+
357
+ /**
358
+ * @brief Wake up waiters without enqueuing an op.
359
+ */
360
+ static RD_INLINE RD_UNUSED void rd_kafka_q_yield(rd_kafka_q_t *rkq) {
361
+ rd_kafka_q_t *fwdq;
362
+
363
+ mtx_lock(&rkq->rkq_lock);
364
+
365
+ rd_dassert(rkq->rkq_refcnt > 0);
366
+
367
+ if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
368
+ /* Queue has been disabled */
369
+ mtx_unlock(&rkq->rkq_lock);
370
+ return;
371
+ }
372
+
373
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
374
+ rkq->rkq_flags |= RD_KAFKA_Q_F_YIELD;
375
+ cnd_broadcast(&rkq->rkq_cond);
376
+ if (rkq->rkq_qlen == 0)
377
+ rd_kafka_q_io_event(rkq);
378
+
379
+ mtx_unlock(&rkq->rkq_lock);
380
+ } else {
381
+ mtx_unlock(&rkq->rkq_lock);
382
+ rd_kafka_q_yield(fwdq);
383
+ rd_kafka_q_destroy(fwdq);
384
+ }
385
+ }
386
+
387
+ /**
388
+ * @brief Low-level unprotected enqueue that only performs
389
+ * the actual queue enqueue and counter updates.
390
+ * @remark Will not perform locking, signaling, fwdq, READY checking, etc.
391
+ */
392
+ static RD_INLINE RD_UNUSED void
393
+ rd_kafka_q_enq0(rd_kafka_q_t *rkq, rd_kafka_op_t *rko, int at_head) {
394
+ if (likely(!rko->rko_prio))
395
+ TAILQ_INSERT_TAIL(&rkq->rkq_q, rko, rko_link);
396
+ else if (at_head)
397
+ TAILQ_INSERT_HEAD(&rkq->rkq_q, rko, rko_link);
398
+ else
399
+ TAILQ_INSERT_SORTED(&rkq->rkq_q, rko, rd_kafka_op_t *, rko_link,
400
+ rd_kafka_op_cmp_prio);
401
+ rkq->rkq_qlen++;
402
+ rkq->rkq_qsize += rko->rko_len;
403
+ }
404
+
405
+
406
+ /**
407
+ * @brief Enqueue \p rko either at head or tail of \p rkq.
408
+ *
409
+ * The provided \p rko is either enqueued or destroyed.
410
+ *
411
+ * \p orig_destq is the original (outermost) dest queue for which
412
+ * this op was enqueued, before any queue forwarding has kicked in.
413
+ * The rko_serve callback from the orig_destq will be set on the rko
414
+ * if there is no rko_serve callback already set, and the \p rko isn't
415
+ * failed because the final queue is disabled.
416
+ *
417
+ * @returns 1 if op was enqueued or 0 if queue is disabled and
418
+ * there was no replyq to enqueue on in which case the rko is destroyed.
419
+ *
420
+ * @locality any thread.
421
+ */
422
+ static RD_INLINE RD_UNUSED int rd_kafka_q_enq1(rd_kafka_q_t *rkq,
423
+ rd_kafka_op_t *rko,
424
+ rd_kafka_q_t *orig_destq,
425
+ int at_head,
426
+ int do_lock) {
427
+ rd_kafka_q_t *fwdq;
428
+
429
+ if (do_lock)
430
+ mtx_lock(&rkq->rkq_lock);
431
+
432
+ rd_dassert(rkq->rkq_refcnt > 0);
433
+
434
+ if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
435
+ /* Queue has been disabled, reply to and fail the rko. */
436
+ if (do_lock)
437
+ mtx_unlock(&rkq->rkq_lock);
438
+
439
+ return rd_kafka_op_reply(rko, RD_KAFKA_RESP_ERR__DESTROY);
440
+ }
441
+
442
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
443
+ if (!rko->rko_serve && orig_destq->rkq_serve) {
444
+ /* Store original queue's serve callback and opaque
445
+ * prior to forwarding. */
446
+ rko->rko_serve = orig_destq->rkq_serve;
447
+ rko->rko_serve_opaque = orig_destq->rkq_opaque;
448
+ }
449
+
450
+ rd_kafka_q_enq0(rkq, rko, at_head);
451
+ cnd_signal(&rkq->rkq_cond);
452
+ if (rkq->rkq_qlen == 1)
453
+ rd_kafka_q_io_event(rkq);
454
+
455
+ if (do_lock)
456
+ mtx_unlock(&rkq->rkq_lock);
457
+ } else {
458
+ if (do_lock)
459
+ mtx_unlock(&rkq->rkq_lock);
460
+ rd_kafka_q_enq1(fwdq, rko, orig_destq, at_head, 1 /*do lock*/);
461
+ rd_kafka_q_destroy(fwdq);
462
+ }
463
+
464
+ return 1;
465
+ }
466
+
467
+ /**
468
+ * @brief Enqueue the 'rko' op at the tail of the queue 'rkq'.
469
+ *
470
+ * The provided 'rko' is either enqueued or destroyed.
471
+ *
472
+ * @returns 1 if op was enqueued or 0 if queue is disabled and
473
+ * there was no replyq to enqueue on in which case the rko is destroyed.
474
+ *
475
+ * @locality any thread.
476
+ * @locks rkq MUST NOT be locked
477
+ */
478
+ static RD_INLINE RD_UNUSED int rd_kafka_q_enq(rd_kafka_q_t *rkq,
479
+ rd_kafka_op_t *rko) {
480
+ return rd_kafka_q_enq1(rkq, rko, rkq, 0 /*at tail*/, 1 /*do lock*/);
481
+ }
482
+
483
+
484
+ /**
485
+ * @brief Re-enqueue rko at head of rkq.
486
+ *
487
+ * The provided 'rko' is either enqueued or destroyed.
488
+ *
489
+ * @returns 1 if op was enqueued or 0 if queue is disabled and
490
+ * there was no replyq to enqueue on in which case the rko is destroyed.
491
+ *
492
+ * @locality any thread
493
+ * @locks rkq MUST BE locked
494
+ */
495
+ static RD_INLINE RD_UNUSED int rd_kafka_q_reenq(rd_kafka_q_t *rkq,
496
+ rd_kafka_op_t *rko) {
497
+ return rd_kafka_q_enq1(rkq, rko, rkq, 1 /*at head*/, 0 /*don't lock*/);
498
+ }
499
+
500
+
501
+ /**
502
+ * Dequeue 'rko' from queue 'rkq'.
503
+ *
504
+ * NOTE: rkq_lock MUST be held
505
+ * Locality: any thread
506
+ */
507
+ static RD_INLINE RD_UNUSED void rd_kafka_q_deq0(rd_kafka_q_t *rkq,
508
+ rd_kafka_op_t *rko) {
509
+ rd_dassert(rkq->rkq_qlen > 0 &&
510
+ rkq->rkq_qsize >= (int64_t)rko->rko_len);
511
+
512
+ TAILQ_REMOVE(&rkq->rkq_q, rko, rko_link);
513
+ rkq->rkq_qlen--;
514
+ rkq->rkq_qsize -= rko->rko_len;
515
+ }
516
+
517
+
518
+ /**
519
+ * @brief Mark queue as served / read.
520
+ *
521
+ * This is currently used by the queue reader side to reset the io-event
522
+ * wakeup flag.
523
+ *
524
+ * Should be called by all queue readers.
525
+ *
526
+ * @locks_required rkq must be locked.
527
+ */
528
+ static RD_INLINE RD_UNUSED void rd_kafka_q_mark_served(rd_kafka_q_t *rkq) {
529
+ if (rkq->rkq_qio)
530
+ rkq->rkq_qio->sent = rd_false;
531
+ }
532
+
533
+
534
+ /**
535
+ * Concat all elements of 'srcq' onto tail of 'rkq'.
536
+ * 'rkq' will be be locked (if 'do_lock'==1), but 'srcq' will not.
537
+ * NOTE: 'srcq' will be reset.
538
+ *
539
+ * Locality: any thread.
540
+ *
541
+ * @returns 0 if operation was performed or -1 if rkq is disabled.
542
+ */
543
+ static RD_INLINE RD_UNUSED int
544
+ rd_kafka_q_concat0(rd_kafka_q_t *rkq, rd_kafka_q_t *srcq, int do_lock) {
545
+ int r = 0;
546
+
547
+ while (srcq->rkq_fwdq) /* Resolve source queue */
548
+ srcq = srcq->rkq_fwdq;
549
+ if (unlikely(srcq->rkq_qlen == 0))
550
+ return 0; /* Don't do anything if source queue is empty */
551
+
552
+ if (do_lock)
553
+ mtx_lock(&rkq->rkq_lock);
554
+ if (!rkq->rkq_fwdq) {
555
+ rd_kafka_op_t *rko;
556
+
557
+ rd_dassert(TAILQ_EMPTY(&srcq->rkq_q) || srcq->rkq_qlen > 0);
558
+ if (unlikely(!(rkq->rkq_flags & RD_KAFKA_Q_F_READY))) {
559
+ if (do_lock)
560
+ mtx_unlock(&rkq->rkq_lock);
561
+ return -1;
562
+ }
563
+ /* First insert any prioritized ops from srcq
564
+ * in the right position in rkq. */
565
+ while ((rko = TAILQ_FIRST(&srcq->rkq_q)) && rko->rko_prio > 0) {
566
+ TAILQ_REMOVE(&srcq->rkq_q, rko, rko_link);
567
+ TAILQ_INSERT_SORTED(&rkq->rkq_q, rko, rd_kafka_op_t *,
568
+ rko_link, rd_kafka_op_cmp_prio);
569
+ }
570
+
571
+ TAILQ_CONCAT(&rkq->rkq_q, &srcq->rkq_q, rko_link);
572
+ if (rkq->rkq_qlen == 0)
573
+ rd_kafka_q_io_event(rkq);
574
+ rkq->rkq_qlen += srcq->rkq_qlen;
575
+ rkq->rkq_qsize += srcq->rkq_qsize;
576
+ cnd_signal(&rkq->rkq_cond);
577
+
578
+ rd_kafka_q_mark_served(srcq);
579
+ rd_kafka_q_reset(srcq);
580
+ } else
581
+ r = rd_kafka_q_concat0(rkq->rkq_fwdq ? rkq->rkq_fwdq : rkq,
582
+ srcq, rkq->rkq_fwdq ? do_lock : 0);
583
+ if (do_lock)
584
+ mtx_unlock(&rkq->rkq_lock);
585
+
586
+ return r;
587
+ }
588
+
589
+ #define rd_kafka_q_concat(dstq, srcq) rd_kafka_q_concat0(dstq, srcq, 1 /*lock*/)
590
+
591
+
592
+ /**
593
+ * @brief Prepend all elements of 'srcq' onto head of 'rkq'.
594
+ * 'rkq' will be be locked (if 'do_lock'==1), but 'srcq' will not.
595
+ * 'srcq' will be reset.
596
+ *
597
+ * @remark Will not respect priority of ops, srcq will be prepended in its
598
+ * original form to rkq.
599
+ *
600
+ * @locality any thread.
601
+ */
602
+ static RD_INLINE RD_UNUSED void
603
+ rd_kafka_q_prepend0(rd_kafka_q_t *rkq, rd_kafka_q_t *srcq, int do_lock) {
604
+ if (do_lock)
605
+ mtx_lock(&rkq->rkq_lock);
606
+ if (!rkq->rkq_fwdq && !srcq->rkq_fwdq) {
607
+ /* FIXME: prio-aware */
608
+ /* Concat rkq on srcq */
609
+ TAILQ_CONCAT(&srcq->rkq_q, &rkq->rkq_q, rko_link);
610
+ /* Move srcq to rkq */
611
+ TAILQ_MOVE(&rkq->rkq_q, &srcq->rkq_q, rko_link);
612
+ if (rkq->rkq_qlen == 0 && srcq->rkq_qlen > 0)
613
+ rd_kafka_q_io_event(rkq);
614
+ rkq->rkq_qlen += srcq->rkq_qlen;
615
+ rkq->rkq_qsize += srcq->rkq_qsize;
616
+
617
+ rd_kafka_q_mark_served(srcq);
618
+ rd_kafka_q_reset(srcq);
619
+ } else
620
+ rd_kafka_q_prepend0(rkq->rkq_fwdq ? rkq->rkq_fwdq : rkq,
621
+ srcq->rkq_fwdq ? srcq->rkq_fwdq : srcq,
622
+ rkq->rkq_fwdq ? do_lock : 0);
623
+ if (do_lock)
624
+ mtx_unlock(&rkq->rkq_lock);
625
+ }
626
+
627
+ #define rd_kafka_q_prepend(dstq, srcq) \
628
+ rd_kafka_q_prepend0(dstq, srcq, 1 /*lock*/)
629
+
630
+
631
+ /* Returns the number of elements in the queue */
632
+ static RD_INLINE RD_UNUSED int rd_kafka_q_len(rd_kafka_q_t *rkq) {
633
+ int qlen;
634
+ rd_kafka_q_t *fwdq;
635
+ mtx_lock(&rkq->rkq_lock);
636
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
637
+ qlen = rkq->rkq_qlen;
638
+ mtx_unlock(&rkq->rkq_lock);
639
+ } else {
640
+ mtx_unlock(&rkq->rkq_lock);
641
+ qlen = rd_kafka_q_len(fwdq);
642
+ rd_kafka_q_destroy(fwdq);
643
+ }
644
+ return qlen;
645
+ }
646
+
647
+ /* Returns the total size of elements in the queue */
648
+ static RD_INLINE RD_UNUSED uint64_t rd_kafka_q_size(rd_kafka_q_t *rkq) {
649
+ uint64_t sz;
650
+ rd_kafka_q_t *fwdq;
651
+ mtx_lock(&rkq->rkq_lock);
652
+ if (!(fwdq = rd_kafka_q_fwd_get(rkq, 0))) {
653
+ sz = rkq->rkq_qsize;
654
+ mtx_unlock(&rkq->rkq_lock);
655
+ } else {
656
+ mtx_unlock(&rkq->rkq_lock);
657
+ sz = rd_kafka_q_size(fwdq);
658
+ rd_kafka_q_destroy(fwdq);
659
+ }
660
+ return sz;
661
+ }
662
+
663
+ /**
664
+ * @brief Construct a temporary on-stack replyq with increased
665
+ * \p rkq refcount (unless NULL), version, and debug id.
666
+ */
667
+ static RD_INLINE RD_UNUSED rd_kafka_replyq_t
668
+ rd_kafka_replyq_make(rd_kafka_q_t *rkq, int version, const char *id) {
669
+ rd_kafka_replyq_t replyq = RD_ZERO_INIT;
670
+
671
+ if (rkq) {
672
+ replyq.q = rd_kafka_q_keep(rkq);
673
+ replyq.version = version;
674
+ #if ENABLE_DEVEL
675
+ replyq._id = rd_strdup(id);
676
+ #endif
677
+ }
678
+
679
+ return replyq;
680
+ }
681
+
682
+ /* Construct temporary on-stack replyq with increased Q refcount and
683
+ * optional VERSION. */
684
+ #define RD_KAFKA_REPLYQ(Q, VERSION) \
685
+ rd_kafka_replyq_make(Q, VERSION, __FUNCTION__)
686
+
687
+ /* Construct temporary on-stack replyq for indicating no replyq. */
688
+ #if ENABLE_DEVEL
689
+ #define RD_KAFKA_NO_REPLYQ \
690
+ (rd_kafka_replyq_t) { \
691
+ NULL, 0, NULL \
692
+ }
693
+ #else
694
+ #define RD_KAFKA_NO_REPLYQ \
695
+ (rd_kafka_replyq_t) { \
696
+ NULL, 0 \
697
+ }
698
+ #endif
699
+
700
+
701
+ /**
702
+ * @returns true if the replyq is valid, else false.
703
+ */
704
+ static RD_INLINE RD_UNUSED rd_bool_t
705
+ rd_kafka_replyq_is_valid(rd_kafka_replyq_t *replyq) {
706
+ rd_bool_t valid = rd_true;
707
+
708
+ if (!replyq->q)
709
+ return rd_false;
710
+
711
+ rd_kafka_q_lock(replyq->q);
712
+ valid = rd_kafka_q_ready(replyq->q);
713
+ rd_kafka_q_unlock(replyq->q);
714
+
715
+ return valid;
716
+ }
717
+
718
+
719
+
720
+ /**
721
+ * Set up replyq.
722
+ * Q refcnt is increased.
723
+ */
724
+ static RD_INLINE RD_UNUSED void rd_kafka_set_replyq(rd_kafka_replyq_t *replyq,
725
+ rd_kafka_q_t *rkq,
726
+ int32_t version) {
727
+ replyq->q = rkq ? rd_kafka_q_keep(rkq) : NULL;
728
+ replyq->version = version;
729
+ #if ENABLE_DEVEL
730
+ replyq->_id = rd_strdup(__FUNCTION__);
731
+ #endif
732
+ }
733
+
734
+ /**
735
+ * Set rko's replyq with an optional version (versionptr != NULL).
736
+ * Q refcnt is increased.
737
+ */
738
+ static RD_INLINE RD_UNUSED void
739
+ rd_kafka_op_set_replyq(rd_kafka_op_t *rko,
740
+ rd_kafka_q_t *rkq,
741
+ rd_atomic32_t *versionptr) {
742
+ rd_kafka_set_replyq(&rko->rko_replyq, rkq,
743
+ versionptr ? rd_atomic32_get(versionptr) : 0);
744
+ }
745
+
746
+ /* Set reply rko's version from replyq's version */
747
+ #define rd_kafka_op_get_reply_version(REPLY_RKO, ORIG_RKO) \
748
+ do { \
749
+ (REPLY_RKO)->rko_version = (ORIG_RKO)->rko_replyq.version; \
750
+ } while (0)
751
+
752
+
753
+ /* Clear replyq holder without decreasing any .q references. */
754
+ static RD_INLINE RD_UNUSED void
755
+ rd_kafka_replyq_clear(rd_kafka_replyq_t *replyq) {
756
+ memset(replyq, 0, sizeof(*replyq));
757
+ }
758
+
759
+ /**
760
+ * @brief Make a copy of \p src in \p dst, with its own queue reference
761
+ */
762
+ static RD_INLINE RD_UNUSED void rd_kafka_replyq_copy(rd_kafka_replyq_t *dst,
763
+ rd_kafka_replyq_t *src) {
764
+ dst->version = src->version;
765
+ dst->q = src->q;
766
+ if (dst->q)
767
+ rd_kafka_q_keep(dst->q);
768
+ #if ENABLE_DEVEL
769
+ if (src->_id)
770
+ dst->_id = rd_strdup(src->_id);
771
+ else
772
+ dst->_id = NULL;
773
+ #endif
774
+ }
775
+
776
+
777
+ /**
778
+ * Clear replyq holder and destroy any .q references.
779
+ */
780
+ static RD_INLINE RD_UNUSED void
781
+ rd_kafka_replyq_destroy(rd_kafka_replyq_t *replyq) {
782
+ if (replyq->q)
783
+ rd_kafka_q_destroy(replyq->q);
784
+ #if ENABLE_DEVEL
785
+ if (replyq->_id) {
786
+ rd_free(replyq->_id);
787
+ replyq->_id = NULL;
788
+ }
789
+ #endif
790
+ rd_kafka_replyq_clear(replyq);
791
+ }
792
+
793
+
794
+ /**
795
+ * @brief Wrapper for rd_kafka_q_enq() that takes a replyq,
796
+ * steals its queue reference, enqueues the op with the replyq version,
797
+ * and then destroys the queue reference.
798
+ *
799
+ * If \p version is non-zero it will be updated, else replyq->version.
800
+ *
801
+ * @returns Same as rd_kafka_q_enq()
802
+ */
803
+ static RD_INLINE RD_UNUSED int rd_kafka_replyq_enq(rd_kafka_replyq_t *replyq,
804
+ rd_kafka_op_t *rko,
805
+ int version) {
806
+ rd_kafka_q_t *rkq = replyq->q;
807
+ int r;
808
+
809
+ if (version)
810
+ rko->rko_version = version;
811
+ else
812
+ rko->rko_version = replyq->version;
813
+
814
+ /* The replyq queue reference is done after we've enqueued the rko
815
+ * so clear it here. */
816
+ replyq->q = NULL; /* destroyed separately below */
817
+
818
+ #if ENABLE_DEVEL
819
+ if (replyq->_id) {
820
+ rd_free(replyq->_id);
821
+ replyq->_id = NULL;
822
+ }
823
+ #endif
824
+
825
+ /* Retain replyq->version since it is used by buf_callback
826
+ * when dispatching the callback. */
827
+
828
+ r = rd_kafka_q_enq(rkq, rko);
829
+
830
+ rd_kafka_q_destroy(rkq);
831
+
832
+ return r;
833
+ }
834
+
835
+
836
+
837
+ rd_kafka_op_t *rd_kafka_q_pop_serve(rd_kafka_q_t *rkq,
838
+ rd_ts_t timeout_us,
839
+ int32_t version,
840
+ rd_kafka_q_cb_type_t cb_type,
841
+ rd_kafka_q_serve_cb_t *callback,
842
+ void *opaque);
843
+ rd_kafka_op_t *
844
+ rd_kafka_q_pop(rd_kafka_q_t *rkq, rd_ts_t timeout_us, int32_t version);
845
+ int rd_kafka_q_serve(rd_kafka_q_t *rkq,
846
+ int timeout_ms,
847
+ int max_cnt,
848
+ rd_kafka_q_cb_type_t cb_type,
849
+ rd_kafka_q_serve_cb_t *callback,
850
+ void *opaque);
851
+
852
+
853
+ int rd_kafka_q_move_cnt(rd_kafka_q_t *dstq,
854
+ rd_kafka_q_t *srcq,
855
+ int cnt,
856
+ int do_locks);
857
+
858
+ int rd_kafka_q_serve_rkmessages(rd_kafka_q_t *rkq,
859
+ int timeout_ms,
860
+ rd_kafka_message_t **rkmessages,
861
+ size_t rkmessages_size);
862
+ rd_kafka_resp_err_t rd_kafka_q_wait_result(rd_kafka_q_t *rkq, int timeout_ms);
863
+
864
+ int rd_kafka_q_apply(rd_kafka_q_t *rkq,
865
+ int (*callback)(rd_kafka_q_t *rkq,
866
+ rd_kafka_op_t *rko,
867
+ void *opaque),
868
+ void *opaque);
869
+
870
+ void rd_kafka_q_fix_offsets(rd_kafka_q_t *rkq,
871
+ int64_t min_offset,
872
+ int64_t base_offset);
873
+
874
+ /**
875
+ * @returns the last op in the queue matching \p op_type and \p allow_err (bool)
876
+ * @remark The \p rkq must be properly locked before this call, the returned rko
877
+ * is not removed from the queue and may thus not be held for longer
878
+ * than the lock is held.
879
+ */
880
+ static RD_INLINE RD_UNUSED rd_kafka_op_t *
881
+ rd_kafka_q_last(rd_kafka_q_t *rkq, rd_kafka_op_type_t op_type, int allow_err) {
882
+ rd_kafka_op_t *rko;
883
+ TAILQ_FOREACH_REVERSE(rko, &rkq->rkq_q, rd_kafka_op_tailq, rko_link) {
884
+ if (rko->rko_type == op_type && (allow_err || !rko->rko_err))
885
+ return rko;
886
+ }
887
+
888
+ return NULL;
889
+ }
890
+
891
+ void rd_kafka_q_io_event_enable(rd_kafka_q_t *rkq,
892
+ rd_socket_t fd,
893
+ const void *payload,
894
+ size_t size);
895
+
896
+ /* Public interface */
897
+ struct rd_kafka_queue_s {
898
+ rd_kafka_q_t *rkqu_q;
899
+ rd_kafka_t *rkqu_rk;
900
+ int rkqu_is_owner; /**< Is owner/creator of rkqu_q */
901
+ };
902
+
903
+
904
+ rd_kafka_queue_t *rd_kafka_queue_new0(rd_kafka_t *rk, rd_kafka_q_t *rkq);
905
+
906
+ void rd_kafka_q_dump(FILE *fp, rd_kafka_q_t *rkq);
907
+
908
+ extern int RD_TLS rd_kafka_yield_thread;
909
+
910
+
911
+
912
+ /**
913
+ * @name Enqueue op once
914
+ * @{
915
+ */
916
+
917
+ /**
918
+ * @brief Minimal rd_kafka_op_t wrapper that ensures that
919
+ * the op is only enqueued on the provided queue once.
920
+ *
921
+ * Typical use-case is for an op to be triggered from multiple sources,
922
+ * but at most once, such as from a timer and some other source.
923
+ */
924
+ typedef struct rd_kafka_enq_once_s {
925
+ mtx_t lock;
926
+ int refcnt;
927
+ rd_kafka_op_t *rko;
928
+ rd_kafka_replyq_t replyq;
929
+ } rd_kafka_enq_once_t;
930
+
931
+
932
+ /**
933
+ * @brief Allocate and set up a new eonce and set the initial refcount to 1.
934
+ * @remark This is to be called by the owner of the rko.
935
+ */
936
+ static RD_INLINE RD_UNUSED rd_kafka_enq_once_t *
937
+ rd_kafka_enq_once_new(rd_kafka_op_t *rko, rd_kafka_replyq_t replyq) {
938
+ rd_kafka_enq_once_t *eonce = rd_calloc(1, sizeof(*eonce));
939
+ mtx_init(&eonce->lock, mtx_plain);
940
+ eonce->rko = rko;
941
+ eonce->replyq = replyq; /* struct copy */
942
+ eonce->refcnt = 1;
943
+ return eonce;
944
+ }
945
+
946
+ /**
947
+ * @brief Re-enable triggering of a eonce even after it has been triggered
948
+ * once.
949
+ *
950
+ * @remark This is to be called by the owner.
951
+ */
952
+ static RD_INLINE RD_UNUSED void
953
+ rd_kafka_enq_once_reenable(rd_kafka_enq_once_t *eonce,
954
+ rd_kafka_op_t *rko,
955
+ rd_kafka_replyq_t replyq) {
956
+ mtx_lock(&eonce->lock);
957
+ eonce->rko = rko;
958
+ rd_kafka_replyq_destroy(&eonce->replyq);
959
+ eonce->replyq = replyq; /* struct copy */
960
+ mtx_unlock(&eonce->lock);
961
+ }
962
+
963
+
964
+ /**
965
+ * @brief Free eonce and its resources. Must only be called with refcnt==0
966
+ * and eonce->lock NOT held.
967
+ */
968
+ static RD_INLINE RD_UNUSED void
969
+ rd_kafka_enq_once_destroy0(rd_kafka_enq_once_t *eonce) {
970
+ /* This must not be called with the rko or replyq still set, which would
971
+ * indicate that no enqueueing was performed and that the owner
972
+ * did not clean up, which is a bug. */
973
+ rd_assert(!eonce->rko);
974
+ rd_assert(!eonce->replyq.q);
975
+ #if ENABLE_DEVEL
976
+ rd_assert(!eonce->replyq._id);
977
+ #endif
978
+ rd_assert(eonce->refcnt == 0);
979
+
980
+ mtx_destroy(&eonce->lock);
981
+ rd_free(eonce);
982
+ }
983
+
984
+
985
+ /**
986
+ * @brief Increment refcount for source (non-owner), such as a timer.
987
+ *
988
+ * @param srcdesc a human-readable descriptive string of the source.
989
+ * May be used for future debugging.
990
+ */
991
+ static RD_INLINE RD_UNUSED void
992
+ rd_kafka_enq_once_add_source(rd_kafka_enq_once_t *eonce, const char *srcdesc) {
993
+ mtx_lock(&eonce->lock);
994
+ eonce->refcnt++;
995
+ mtx_unlock(&eonce->lock);
996
+ }
997
+
998
+
999
+ /**
1000
+ * @brief Decrement refcount for source (non-owner), such as a timer.
1001
+ *
1002
+ * @param srcdesc a human-readable descriptive string of the source.
1003
+ * May be used for future debugging.
1004
+ *
1005
+ * @remark Must only be called from the owner with the owner
1006
+ * still holding its own refcount.
1007
+ * This API is used to undo an add_source() from the
1008
+ * same code.
1009
+ */
1010
+ static RD_INLINE RD_UNUSED void
1011
+ rd_kafka_enq_once_del_source(rd_kafka_enq_once_t *eonce, const char *srcdesc) {
1012
+ int do_destroy;
1013
+
1014
+ mtx_lock(&eonce->lock);
1015
+ rd_assert(eonce->refcnt > 0);
1016
+ eonce->refcnt--;
1017
+ do_destroy = eonce->refcnt == 0;
1018
+ mtx_unlock(&eonce->lock);
1019
+
1020
+ if (do_destroy) {
1021
+ /* We're the last refcount holder, clean up eonce. */
1022
+ rd_kafka_enq_once_destroy0(eonce);
1023
+ }
1024
+ }
1025
+
1026
+ /**
1027
+ * @brief Trigger a source's reference where the eonce resides on
1028
+ * an rd_list_t. This is typically used as a free_cb for
1029
+ * rd_list_destroy() and the trigger error code is
1030
+ * always RD_KAFKA_RESP_ERR__DESTROY.
1031
+ */
1032
+ void rd_kafka_enq_once_trigger_destroy(void *ptr);
1033
+
1034
+
1035
+ /**
1036
+ * @brief Decrement refcount for source (non-owner) and return the rko
1037
+ * if still set.
1038
+ *
1039
+ * @remark Must only be called by sources (non-owner) but only on the
1040
+ * the owner's thread to make sure the rko is not freed.
1041
+ *
1042
+ * @remark The rko remains set on the eonce.
1043
+ */
1044
+ static RD_INLINE RD_UNUSED rd_kafka_op_t *
1045
+ rd_kafka_enq_once_del_source_return(rd_kafka_enq_once_t *eonce,
1046
+ const char *srcdesc) {
1047
+ rd_bool_t do_destroy;
1048
+ rd_kafka_op_t *rko;
1049
+
1050
+ mtx_lock(&eonce->lock);
1051
+
1052
+ rd_assert(eonce->refcnt > 0);
1053
+ /* Owner must still hold a eonce reference, or the eonce must
1054
+ * have been disabled by the owner (no rko) */
1055
+ rd_assert(eonce->refcnt > 1 || !eonce->rko);
1056
+ eonce->refcnt--;
1057
+ do_destroy = eonce->refcnt == 0;
1058
+
1059
+ rko = eonce->rko;
1060
+ mtx_unlock(&eonce->lock);
1061
+
1062
+ if (do_destroy) {
1063
+ /* We're the last refcount holder, clean up eonce. */
1064
+ rd_kafka_enq_once_destroy0(eonce);
1065
+ }
1066
+
1067
+ return rko;
1068
+ }
1069
+
1070
+ /**
1071
+ * @brief Trigger enqueuing of the rko (unless already enqueued)
1072
+ * and drops the source's refcount.
1073
+ *
1074
+ * @remark Must only be called by sources (non-owner).
1075
+ */
1076
+ static RD_INLINE RD_UNUSED void
1077
+ rd_kafka_enq_once_trigger(rd_kafka_enq_once_t *eonce,
1078
+ rd_kafka_resp_err_t err,
1079
+ const char *srcdesc) {
1080
+ int do_destroy;
1081
+ rd_kafka_op_t *rko = NULL;
1082
+ rd_kafka_replyq_t replyq = RD_ZERO_INIT;
1083
+
1084
+ mtx_lock(&eonce->lock);
1085
+
1086
+ rd_assert(eonce->refcnt > 0);
1087
+ eonce->refcnt--;
1088
+ do_destroy = eonce->refcnt == 0;
1089
+
1090
+ if (eonce->rko) {
1091
+ /* Not already enqueued, do it.
1092
+ * Detach the rko and replyq from the eonce and unlock the eonce
1093
+ * before enqueuing rko on reply to avoid recursive locks
1094
+ * if the replyq has been disabled and the ops
1095
+ * destructor is called (which might then access the eonce
1096
+ * to clean up). */
1097
+ rko = eonce->rko;
1098
+ replyq = eonce->replyq;
1099
+
1100
+ eonce->rko = NULL;
1101
+ rd_kafka_replyq_clear(&eonce->replyq);
1102
+
1103
+ /* Reply is enqueued at the end of this function */
1104
+ }
1105
+ mtx_unlock(&eonce->lock);
1106
+
1107
+ if (do_destroy) {
1108
+ /* We're the last refcount holder, clean up eonce. */
1109
+ rd_kafka_enq_once_destroy0(eonce);
1110
+ }
1111
+
1112
+ if (rko) {
1113
+ rko->rko_err = err;
1114
+ rd_kafka_replyq_enq(&replyq, rko, replyq.version);
1115
+ rd_kafka_replyq_destroy(&replyq);
1116
+ }
1117
+ }
1118
+
1119
+ /**
1120
+ * @brief Destroy eonce, must only be called by the owner.
1121
+ * There may be outstanding refcounts by non-owners after this call
1122
+ */
1123
+ static RD_INLINE RD_UNUSED void
1124
+ rd_kafka_enq_once_destroy(rd_kafka_enq_once_t *eonce) {
1125
+ int do_destroy;
1126
+
1127
+ mtx_lock(&eonce->lock);
1128
+ rd_assert(eonce->refcnt > 0);
1129
+ eonce->refcnt--;
1130
+ do_destroy = eonce->refcnt == 0;
1131
+
1132
+ eonce->rko = NULL;
1133
+ rd_kafka_replyq_destroy(&eonce->replyq);
1134
+
1135
+ mtx_unlock(&eonce->lock);
1136
+
1137
+ if (do_destroy) {
1138
+ /* We're the last refcount holder, clean up eonce. */
1139
+ rd_kafka_enq_once_destroy0(eonce);
1140
+ }
1141
+ }
1142
+
1143
+
1144
+ /**
1145
+ * @brief Disable the owner's eonce, extracting, resetting and returning
1146
+ * the \c rko object.
1147
+ *
1148
+ * This is the same as rd_kafka_enq_once_destroy() but returning
1149
+ * the rko.
1150
+ *
1151
+ * Use this for owner-thread triggering where the enqueuing of the
1152
+ * rko on the replyq is not necessary.
1153
+ *
1154
+ * @returns the eonce's rko object, if still available, else NULL.
1155
+ */
1156
+ static RD_INLINE RD_UNUSED rd_kafka_op_t *
1157
+ rd_kafka_enq_once_disable(rd_kafka_enq_once_t *eonce) {
1158
+ int do_destroy;
1159
+ rd_kafka_op_t *rko;
1160
+
1161
+ mtx_lock(&eonce->lock);
1162
+ rd_assert(eonce->refcnt > 0);
1163
+ eonce->refcnt--;
1164
+ do_destroy = eonce->refcnt == 0;
1165
+
1166
+ /* May be NULL */
1167
+ rko = eonce->rko;
1168
+ eonce->rko = NULL;
1169
+ rd_kafka_replyq_destroy(&eonce->replyq);
1170
+
1171
+ mtx_unlock(&eonce->lock);
1172
+
1173
+ if (do_destroy) {
1174
+ /* We're the last refcount holder, clean up eonce. */
1175
+ rd_kafka_enq_once_destroy0(eonce);
1176
+ }
1177
+
1178
+ return rko;
1179
+ }
1180
+
1181
+ /**
1182
+ * @brief Returns true if the queue can contain fetched messages.
1183
+ *
1184
+ * @locks rd_kafka_q_lock(rkq) if do_lock is set.
1185
+ */
1186
+ static RD_INLINE RD_UNUSED rd_bool_t
1187
+ rd_kafka_q_can_contain_fetched_msgs(rd_kafka_q_t *rkq, rd_bool_t do_lock) {
1188
+ rd_bool_t val;
1189
+ if (do_lock)
1190
+ mtx_lock(&rkq->rkq_lock);
1191
+ val = rkq->rkq_flags & RD_KAFKA_Q_F_CONSUMER;
1192
+ if (do_lock)
1193
+ mtx_unlock(&rkq->rkq_lock);
1194
+ return val;
1195
+ }
1196
+
1197
+
1198
+ /**@}*/
1199
+
1200
+
1201
+ #endif /* _RDKAFKA_QUEUE_H_ */