mdbxmou 0.1.26

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 (220) hide show
  1. package/.github/workflows/ci.yml +32 -0
  2. package/.github/workflows/publish.yml +27 -0
  3. package/.gitmodules +3 -0
  4. package/CMakeLists.txt +53 -0
  5. package/LICENSE +201 -0
  6. package/README.md +639 -0
  7. package/build.js +11 -0
  8. package/deps/libmdbx/.clang-format +3 -0
  9. package/deps/libmdbx/.cmake-format.yaml +3 -0
  10. package/deps/libmdbx/.le.ini +40 -0
  11. package/deps/libmdbx/CMakeLists.txt +1269 -0
  12. package/deps/libmdbx/COPYRIGHT +159 -0
  13. package/deps/libmdbx/ChangeLog.md +2786 -0
  14. package/deps/libmdbx/GNUmakefile +950 -0
  15. package/deps/libmdbx/LICENSE +177 -0
  16. package/deps/libmdbx/Makefile +16 -0
  17. package/deps/libmdbx/NOTICE +39 -0
  18. package/deps/libmdbx/README.md +863 -0
  19. package/deps/libmdbx/TODO.md +43 -0
  20. package/deps/libmdbx/cmake/compiler.cmake +1221 -0
  21. package/deps/libmdbx/cmake/profile.cmake +58 -0
  22. package/deps/libmdbx/cmake/utils.cmake +524 -0
  23. package/deps/libmdbx/conanfile.py +323 -0
  24. package/deps/libmdbx/docs/Doxyfile.in +2734 -0
  25. package/deps/libmdbx/docs/_preface.md +47 -0
  26. package/deps/libmdbx/docs/_restrictions.md +248 -0
  27. package/deps/libmdbx/docs/_starting.md +245 -0
  28. package/deps/libmdbx/docs/_toc.md +34 -0
  29. package/deps/libmdbx/docs/header.html +96 -0
  30. package/deps/libmdbx/example/CMakeLists.txt +6 -0
  31. package/deps/libmdbx/example/README.md +1 -0
  32. package/deps/libmdbx/example/example-mdbx.c +154 -0
  33. package/deps/libmdbx/example/sample-bdb.txt +77 -0
  34. package/deps/libmdbx/mdbx.h +6655 -0
  35. package/deps/libmdbx/mdbx.h++ +6428 -0
  36. package/deps/libmdbx/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +173 -0
  37. package/deps/libmdbx/src/alloy.c +54 -0
  38. package/deps/libmdbx/src/api-cold.c +543 -0
  39. package/deps/libmdbx/src/api-copy.c +912 -0
  40. package/deps/libmdbx/src/api-cursor.c +754 -0
  41. package/deps/libmdbx/src/api-dbi.c +315 -0
  42. package/deps/libmdbx/src/api-env.c +1434 -0
  43. package/deps/libmdbx/src/api-extra.c +165 -0
  44. package/deps/libmdbx/src/api-key-transform.c +197 -0
  45. package/deps/libmdbx/src/api-misc.c +286 -0
  46. package/deps/libmdbx/src/api-opts.c +575 -0
  47. package/deps/libmdbx/src/api-range-estimate.c +365 -0
  48. package/deps/libmdbx/src/api-txn-data.c +454 -0
  49. package/deps/libmdbx/src/api-txn.c +921 -0
  50. package/deps/libmdbx/src/atomics-ops.h +364 -0
  51. package/deps/libmdbx/src/atomics-types.h +97 -0
  52. package/deps/libmdbx/src/audit.c +109 -0
  53. package/deps/libmdbx/src/bits.md +34 -0
  54. package/deps/libmdbx/src/chk.c +1796 -0
  55. package/deps/libmdbx/src/cogs.c +309 -0
  56. package/deps/libmdbx/src/cogs.h +506 -0
  57. package/deps/libmdbx/src/coherency.c +170 -0
  58. package/deps/libmdbx/src/config.h.in +88 -0
  59. package/deps/libmdbx/src/cursor.c +2396 -0
  60. package/deps/libmdbx/src/cursor.h +391 -0
  61. package/deps/libmdbx/src/dbi.c +717 -0
  62. package/deps/libmdbx/src/dbi.h +142 -0
  63. package/deps/libmdbx/src/debug_begin.h +36 -0
  64. package/deps/libmdbx/src/debug_end.h +15 -0
  65. package/deps/libmdbx/src/dpl.c +486 -0
  66. package/deps/libmdbx/src/dpl.h +134 -0
  67. package/deps/libmdbx/src/dxb.c +1335 -0
  68. package/deps/libmdbx/src/env.c +607 -0
  69. package/deps/libmdbx/src/essentials.h +125 -0
  70. package/deps/libmdbx/src/gc-get.c +1345 -0
  71. package/deps/libmdbx/src/gc-put.c +970 -0
  72. package/deps/libmdbx/src/gc.h +40 -0
  73. package/deps/libmdbx/src/global.c +474 -0
  74. package/deps/libmdbx/src/internals.h +585 -0
  75. package/deps/libmdbx/src/layout-dxb.h +288 -0
  76. package/deps/libmdbx/src/layout-lck.h +289 -0
  77. package/deps/libmdbx/src/lck-posix.c +859 -0
  78. package/deps/libmdbx/src/lck-windows.c +607 -0
  79. package/deps/libmdbx/src/lck.c +174 -0
  80. package/deps/libmdbx/src/lck.h +110 -0
  81. package/deps/libmdbx/src/logging_and_debug.c +250 -0
  82. package/deps/libmdbx/src/logging_and_debug.h +159 -0
  83. package/deps/libmdbx/src/man1/mdbx_chk.1 +106 -0
  84. package/deps/libmdbx/src/man1/mdbx_copy.1 +95 -0
  85. package/deps/libmdbx/src/man1/mdbx_drop.1 +48 -0
  86. package/deps/libmdbx/src/man1/mdbx_dump.1 +101 -0
  87. package/deps/libmdbx/src/man1/mdbx_load.1 +105 -0
  88. package/deps/libmdbx/src/man1/mdbx_stat.1 +86 -0
  89. package/deps/libmdbx/src/mdbx.c++ +1837 -0
  90. package/deps/libmdbx/src/meta.c +656 -0
  91. package/deps/libmdbx/src/meta.h +168 -0
  92. package/deps/libmdbx/src/mvcc-readers.c +414 -0
  93. package/deps/libmdbx/src/node.c +365 -0
  94. package/deps/libmdbx/src/node.h +102 -0
  95. package/deps/libmdbx/src/ntdll.def +1246 -0
  96. package/deps/libmdbx/src/options.h +534 -0
  97. package/deps/libmdbx/src/osal.c +3485 -0
  98. package/deps/libmdbx/src/osal.h +587 -0
  99. package/deps/libmdbx/src/page-get.c +483 -0
  100. package/deps/libmdbx/src/page-iov.c +185 -0
  101. package/deps/libmdbx/src/page-iov.h +34 -0
  102. package/deps/libmdbx/src/page-ops.c +744 -0
  103. package/deps/libmdbx/src/page-ops.h +142 -0
  104. package/deps/libmdbx/src/pnl.c +236 -0
  105. package/deps/libmdbx/src/pnl.h +146 -0
  106. package/deps/libmdbx/src/preface.h +990 -0
  107. package/deps/libmdbx/src/proto.h +105 -0
  108. package/deps/libmdbx/src/refund.c +212 -0
  109. package/deps/libmdbx/src/sort.h +484 -0
  110. package/deps/libmdbx/src/spill.c +431 -0
  111. package/deps/libmdbx/src/spill.h +74 -0
  112. package/deps/libmdbx/src/table.c +107 -0
  113. package/deps/libmdbx/src/tls.c +551 -0
  114. package/deps/libmdbx/src/tls.h +43 -0
  115. package/deps/libmdbx/src/tools/chk.c +673 -0
  116. package/deps/libmdbx/src/tools/copy.c +166 -0
  117. package/deps/libmdbx/src/tools/drop.c +199 -0
  118. package/deps/libmdbx/src/tools/dump.c +515 -0
  119. package/deps/libmdbx/src/tools/load.c +831 -0
  120. package/deps/libmdbx/src/tools/stat.c +516 -0
  121. package/deps/libmdbx/src/tools/wingetopt.c +87 -0
  122. package/deps/libmdbx/src/tools/wingetopt.h +30 -0
  123. package/deps/libmdbx/src/tree-ops.c +1554 -0
  124. package/deps/libmdbx/src/tree-search.c +140 -0
  125. package/deps/libmdbx/src/txl.c +99 -0
  126. package/deps/libmdbx/src/txl.h +26 -0
  127. package/deps/libmdbx/src/txn.c +1083 -0
  128. package/deps/libmdbx/src/unaligned.h +205 -0
  129. package/deps/libmdbx/src/utils.c +32 -0
  130. package/deps/libmdbx/src/utils.h +76 -0
  131. package/deps/libmdbx/src/version.c.in +44 -0
  132. package/deps/libmdbx/src/walk.c +290 -0
  133. package/deps/libmdbx/src/walk.h +20 -0
  134. package/deps/libmdbx/src/windows-import.c +152 -0
  135. package/deps/libmdbx/src/windows-import.h +128 -0
  136. package/deps/libmdbx/test/CMakeLists.txt +317 -0
  137. package/deps/libmdbx/test/append.c++ +237 -0
  138. package/deps/libmdbx/test/base.h++ +92 -0
  139. package/deps/libmdbx/test/battery-tmux.sh +64 -0
  140. package/deps/libmdbx/test/cases.c++ +118 -0
  141. package/deps/libmdbx/test/chrono.c++ +134 -0
  142. package/deps/libmdbx/test/chrono.h++ +85 -0
  143. package/deps/libmdbx/test/config.c++ +643 -0
  144. package/deps/libmdbx/test/config.h++ +334 -0
  145. package/deps/libmdbx/test/copy.c++ +62 -0
  146. package/deps/libmdbx/test/dead.c++ +39 -0
  147. package/deps/libmdbx/test/dump-load.sh +40 -0
  148. package/deps/libmdbx/test/extra/crunched_delete.c++ +409 -0
  149. package/deps/libmdbx/test/extra/cursor_closing.c++ +410 -0
  150. package/deps/libmdbx/test/extra/dbi.c++ +229 -0
  151. package/deps/libmdbx/test/extra/doubtless_positioning.c++ +253 -0
  152. package/deps/libmdbx/test/extra/dupfix_addodd.c +94 -0
  153. package/deps/libmdbx/test/extra/dupfix_multiple.c++ +311 -0
  154. package/deps/libmdbx/test/extra/early_close_dbi.c++ +137 -0
  155. package/deps/libmdbx/test/extra/hex_base64_base58.c++ +118 -0
  156. package/deps/libmdbx/test/extra/maindb_ordinal.c++ +61 -0
  157. package/deps/libmdbx/test/extra/open.c++ +96 -0
  158. package/deps/libmdbx/test/extra/pcrf/README.md +2 -0
  159. package/deps/libmdbx/test/extra/pcrf/pcrf_test.c +380 -0
  160. package/deps/libmdbx/test/extra/probe.c++ +10 -0
  161. package/deps/libmdbx/test/extra/txn.c++ +407 -0
  162. package/deps/libmdbx/test/extra/upsert_alldups.c +193 -0
  163. package/deps/libmdbx/test/fork.c++ +263 -0
  164. package/deps/libmdbx/test/hill.c++ +447 -0
  165. package/deps/libmdbx/test/jitter.c++ +197 -0
  166. package/deps/libmdbx/test/keygen.c++ +393 -0
  167. package/deps/libmdbx/test/keygen.h++ +130 -0
  168. package/deps/libmdbx/test/log.c++ +358 -0
  169. package/deps/libmdbx/test/log.h++ +91 -0
  170. package/deps/libmdbx/test/main.c++ +706 -0
  171. package/deps/libmdbx/test/nested.c++ +318 -0
  172. package/deps/libmdbx/test/osal-unix.c++ +647 -0
  173. package/deps/libmdbx/test/osal-windows.c++ +440 -0
  174. package/deps/libmdbx/test/osal.h++ +41 -0
  175. package/deps/libmdbx/test/stochastic.sh +690 -0
  176. package/deps/libmdbx/test/stub/LICENSE +24 -0
  177. package/deps/libmdbx/test/stub/README.md +8 -0
  178. package/deps/libmdbx/test/stub/pthread_barrier.c +104 -0
  179. package/deps/libmdbx/test/stub/pthread_barrier.h +77 -0
  180. package/deps/libmdbx/test/test.c++ +1551 -0
  181. package/deps/libmdbx/test/test.h++ +298 -0
  182. package/deps/libmdbx/test/tmux.conf +3 -0
  183. package/deps/libmdbx/test/try.c++ +30 -0
  184. package/deps/libmdbx/test/ttl.c++ +240 -0
  185. package/deps/libmdbx/test/utils.c++ +203 -0
  186. package/deps/libmdbx/test/utils.h++ +326 -0
  187. package/deps/libmdbx/test/valgrind_suppress.txt +536 -0
  188. package/lib/mdbx_evn_async.js +211 -0
  189. package/lib/mdbx_worker.js +195 -0
  190. package/lib/nativemou.js +6 -0
  191. package/package.json +38 -0
  192. package/src/async/envmou_close.cpp +34 -0
  193. package/src/async/envmou_close.hpp +32 -0
  194. package/src/async/envmou_copy_to.cpp +29 -0
  195. package/src/async/envmou_copy_to.hpp +38 -0
  196. package/src/async/envmou_keys.cpp +201 -0
  197. package/src/async/envmou_keys.hpp +50 -0
  198. package/src/async/envmou_open.cpp +38 -0
  199. package/src/async/envmou_open.hpp +33 -0
  200. package/src/async/envmou_query.cpp +167 -0
  201. package/src/async/envmou_query.hpp +53 -0
  202. package/src/dbimou.cpp +522 -0
  203. package/src/dbimou.hpp +82 -0
  204. package/src/env_arg0.hpp +24 -0
  205. package/src/envmou.cpp +445 -0
  206. package/src/envmou.hpp +116 -0
  207. package/src/modulemou.cpp +113 -0
  208. package/src/querymou.cpp +177 -0
  209. package/src/querymou.hpp +93 -0
  210. package/src/txnmou.cpp +254 -0
  211. package/src/txnmou.hpp +122 -0
  212. package/src/typemou.hpp +239 -0
  213. package/src/valuemou.hpp +194 -0
  214. package/test/async.js +67 -0
  215. package/test/e3.js +38 -0
  216. package/test/e4.js +89 -0
  217. package/test/e5.js +162 -0
  218. package/test/test-batch-ops.js +243 -0
  219. package/test/test-cursor-mode.js +84 -0
  220. package/test/test-multi-mode.js +87 -0
@@ -0,0 +1,40 @@
1
+ /// \copyright SPDX-License-Identifier: Apache-2.0
2
+ /// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2025
3
+
4
+ #pragma once
5
+
6
+ #include "essentials.h"
7
+
8
+ typedef struct gc_update_context {
9
+ unsigned loop;
10
+ pgno_t prev_first_unallocated;
11
+ bool dense;
12
+ size_t reserve_adj;
13
+ size_t retired_stored;
14
+ size_t amount, reserved, cleaned_slot, reused_slot, fill_idx;
15
+ txnid_t cleaned_id, rid;
16
+ #if MDBX_ENABLE_BIGFOOT
17
+ txnid_t bigfoot;
18
+ #endif /* MDBX_ENABLE_BIGFOOT */
19
+ union {
20
+ MDBX_cursor cursor;
21
+ cursor_couple_t couple;
22
+ };
23
+ } gcu_t;
24
+
25
+ static inline int gc_update_init(MDBX_txn *txn, gcu_t *ctx) {
26
+ memset(ctx, 0, offsetof(gcu_t, cursor));
27
+ ctx->dense = txn->txnid <= MIN_TXNID;
28
+ #if MDBX_ENABLE_BIGFOOT
29
+ ctx->bigfoot = txn->txnid;
30
+ #endif /* MDBX_ENABLE_BIGFOOT */
31
+ return cursor_init(&ctx->cursor, txn, FREE_DBI);
32
+ }
33
+
34
+ #define ALLOC_DEFAULT 0
35
+ #define ALLOC_RESERVE 1
36
+ #define ALLOC_UNIMPORTANT 2
37
+ MDBX_INTERNAL pgr_t gc_alloc_ex(const MDBX_cursor *const mc, const size_t num, uint8_t flags);
38
+
39
+ MDBX_INTERNAL pgr_t gc_alloc_single(const MDBX_cursor *const mc);
40
+ MDBX_INTERNAL int gc_update(MDBX_txn *txn, gcu_t *ctx);
@@ -0,0 +1,474 @@
1
+ /// \copyright SPDX-License-Identifier: Apache-2.0
2
+ /// \author Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru> \date 2015-2025
3
+
4
+ #include "internals.h"
5
+
6
+ static void mdbx_init(void);
7
+ static void mdbx_fini(void);
8
+
9
+ /*----------------------------------------------------------------------------*/
10
+ /* mdbx constructor/destructor */
11
+
12
+ #if defined(_WIN32) || defined(_WIN64)
13
+
14
+ #if MDBX_BUILD_SHARED_LIBRARY
15
+ #if MDBX_WITHOUT_MSVC_CRT && defined(NDEBUG)
16
+ /* DEBUG/CHECKED builds still require MSVC's CRT for runtime checks.
17
+ *
18
+ * Define dll's entry point only for Release build when NDEBUG is defined and
19
+ * MDBX_WITHOUT_MSVC_CRT=ON. if the entry point isn't defined then MSVC's will
20
+ * automatically use DllMainCRTStartup() from CRT library, which also
21
+ * automatically call DllMain() from our mdbx.dll */
22
+ #pragma comment(linker, "/ENTRY:DllMain")
23
+ #endif /* MDBX_WITHOUT_MSVC_CRT */
24
+
25
+ BOOL APIENTRY DllMain(HANDLE module, DWORD reason, LPVOID reserved)
26
+ #else
27
+ #if !MDBX_MANUAL_MODULE_HANDLER
28
+ static
29
+ #endif /* !MDBX_MANUAL_MODULE_HANDLER */
30
+ void NTAPI
31
+ mdbx_module_handler(PVOID module, DWORD reason, PVOID reserved)
32
+ #endif /* MDBX_BUILD_SHARED_LIBRARY */
33
+ {
34
+ (void)reserved;
35
+ switch (reason) {
36
+ case DLL_PROCESS_ATTACH:
37
+ windows_import();
38
+ mdbx_init();
39
+ break;
40
+ case DLL_PROCESS_DETACH:
41
+ mdbx_fini();
42
+ break;
43
+
44
+ case DLL_THREAD_ATTACH:
45
+ break;
46
+ case DLL_THREAD_DETACH:
47
+ rthc_thread_dtor(module);
48
+ break;
49
+ }
50
+ #if MDBX_BUILD_SHARED_LIBRARY
51
+ return TRUE;
52
+ #endif
53
+ }
54
+
55
+ #if !MDBX_BUILD_SHARED_LIBRARY && !MDBX_MANUAL_MODULE_HANDLER
56
+ /* *INDENT-OFF* */
57
+ /* clang-format off */
58
+ #if defined(_MSC_VER)
59
+ # pragma const_seg(push)
60
+ # pragma data_seg(push)
61
+
62
+ # ifndef _M_IX86
63
+ /* kick a linker to create the TLS directory if not already done */
64
+ # pragma comment(linker, "/INCLUDE:_tls_used")
65
+ /* Force some symbol references. */
66
+ # pragma comment(linker, "/INCLUDE:mdbx_tls_anchor")
67
+ /* specific const-segment for WIN64 */
68
+ # pragma const_seg(".CRT$XLB")
69
+ const
70
+ # else
71
+ /* kick a linker to create the TLS directory if not already done */
72
+ # pragma comment(linker, "/INCLUDE:__tls_used")
73
+ /* Force some symbol references. */
74
+ # pragma comment(linker, "/INCLUDE:_mdbx_tls_anchor")
75
+ /* specific data-segment for WIN32 */
76
+ # pragma data_seg(".CRT$XLB")
77
+ # endif
78
+
79
+ __declspec(allocate(".CRT$XLB")) PIMAGE_TLS_CALLBACK mdbx_tls_anchor = mdbx_module_handler;
80
+ # pragma data_seg(pop)
81
+ # pragma const_seg(pop)
82
+
83
+ #elif defined(__GNUC__)
84
+ # ifndef _M_IX86
85
+ const
86
+ # endif
87
+ PIMAGE_TLS_CALLBACK mdbx_tls_anchor __attribute__((__section__(".CRT$XLB"), used)) = mdbx_module_handler;
88
+ #else
89
+ # error FIXME
90
+ #endif
91
+ /* *INDENT-ON* */
92
+ /* clang-format on */
93
+ #endif /* !MDBX_BUILD_SHARED_LIBRARY && !MDBX_MANUAL_MODULE_HANDLER */
94
+
95
+ #else
96
+
97
+ #if defined(__linux__) || defined(__gnu_linux__)
98
+ #include <sys/utsname.h>
99
+
100
+ MDBX_EXCLUDE_FOR_GPROF
101
+ __cold static uint8_t probe_for_WSL(const char *tag) {
102
+ const char *const WSL = strstr(tag, "WSL");
103
+ if (WSL && WSL[3] >= '2' && WSL[3] <= '9')
104
+ return WSL[3] - '0';
105
+ const char *const wsl = strstr(tag, "wsl");
106
+ if (wsl && wsl[3] >= '2' && wsl[3] <= '9')
107
+ return wsl[3] - '0';
108
+ if (WSL || wsl || strcasestr(tag, "Microsoft"))
109
+ /* Expecting no new kernel within WSL1, either it will explicitly
110
+ * marked by an appropriate WSL-version hint. */
111
+ return (globals.linux_kernel_version < /* 4.19.x */ 0x04130000) ? 1 : 2;
112
+ return 0;
113
+ }
114
+ #endif /* Linux */
115
+
116
+ #ifdef ENABLE_GPROF
117
+ extern void _mcleanup(void);
118
+ extern void monstartup(unsigned long, unsigned long);
119
+ extern void _init(void);
120
+ extern void _fini(void);
121
+ extern void __gmon_start__(void) __attribute__((__weak__));
122
+ #endif /* ENABLE_GPROF */
123
+
124
+ MDBX_EXCLUDE_FOR_GPROF
125
+ __cold static __attribute__((__constructor__)) void mdbx_global_constructor(void) {
126
+ #ifdef ENABLE_GPROF
127
+ if (!&__gmon_start__)
128
+ monstartup((uintptr_t)&_init, (uintptr_t)&_fini);
129
+ #endif /* ENABLE_GPROF */
130
+
131
+ #if defined(__linux__) || defined(__gnu_linux__)
132
+ struct utsname buffer;
133
+ if (uname(&buffer) == 0) {
134
+ int i = 0;
135
+ char *p = buffer.release;
136
+ while (*p && i < 4) {
137
+ if (*p >= '0' && *p <= '9') {
138
+ long number = strtol(p, &p, 10);
139
+ if (number > 0) {
140
+ if (number > 255)
141
+ number = 255;
142
+ globals.linux_kernel_version += number << (24 - i * 8);
143
+ }
144
+ ++i;
145
+ } else {
146
+ ++p;
147
+ }
148
+ }
149
+ /* "Official" way of detecting WSL1 but not WSL2
150
+ * https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364
151
+ *
152
+ * WARNING: False negative detection of WSL1 will result in DATA LOSS!
153
+ * So, the REQUIREMENTS for this code:
154
+ * 1. MUST detect WSL1 without false-negatives.
155
+ * 2. DESIRABLE detect WSL2 but without the risk of violating the first. */
156
+ globals.running_on_WSL1 =
157
+ probe_for_WSL(buffer.version) == 1 || probe_for_WSL(buffer.sysname) == 1 || probe_for_WSL(buffer.release) == 1;
158
+ }
159
+ #endif /* Linux */
160
+
161
+ mdbx_init();
162
+ }
163
+
164
+ MDBX_EXCLUDE_FOR_GPROF
165
+ __cold static __attribute__((__destructor__)) void mdbx_global_destructor(void) {
166
+ mdbx_fini();
167
+ #ifdef ENABLE_GPROF
168
+ if (!&__gmon_start__)
169
+ _mcleanup();
170
+ #endif /* ENABLE_GPROF */
171
+ }
172
+
173
+ #endif /* ! Windows */
174
+
175
+ /******************************************************************************/
176
+
177
+ struct libmdbx_globals globals;
178
+
179
+ __cold static void mdbx_init(void) {
180
+ globals.runtime_flags = ((MDBX_DEBUG) > 0) * MDBX_DBG_ASSERT + ((MDBX_DEBUG) > 1) * MDBX_DBG_AUDIT;
181
+ globals.loglevel = MDBX_LOG_FATAL;
182
+ ENSURE(nullptr, osal_fastmutex_init(&globals.debug_lock) == 0);
183
+ osal_ctor();
184
+ assert(globals.sys_pagesize > 0 && (globals.sys_pagesize & (globals.sys_pagesize - 1)) == 0);
185
+ rthc_ctor();
186
+ #if MDBX_DEBUG
187
+ ENSURE(nullptr, troika_verify_fsm());
188
+ ENSURE(nullptr, pv2pages_verify());
189
+ #endif /* MDBX_DEBUG*/
190
+ }
191
+
192
+ MDBX_EXCLUDE_FOR_GPROF
193
+ __cold static void mdbx_fini(void) {
194
+ const uint32_t current_pid = osal_getpid();
195
+ TRACE(">> pid %d", current_pid);
196
+ rthc_dtor(current_pid);
197
+ osal_dtor();
198
+ TRACE("<< pid %d\n", current_pid);
199
+ ENSURE(nullptr, osal_fastmutex_destroy(&globals.debug_lock) == 0);
200
+ }
201
+
202
+ /******************************************************************************/
203
+
204
+ /* *INDENT-OFF* */
205
+ /* clang-format off */
206
+
207
+ __dll_export
208
+ #ifdef __attribute_used__
209
+ __attribute_used__
210
+ #elif defined(__GNUC__) || __has_attribute(__used__)
211
+ __attribute__((__used__))
212
+ #endif
213
+ #ifdef __attribute_externally_visible__
214
+ __attribute_externally_visible__
215
+ #elif (defined(__GNUC__) && !defined(__clang__)) || \
216
+ __has_attribute(__externally_visible__)
217
+ __attribute__((__externally_visible__))
218
+ #endif
219
+ const struct MDBX_build_info mdbx_build = {
220
+ #ifdef MDBX_BUILD_TIMESTAMP
221
+ MDBX_BUILD_TIMESTAMP
222
+ #else
223
+ "\"" __DATE__ " " __TIME__ "\""
224
+ #endif /* MDBX_BUILD_TIMESTAMP */
225
+
226
+ ,
227
+ #ifdef MDBX_BUILD_TARGET
228
+ MDBX_BUILD_TARGET
229
+ #else
230
+ #if defined(__ANDROID_API__)
231
+ "Android" MDBX_STRINGIFY(__ANDROID_API__)
232
+ #elif defined(__linux__) || defined(__gnu_linux__)
233
+ "Linux"
234
+ #elif defined(EMSCRIPTEN) || defined(__EMSCRIPTEN__)
235
+ "webassembly"
236
+ #elif defined(__CYGWIN__)
237
+ "CYGWIN"
238
+ #elif defined(_WIN64) || defined(_WIN32) || defined(__TOS_WIN__) \
239
+ || defined(__WINDOWS__)
240
+ "Windows"
241
+ #elif defined(__APPLE__)
242
+ #if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) \
243
+ || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR)
244
+ "iOS"
245
+ #else
246
+ "MacOS"
247
+ #endif
248
+ #elif defined(__FreeBSD__)
249
+ "FreeBSD"
250
+ #elif defined(__DragonFly__)
251
+ "DragonFlyBSD"
252
+ #elif defined(__NetBSD__)
253
+ "NetBSD"
254
+ #elif defined(__OpenBSD__)
255
+ "OpenBSD"
256
+ #elif defined(__bsdi__)
257
+ "UnixBSDI"
258
+ #elif defined(__MACH__)
259
+ "MACH"
260
+ #elif (defined(_HPUX_SOURCE) || defined(__hpux) || defined(__HP_aCC))
261
+ "HPUX"
262
+ #elif defined(_AIX)
263
+ "AIX"
264
+ #elif defined(__sun) && defined(__SVR4)
265
+ "Solaris"
266
+ #elif defined(__BSD__) || defined(BSD)
267
+ "UnixBSD"
268
+ #elif defined(__unix__) || defined(UNIX) || defined(__unix) \
269
+ || defined(__UNIX) || defined(__UNIX__)
270
+ "UNIX"
271
+ #elif defined(_POSIX_VERSION)
272
+ "POSIX" MDBX_STRINGIFY(_POSIX_VERSION)
273
+ #else
274
+ "UnknownOS"
275
+ #endif /* Target OS */
276
+
277
+ "-"
278
+
279
+ #if defined(__amd64__)
280
+ "AMD64"
281
+ #elif defined(__ia32__)
282
+ "IA32"
283
+ #elif defined(__e2k__) || defined(__elbrus__)
284
+ "Elbrus"
285
+ #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)
286
+ "Alpha"
287
+ #elif defined(__aarch64__) || defined(_M_ARM64)
288
+ "ARM64"
289
+ #elif defined(__arm__) || defined(__thumb__) || defined(__TARGET_ARCH_ARM) \
290
+ || defined(__TARGET_ARCH_THUMB) || defined(_ARM) || defined(_M_ARM) \
291
+ || defined(_M_ARMT) || defined(__arm)
292
+ "ARM"
293
+ #elif defined(__mips64) || defined(__mips64__) || (defined(__mips) && (__mips >= 64))
294
+ "MIPS64"
295
+ #elif defined(__mips__) || defined(__mips) || defined(_R4000) || defined(__MIPS__)
296
+ "MIPS"
297
+ #elif defined(__hppa64__) || defined(__HPPA64__) || defined(__hppa64)
298
+ "PARISC64"
299
+ #elif defined(__hppa__) || defined(__HPPA__) || defined(__hppa)
300
+ "PARISC"
301
+ #elif defined(__ia64__) || defined(__ia64) || defined(_IA64) \
302
+ || defined(__IA64__) || defined(_M_IA64) || defined(__itanium__)
303
+ "Itanium"
304
+ #elif defined(__powerpc64__) || defined(__ppc64__) || defined(__ppc64) \
305
+ || defined(__powerpc64) || defined(_ARCH_PPC64)
306
+ "PowerPC64"
307
+ #elif defined(__powerpc__) || defined(__ppc__) || defined(__powerpc) \
308
+ || defined(__ppc) || defined(_ARCH_PPC) || defined(__PPC__) || defined(__POWERPC__)
309
+ "PowerPC"
310
+ #elif defined(__sparc64__) || defined(__sparc64)
311
+ "SPARC64"
312
+ #elif defined(__sparc__) || defined(__sparc)
313
+ "SPARC"
314
+ #elif defined(__s390__) || defined(__s390) || defined(__zarch__) || defined(__zarch)
315
+ "S390"
316
+ #else
317
+ "UnknownARCH"
318
+ #endif
319
+ #endif /* MDBX_BUILD_TARGET */
320
+
321
+ #ifdef MDBX_BUILD_TYPE
322
+ # if defined(_MSC_VER)
323
+ # pragma message("Configuration-depended MDBX_BUILD_TYPE: " MDBX_BUILD_TYPE)
324
+ # endif
325
+ "-" MDBX_BUILD_TYPE
326
+ #endif /* MDBX_BUILD_TYPE */
327
+ ,
328
+ "MDBX_DEBUG=" MDBX_STRINGIFY(MDBX_DEBUG)
329
+ #ifdef ENABLE_GPROF
330
+ " ENABLE_GPROF"
331
+ #endif /* ENABLE_GPROF */
332
+ " MDBX_WORDBITS=" MDBX_STRINGIFY(MDBX_WORDBITS)
333
+ " BYTE_ORDER="
334
+ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
335
+ "LITTLE_ENDIAN"
336
+ #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
337
+ "BIG_ENDIAN"
338
+ #else
339
+ #error "FIXME: Unsupported byte order"
340
+ #endif /* __BYTE_ORDER__ */
341
+ " MDBX_ENABLE_BIGFOOT=" MDBX_STRINGIFY(MDBX_ENABLE_BIGFOOT)
342
+ " MDBX_ENV_CHECKPID=" MDBX_ENV_CHECKPID_CONFIG
343
+ " MDBX_TXN_CHECKOWNER=" MDBX_TXN_CHECKOWNER_CONFIG
344
+ " MDBX_64BIT_ATOMIC=" MDBX_64BIT_ATOMIC_CONFIG
345
+ " MDBX_64BIT_CAS=" MDBX_64BIT_CAS_CONFIG
346
+ " MDBX_TRUST_RTC=" MDBX_TRUST_RTC_CONFIG
347
+ " MDBX_AVOID_MSYNC=" MDBX_STRINGIFY(MDBX_AVOID_MSYNC)
348
+ " MDBX_ENABLE_REFUND=" MDBX_STRINGIFY(MDBX_ENABLE_REFUND)
349
+ " MDBX_USE_MINCORE=" MDBX_STRINGIFY(MDBX_USE_MINCORE)
350
+ " MDBX_ENABLE_PGOP_STAT=" MDBX_STRINGIFY(MDBX_ENABLE_PGOP_STAT)
351
+ " MDBX_ENABLE_PROFGC=" MDBX_STRINGIFY(MDBX_ENABLE_PROFGC)
352
+ #if MDBX_DISABLE_VALIDATION
353
+ " MDBX_DISABLE_VALIDATION=YES"
354
+ #endif /* MDBX_DISABLE_VALIDATION */
355
+ #ifdef __SANITIZE_ADDRESS__
356
+ " SANITIZE_ADDRESS=YES"
357
+ #endif /* __SANITIZE_ADDRESS__ */
358
+ #ifdef ENABLE_MEMCHECK
359
+ " ENABLE_MEMCHECK=YES"
360
+ #endif /* ENABLE_MEMCHECK */
361
+ #if MDBX_FORCE_ASSERTIONS
362
+ " MDBX_FORCE_ASSERTIONS=YES"
363
+ #endif /* MDBX_FORCE_ASSERTIONS */
364
+ #ifdef _GNU_SOURCE
365
+ " _GNU_SOURCE=YES"
366
+ #else
367
+ " _GNU_SOURCE=NO"
368
+ #endif /* _GNU_SOURCE */
369
+ #ifdef __APPLE__
370
+ " MDBX_APPLE_SPEED_INSTEADOF_DURABILITY=" MDBX_STRINGIFY(MDBX_APPLE_SPEED_INSTEADOF_DURABILITY)
371
+ #endif /* MacOS */
372
+ #if defined(_WIN32) || defined(_WIN64)
373
+ " MDBX_WITHOUT_MSVC_CRT=" MDBX_STRINGIFY(MDBX_WITHOUT_MSVC_CRT)
374
+ " MDBX_BUILD_SHARED_LIBRARY=" MDBX_STRINGIFY(MDBX_BUILD_SHARED_LIBRARY)
375
+ #if !MDBX_BUILD_SHARED_LIBRARY
376
+ " MDBX_MANUAL_MODULE_HANDLER=" MDBX_STRINGIFY(MDBX_MANUAL_MODULE_HANDLER)
377
+ #endif
378
+ " WINVER=" MDBX_STRINGIFY(WINVER)
379
+ #else /* Windows */
380
+ " MDBX_LOCKING=" MDBX_LOCKING_CONFIG
381
+ " MDBX_USE_OFDLOCKS=" MDBX_USE_OFDLOCKS_CONFIG
382
+ #endif /* !Windows */
383
+ " MDBX_CACHELINE_SIZE=" MDBX_STRINGIFY(MDBX_CACHELINE_SIZE)
384
+ " MDBX_CPU_WRITEBACK_INCOHERENT=" MDBX_STRINGIFY(MDBX_CPU_WRITEBACK_INCOHERENT)
385
+ " MDBX_MMAP_INCOHERENT_CPU_CACHE=" MDBX_STRINGIFY(MDBX_MMAP_INCOHERENT_CPU_CACHE)
386
+ " MDBX_MMAP_INCOHERENT_FILE_WRITE=" MDBX_STRINGIFY(MDBX_MMAP_INCOHERENT_FILE_WRITE)
387
+ " MDBX_UNALIGNED_OK=" MDBX_STRINGIFY(MDBX_UNALIGNED_OK)
388
+ " MDBX_PNL_ASCENDING=" MDBX_STRINGIFY(MDBX_PNL_ASCENDING)
389
+ ,
390
+ #ifdef MDBX_BUILD_COMPILER
391
+ MDBX_BUILD_COMPILER
392
+ #else
393
+ #ifdef __INTEL_COMPILER
394
+ "Intel C/C++ " MDBX_STRINGIFY(__INTEL_COMPILER)
395
+ #elif defined(__apple_build_version__)
396
+ "Apple clang " MDBX_STRINGIFY(__apple_build_version__)
397
+ #elif defined(__ibmxl__)
398
+ "IBM clang C " MDBX_STRINGIFY(__ibmxl_version__) "." MDBX_STRINGIFY(__ibmxl_release__)
399
+ "." MDBX_STRINGIFY(__ibmxl_modification__) "." MDBX_STRINGIFY(__ibmxl_ptf_fix_level__)
400
+ #elif defined(__clang__)
401
+ "clang " MDBX_STRINGIFY(__clang_version__)
402
+ #elif defined(__MINGW64__)
403
+ "MINGW-64 " MDBX_STRINGIFY(__MINGW64_MAJOR_VERSION) "." MDBX_STRINGIFY(__MINGW64_MINOR_VERSION)
404
+ #elif defined(__MINGW32__)
405
+ "MINGW-32 " MDBX_STRINGIFY(__MINGW32_MAJOR_VERSION) "." MDBX_STRINGIFY(__MINGW32_MINOR_VERSION)
406
+ #elif defined(__MINGW__)
407
+ "MINGW " MDBX_STRINGIFY(__MINGW_MAJOR_VERSION) "." MDBX_STRINGIFY(__MINGW_MINOR_VERSION)
408
+ #elif defined(__IBMC__)
409
+ "IBM C " MDBX_STRINGIFY(__IBMC__)
410
+ #elif defined(__GNUC__)
411
+ "GNU C/C++ "
412
+ #ifdef __VERSION__
413
+ __VERSION__
414
+ #else
415
+ MDBX_STRINGIFY(__GNUC__) "." MDBX_STRINGIFY(__GNUC_MINOR__) "." MDBX_STRINGIFY(__GNUC_PATCHLEVEL__)
416
+ #endif
417
+ #elif defined(_MSC_VER)
418
+ "MSVC " MDBX_STRINGIFY(_MSC_FULL_VER) "-" MDBX_STRINGIFY(_MSC_BUILD)
419
+ #else
420
+ "Unknown compiler"
421
+ #endif
422
+ #endif /* MDBX_BUILD_COMPILER */
423
+ ,
424
+ #ifdef MDBX_BUILD_FLAGS_CONFIG
425
+ MDBX_BUILD_FLAGS_CONFIG
426
+ #endif /* MDBX_BUILD_FLAGS_CONFIG */
427
+ #if defined(MDBX_BUILD_FLAGS_CONFIG) && defined(MDBX_BUILD_FLAGS)
428
+ " "
429
+ #endif
430
+ #ifdef MDBX_BUILD_FLAGS
431
+ MDBX_BUILD_FLAGS
432
+ #endif /* MDBX_BUILD_FLAGS */
433
+ #if !(defined(MDBX_BUILD_FLAGS_CONFIG) || defined(MDBX_BUILD_FLAGS))
434
+ "undefined (please use correct build script)"
435
+ #ifdef _MSC_VER
436
+ #pragma message("warning: Build flags undefined. Please use correct build script")
437
+ #else
438
+ #warning "Build flags undefined. Please use correct build script"
439
+ #endif // _MSC_VER
440
+ #endif
441
+ , MDBX_BUILD_METADATA
442
+ };
443
+
444
+ #ifdef __SANITIZE_ADDRESS__
445
+ #if !defined(_MSC_VER) || __has_attribute(weak)
446
+ LIBMDBX_API __attribute__((__weak__))
447
+ #endif
448
+ const char *__asan_default_options(void) {
449
+ return "symbolize=1:allow_addr2line=1:"
450
+ #if MDBX_DEBUG
451
+ "debug=1:"
452
+ "verbosity=2:"
453
+ #endif /* MDBX_DEBUG */
454
+ "log_threads=1:"
455
+ "report_globals=1:"
456
+ "replace_str=1:replace_intrin=1:"
457
+ "malloc_context_size=9:"
458
+ #if !defined(__APPLE__)
459
+ "detect_leaks=1:"
460
+ #endif
461
+ "check_printf=1:"
462
+ "detect_deadlocks=1:"
463
+ #ifndef LTO_ENABLED
464
+ "check_initialization_order=1:"
465
+ #endif
466
+ "detect_stack_use_after_return=1:"
467
+ "intercept_tls_get_addr=1:"
468
+ "decorate_proc_maps=1:"
469
+ "abort_on_error=1";
470
+ }
471
+ #endif /* __SANITIZE_ADDRESS__ */
472
+
473
+ /* *INDENT-ON* */
474
+ /* clang-format on */