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,990 @@
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
+ /* Undefine the NDEBUG if debugging is enforced by MDBX_DEBUG */
7
+ #if (defined(MDBX_DEBUG) && MDBX_DEBUG > 0) || (defined(MDBX_FORCE_ASSERTIONS) && MDBX_FORCE_ASSERTIONS)
8
+ #undef NDEBUG
9
+ #ifndef MDBX_DEBUG
10
+ /* Чтобы избежать включения отладки только из-за включения assert-проверок */
11
+ #define MDBX_DEBUG 0
12
+ #endif
13
+ #endif
14
+
15
+ /*----------------------------------------------------------------------------*/
16
+
17
+ /** Disables using GNU/Linux libc extensions.
18
+ * \ingroup build_option
19
+ * \note This option couldn't be moved to the options.h since dependent
20
+ * control macros/defined should be prepared before include the options.h */
21
+ #ifndef MDBX_DISABLE_GNU_SOURCE
22
+ #define MDBX_DISABLE_GNU_SOURCE 0
23
+ #endif
24
+ #if MDBX_DISABLE_GNU_SOURCE
25
+ #undef _GNU_SOURCE
26
+ #elif (defined(__linux__) || defined(__gnu_linux__)) && !defined(_GNU_SOURCE)
27
+ #define _GNU_SOURCE
28
+ #endif /* MDBX_DISABLE_GNU_SOURCE */
29
+
30
+ /* Should be defined before any includes */
31
+ #if !defined(_FILE_OFFSET_BITS) && !defined(__ANDROID_API__) && !defined(ANDROID)
32
+ #define _FILE_OFFSET_BITS 64
33
+ #endif /* _FILE_OFFSET_BITS */
34
+
35
+ #if defined(__APPLE__) && !defined(_DARWIN_C_SOURCE)
36
+ #define _DARWIN_C_SOURCE
37
+ #endif /* _DARWIN_C_SOURCE */
38
+
39
+ #if (defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)) && !defined(__USE_MINGW_ANSI_STDIO)
40
+ #define __USE_MINGW_ANSI_STDIO 1
41
+ #endif /* MinGW */
42
+
43
+ #if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS)
44
+
45
+ #ifndef _WIN32_WINNT
46
+ #define _WIN32_WINNT 0x0601 /* Windows 7 */
47
+ #endif /* _WIN32_WINNT */
48
+
49
+ #if !defined(_CRT_SECURE_NO_WARNINGS)
50
+ #define _CRT_SECURE_NO_WARNINGS
51
+ #endif /* _CRT_SECURE_NO_WARNINGS */
52
+ #if !defined(UNICODE)
53
+ #define UNICODE
54
+ #endif /* UNICODE */
55
+
56
+ #if !defined(_NO_CRT_STDIO_INLINE) && MDBX_BUILD_SHARED_LIBRARY && !defined(xMDBX_TOOLS) && MDBX_WITHOUT_MSVC_CRT
57
+ #define _NO_CRT_STDIO_INLINE
58
+ #endif /* _NO_CRT_STDIO_INLINE */
59
+
60
+ #elif !defined(_POSIX_C_SOURCE)
61
+ #define _POSIX_C_SOURCE 200809L
62
+ #endif /* Windows */
63
+
64
+ #ifdef __cplusplus
65
+
66
+ #ifndef NOMINMAX
67
+ #define NOMINMAX
68
+ #endif /* NOMINMAX */
69
+
70
+ /* Workaround for modern libstdc++ with CLANG < 4.x */
71
+ #if defined(__SIZEOF_INT128__) && !defined(__GLIBCXX_TYPE_INT_N_0) && defined(__clang__) && __clang_major__ < 4
72
+ #define __GLIBCXX_BITSIZE_INT_N_0 128
73
+ #define __GLIBCXX_TYPE_INT_N_0 __int128
74
+ #endif /* Workaround for modern libstdc++ with CLANG < 4.x */
75
+
76
+ #ifdef _MSC_VER
77
+ /* Workaround for MSVC' header `extern "C"` vs `std::` redefinition bug */
78
+ #if defined(__SANITIZE_ADDRESS__) && !defined(_DISABLE_VECTOR_ANNOTATION)
79
+ #define _DISABLE_VECTOR_ANNOTATION
80
+ #endif /* _DISABLE_VECTOR_ANNOTATION */
81
+ #endif /* _MSC_VER */
82
+
83
+ #endif /* __cplusplus */
84
+
85
+ #ifdef _MSC_VER
86
+ #if _MSC_FULL_VER < 190024234
87
+ /* Actually libmdbx was not tested with compilers older than 19.00.24234 (Visual
88
+ * Studio 2015 Update 3). But you could remove this #error and try to continue
89
+ * at your own risk. In such case please don't rise up an issues related ONLY to
90
+ * old compilers.
91
+ *
92
+ * NOTE:
93
+ * Unfortunately, there are several different builds of "Visual Studio" that
94
+ * are called "Visual Studio 2015 Update 3".
95
+ *
96
+ * The 190024234 is used here because it is minimal version of Visual Studio
97
+ * that was used for build and testing libmdbx in recent years. Soon this
98
+ * value will be increased to 19.0.24241.7, since build and testing using
99
+ * "Visual Studio 2015" will be performed only at https://ci.appveyor.com.
100
+ *
101
+ * Please ask Microsoft (but not us) for information about version differences
102
+ * and how to and where you can obtain the latest "Visual Studio 2015" build
103
+ * with all fixes.
104
+ */
105
+ #error "At least \"Microsoft C/C++ Compiler\" version 19.00.24234 (Visual Studio 2015 Update 3) is required."
106
+ #endif
107
+ #if _MSC_VER > 1800
108
+ #pragma warning(disable : 4464) /* relative include path contains '..' */
109
+ #endif
110
+ #if _MSC_VER > 1913
111
+ #pragma warning(disable : 5045) /* will insert Spectre mitigation... */
112
+ #endif
113
+ #if _MSC_VER > 1914
114
+ #pragma warning(disable : 5105) /* winbase.h(9531): warning C5105: macro expansion \
115
+ producing 'defined' has undefined behavior */
116
+ #endif
117
+ #if _MSC_VER < 1920
118
+ /* avoid "error C2219: syntax error: type qualifier must be after '*'" */
119
+ #define __restrict
120
+ #endif
121
+ #if _MSC_VER > 1930
122
+ #pragma warning(disable : 6235) /* <expression> is always a constant */
123
+ #pragma warning(disable : 6237) /* <expression> is never evaluated and might \
124
+ have side effects */
125
+ #pragma warning(disable : 5286) /* implicit conversion from enum type 'type 1' to enum type 'type 2' */
126
+ #pragma warning(disable : 5287) /* operands are different enum types 'type 1' and 'type 2' */
127
+ #endif
128
+ #pragma warning(disable : 4710) /* 'xyz': function not inlined */
129
+ #pragma warning(disable : 4711) /* function 'xyz' selected for automatic \
130
+ inline expansion */
131
+ #pragma warning(disable : 4201) /* nonstandard extension used: nameless \
132
+ struct/union */
133
+ #pragma warning(disable : 4702) /* unreachable code */
134
+ #pragma warning(disable : 4706) /* assignment within conditional expression */
135
+ #pragma warning(disable : 4127) /* conditional expression is constant */
136
+ #pragma warning(disable : 4324) /* 'xyz': structure was padded due to \
137
+ alignment specifier */
138
+ #pragma warning(disable : 4310) /* cast truncates constant value */
139
+ #pragma warning(disable : 4820) /* bytes padding added after data member for \
140
+ alignment */
141
+ #pragma warning(disable : 4548) /* expression before comma has no effect; \
142
+ expected expression with side - effect */
143
+ #pragma warning(disable : 4366) /* the result of the unary '&' operator may be \
144
+ unaligned */
145
+ #pragma warning(disable : 4200) /* nonstandard extension used: zero-sized \
146
+ array in struct/union */
147
+ #pragma warning(disable : 4204) /* nonstandard extension used: non-constant \
148
+ aggregate initializer */
149
+ #pragma warning(disable : 4505) /* unreferenced local function has been removed */
150
+ #endif /* _MSC_VER (warnings) */
151
+
152
+ #if defined(__GNUC__) && __GNUC__ < 9
153
+ #pragma GCC diagnostic ignored "-Wattributes"
154
+ #endif /* GCC < 9 */
155
+
156
+ #include "../mdbx.h"
157
+
158
+ /*----------------------------------------------------------------------------*/
159
+ /* Microsoft compiler generates a lot of warning for self includes... */
160
+
161
+ #ifdef _MSC_VER
162
+ #pragma warning(push, 1)
163
+ #pragma warning(disable : 4548) /* expression before comma has no effect; \
164
+ expected expression with side - effect */
165
+ #pragma warning(disable : 4530) /* C++ exception handler used, but unwind \
166
+ * semantics are not enabled. Specify /EHsc */
167
+ #pragma warning(disable : 4577) /* 'noexcept' used with no exception handling \
168
+ * mode specified; termination on exception is \
169
+ * not guaranteed. Specify /EHsc */
170
+ #endif /* _MSC_VER (warnings) */
171
+
172
+ /*----------------------------------------------------------------------------*/
173
+ /* basic C99 includes */
174
+
175
+ #include <inttypes.h>
176
+ #include <stddef.h>
177
+ #include <stdint.h>
178
+ #include <stdlib.h>
179
+
180
+ #include <assert.h>
181
+ #include <ctype.h>
182
+ #include <fcntl.h>
183
+ #include <limits.h>
184
+ #include <stdio.h>
185
+ #include <string.h>
186
+ #include <time.h>
187
+
188
+ /*----------------------------------------------------------------------------*/
189
+ /* feature testing */
190
+
191
+ #ifndef __has_warning
192
+ #define __has_warning(x) (0)
193
+ #endif
194
+
195
+ #ifndef __has_include
196
+ #define __has_include(x) (0)
197
+ #endif
198
+
199
+ #ifndef __has_attribute
200
+ #define __has_attribute(x) (0)
201
+ #endif
202
+
203
+ #ifndef __has_cpp_attribute
204
+ #define __has_cpp_attribute(x) 0
205
+ #endif
206
+
207
+ #ifndef __has_feature
208
+ #define __has_feature(x) (0)
209
+ #endif
210
+
211
+ #ifndef __has_extension
212
+ #define __has_extension(x) (0)
213
+ #endif
214
+
215
+ #ifndef __has_builtin
216
+ #define __has_builtin(x) (0)
217
+ #endif
218
+
219
+ #if __has_feature(thread_sanitizer)
220
+ #define __SANITIZE_THREAD__ 1
221
+ #endif
222
+
223
+ #if __has_feature(address_sanitizer)
224
+ #define __SANITIZE_ADDRESS__ 1
225
+ #endif
226
+
227
+ #ifndef __GNUC_PREREQ
228
+ #if defined(__GNUC__) && defined(__GNUC_MINOR__)
229
+ #define __GNUC_PREREQ(maj, min) ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
230
+ #else
231
+ #define __GNUC_PREREQ(maj, min) (0)
232
+ #endif
233
+ #endif /* __GNUC_PREREQ */
234
+
235
+ #ifndef __CLANG_PREREQ
236
+ #ifdef __clang__
237
+ #define __CLANG_PREREQ(maj, min) ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min))
238
+ #else
239
+ #define __CLANG_PREREQ(maj, min) (0)
240
+ #endif
241
+ #endif /* __CLANG_PREREQ */
242
+
243
+ #ifndef __GLIBC_PREREQ
244
+ #if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
245
+ #define __GLIBC_PREREQ(maj, min) ((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))
246
+ #else
247
+ #define __GLIBC_PREREQ(maj, min) (0)
248
+ #endif
249
+ #endif /* __GLIBC_PREREQ */
250
+
251
+ /*----------------------------------------------------------------------------*/
252
+ /* pre-requirements */
253
+
254
+ #if (-6 & 5) || CHAR_BIT != 8 || UINT_MAX < 0xffffffff || ULONG_MAX % 0xFFFF
255
+ #error "Sanity checking failed: Two's complement, reasonably sized integer types"
256
+ #endif
257
+
258
+ #ifndef SSIZE_MAX
259
+ #define SSIZE_MAX INTPTR_MAX
260
+ #endif
261
+
262
+ #if defined(__GNUC__) && !__GNUC_PREREQ(4, 2)
263
+ /* Actually libmdbx was not tested with compilers older than GCC 4.2.
264
+ * But you could ignore this warning at your own risk.
265
+ * In such case please don't rise up an issues related ONLY to old compilers.
266
+ */
267
+ #warning "libmdbx required GCC >= 4.2"
268
+ #endif
269
+
270
+ #if defined(__clang__) && !__CLANG_PREREQ(3, 8)
271
+ /* Actually libmdbx was not tested with CLANG older than 3.8.
272
+ * But you could ignore this warning at your own risk.
273
+ * In such case please don't rise up an issues related ONLY to old compilers.
274
+ */
275
+ #warning "libmdbx required CLANG >= 3.8"
276
+ #endif
277
+
278
+ #if defined(__GLIBC__) && !__GLIBC_PREREQ(2, 12)
279
+ /* Actually libmdbx was not tested with something older than glibc 2.12.
280
+ * But you could ignore this warning at your own risk.
281
+ * In such case please don't rise up an issues related ONLY to old systems.
282
+ */
283
+ #warning "libmdbx was only tested with GLIBC >= 2.12."
284
+ #endif
285
+
286
+ #ifdef __SANITIZE_THREAD__
287
+ #warning "libmdbx don't compatible with ThreadSanitizer, you will get a lot of false-positive issues."
288
+ #endif /* __SANITIZE_THREAD__ */
289
+
290
+ /*----------------------------------------------------------------------------*/
291
+ /* C11' alignas() */
292
+
293
+ #if __has_include(<stdalign.h>)
294
+ #include <stdalign.h>
295
+ #endif
296
+ #if defined(alignas) || defined(__cplusplus)
297
+ #define MDBX_ALIGNAS(N) alignas(N)
298
+ #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
299
+ #define MDBX_ALIGNAS(N) _Alignas(N)
300
+ #elif defined(_MSC_VER)
301
+ #define MDBX_ALIGNAS(N) __declspec(align(N))
302
+ #elif __has_attribute(__aligned__) || defined(__GNUC__)
303
+ #define MDBX_ALIGNAS(N) __attribute__((__aligned__(N)))
304
+ #else
305
+ #error "FIXME: Required alignas() or equivalent."
306
+ #endif /* MDBX_ALIGNAS */
307
+
308
+ /*----------------------------------------------------------------------------*/
309
+ /* Systems macros and includes */
310
+
311
+ #ifndef __extern_C
312
+ #ifdef __cplusplus
313
+ #define __extern_C extern "C"
314
+ #else
315
+ #define __extern_C
316
+ #endif
317
+ #endif /* __extern_C */
318
+
319
+ #if !defined(nullptr) && !defined(__cplusplus) || (__cplusplus < 201103L && !defined(_MSC_VER))
320
+ #define nullptr NULL
321
+ #endif
322
+
323
+ #if defined(__APPLE__) || defined(_DARWIN_C_SOURCE)
324
+ #include <AvailabilityMacros.h>
325
+ #include <TargetConditionals.h>
326
+ #ifndef MAC_OS_X_VERSION_MIN_REQUIRED
327
+ #define MAC_OS_X_VERSION_MIN_REQUIRED 1070 /* Mac OS X 10.7, 2011 */
328
+ #endif
329
+ #endif /* Apple OSX & iOS */
330
+
331
+ #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__BSD__) || defined(__bsdi__) || \
332
+ defined(__DragonFly__) || defined(__APPLE__) || defined(__MACH__)
333
+ #include <sys/cdefs.h>
334
+ #include <sys/mount.h>
335
+ #include <sys/sysctl.h>
336
+ #include <sys/types.h>
337
+ #if defined(__FreeBSD__) || defined(__DragonFly__)
338
+ #include <vm/vm_param.h>
339
+ #elif defined(__OpenBSD__) || defined(__NetBSD__)
340
+ #include <uvm/uvm_param.h>
341
+ #else
342
+ #define SYSCTL_LEGACY_NONCONST_MIB
343
+ #endif
344
+ #ifndef __MACH__
345
+ #include <sys/vmmeter.h>
346
+ #endif
347
+ #else
348
+ #include <malloc.h>
349
+ #if !(defined(__sun) || defined(__SVR4) || defined(__svr4__) || defined(_WIN32) || defined(_WIN64))
350
+ #include <mntent.h>
351
+ #endif /* !Solaris */
352
+ #endif /* !xBSD */
353
+
354
+ #if defined(__FreeBSD__) || __has_include(<malloc_np.h>)
355
+ #include <malloc_np.h>
356
+ #endif
357
+
358
+ #if defined(__APPLE__) || defined(__MACH__) || __has_include(<malloc/malloc.h>)
359
+ #include <malloc/malloc.h>
360
+ #endif /* MacOS */
361
+
362
+ #if defined(__MACH__)
363
+ #include <mach/host_info.h>
364
+ #include <mach/mach_host.h>
365
+ #include <mach/mach_port.h>
366
+ #include <uuid/uuid.h>
367
+ #endif
368
+
369
+ #if defined(__linux__) || defined(__gnu_linux__)
370
+ #include <sched.h>
371
+ #include <sys/sendfile.h>
372
+ #include <sys/statfs.h>
373
+ #endif /* Linux */
374
+
375
+ #ifndef _XOPEN_SOURCE
376
+ #define _XOPEN_SOURCE 0
377
+ #endif
378
+
379
+ #ifndef _XOPEN_SOURCE_EXTENDED
380
+ #define _XOPEN_SOURCE_EXTENDED 0
381
+ #else
382
+ #include <utmpx.h>
383
+ #endif /* _XOPEN_SOURCE_EXTENDED */
384
+
385
+ #if defined(__sun) || defined(__SVR4) || defined(__svr4__)
386
+ #include <kstat.h>
387
+ #include <sys/mnttab.h>
388
+ /* On Solaris, it's easier to add a missing prototype rather than find a
389
+ * combination of #defines that break nothing. */
390
+ __extern_C key_t ftok(const char *, int);
391
+ #endif /* SunOS/Solaris */
392
+
393
+ #if defined(_WIN32) || defined(_WIN64) /*-------------------------------------*/
394
+
395
+ #ifndef _WIN32_WINNT
396
+ #define _WIN32_WINNT 0x0601 /* Windows 7 */
397
+ #elif _WIN32_WINNT < 0x0500
398
+ #error At least 'Windows 2000' API is required for libmdbx.
399
+ #endif /* _WIN32_WINNT */
400
+ #ifndef WIN32_LEAN_AND_MEAN
401
+ #define WIN32_LEAN_AND_MEAN
402
+ #endif /* WIN32_LEAN_AND_MEAN */
403
+ #include <windows.h>
404
+ #include <winnt.h>
405
+ #include <winternl.h>
406
+
407
+ /* После подгрузки windows.h, чтобы избежать проблем со сборкой MINGW и т.п. */
408
+ #include <excpt.h>
409
+ #include <tlhelp32.h>
410
+
411
+ #else /*----------------------------------------------------------------------*/
412
+
413
+ #include <unistd.h>
414
+ #if !defined(_POSIX_MAPPED_FILES) || _POSIX_MAPPED_FILES < 1
415
+ #error "libmdbx requires the _POSIX_MAPPED_FILES feature"
416
+ #endif /* _POSIX_MAPPED_FILES */
417
+
418
+ #include <pthread.h>
419
+ #include <semaphore.h>
420
+ #include <signal.h>
421
+ #include <sys/file.h>
422
+ #include <sys/ipc.h>
423
+ #include <sys/mman.h>
424
+ #include <sys/param.h>
425
+ #include <sys/resource.h>
426
+ #include <sys/stat.h>
427
+ #include <sys/statvfs.h>
428
+ #include <sys/time.h>
429
+ #include <sys/uio.h>
430
+
431
+ #endif /*---------------------------------------------------------------------*/
432
+
433
+ #if defined(__ANDROID_API__) || defined(ANDROID)
434
+ #include <android/log.h>
435
+ #if __ANDROID_API__ >= 21
436
+ #include <sys/sendfile.h>
437
+ #endif
438
+ #endif /* Android */
439
+
440
+ #if defined(HAVE_SYS_STAT_H) || __has_include(<sys/stat.h>)
441
+ #include <sys/stat.h>
442
+ #endif
443
+ #if defined(HAVE_SYS_TYPES_H) || __has_include(<sys/types.h>)
444
+ #include <sys/types.h>
445
+ #endif
446
+ #if defined(HAVE_SYS_FILE_H) || __has_include(<sys/file.h>)
447
+ #include <sys/file.h>
448
+ #endif
449
+
450
+ /*----------------------------------------------------------------------------*/
451
+ /* Byteorder */
452
+
453
+ #if defined(i386) || defined(__386) || defined(__i386) || defined(__i386__) || defined(i486) || defined(__i486) || \
454
+ defined(__i486__) || defined(i586) || defined(__i586) || defined(__i586__) || defined(i686) || defined(__i686) || \
455
+ defined(__i686__) || defined(_M_IX86) || defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || \
456
+ defined(__INTEL__) || defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(__amd64) || \
457
+ defined(_M_X64) || defined(_M_AMD64) || defined(__IA32__) || defined(__INTEL__)
458
+ #ifndef __ia32__
459
+ /* LY: define neutral __ia32__ for x86 and x86-64 */
460
+ #define __ia32__ 1
461
+ #endif /* __ia32__ */
462
+ #if !defined(__amd64__) && \
463
+ (defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) || defined(_M_AMD64))
464
+ /* LY: define trusty __amd64__ for all AMD64/x86-64 arch */
465
+ #define __amd64__ 1
466
+ #endif /* __amd64__ */
467
+ #endif /* all x86 */
468
+
469
+ #if !defined(__BYTE_ORDER__) || !defined(__ORDER_LITTLE_ENDIAN__) || !defined(__ORDER_BIG_ENDIAN__)
470
+
471
+ #if defined(__GLIBC__) || defined(__GNU_LIBRARY__) || defined(__ANDROID_API__) || defined(HAVE_ENDIAN_H) || \
472
+ __has_include(<endian.h>)
473
+ #include <endian.h>
474
+ #elif defined(__APPLE__) || defined(__MACH__) || defined(__OpenBSD__) || defined(HAVE_MACHINE_ENDIAN_H) || \
475
+ __has_include(<machine/endian.h>)
476
+ #include <machine/endian.h>
477
+ #elif defined(HAVE_SYS_ISA_DEFS_H) || __has_include(<sys/isa_defs.h>)
478
+ #include <sys/isa_defs.h>
479
+ #elif (defined(HAVE_SYS_TYPES_H) && defined(HAVE_SYS_ENDIAN_H)) || \
480
+ (__has_include(<sys/types.h>) && __has_include(<sys/endian.h>))
481
+ #include <sys/endian.h>
482
+ #include <sys/types.h>
483
+ #elif defined(__bsdi__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || \
484
+ defined(HAVE_SYS_PARAM_H) || __has_include(<sys/param.h>)
485
+ #include <sys/param.h>
486
+ #endif /* OS */
487
+
488
+ #if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
489
+ #define __ORDER_LITTLE_ENDIAN__ __LITTLE_ENDIAN
490
+ #define __ORDER_BIG_ENDIAN__ __BIG_ENDIAN
491
+ #define __BYTE_ORDER__ __BYTE_ORDER
492
+ #elif defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
493
+ #define __ORDER_LITTLE_ENDIAN__ _LITTLE_ENDIAN
494
+ #define __ORDER_BIG_ENDIAN__ _BIG_ENDIAN
495
+ #define __BYTE_ORDER__ _BYTE_ORDER
496
+ #else
497
+ #define __ORDER_LITTLE_ENDIAN__ 1234
498
+ #define __ORDER_BIG_ENDIAN__ 4321
499
+
500
+ #if defined(__LITTLE_ENDIAN__) || (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || defined(__ARMEL__) || \
501
+ defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(__MIPSEL__) || defined(_MIPSEL) || defined(__MIPSEL) || \
502
+ defined(_M_ARM) || defined(_M_ARM64) || defined(__e2k__) || defined(__elbrus_4c__) || defined(__elbrus_8c__) || \
503
+ defined(__bfin__) || defined(__BFIN__) || defined(__ia64__) || defined(_IA64) || defined(__IA64__) || \
504
+ defined(__ia64) || defined(_M_IA64) || defined(__itanium__) || defined(__ia32__) || defined(__CYGWIN__) || \
505
+ defined(_WIN64) || defined(_WIN32) || defined(__TOS_WIN__) || defined(__WINDOWS__)
506
+ #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
507
+
508
+ #elif defined(__BIG_ENDIAN__) || (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || defined(__ARMEB__) || \
509
+ defined(__THUMBEB__) || defined(__AARCH64EB__) || defined(__MIPSEB__) || defined(_MIPSEB) || defined(__MIPSEB) || \
510
+ defined(__m68k__) || defined(M68000) || defined(__hppa__) || defined(__hppa) || defined(__HPPA__) || \
511
+ defined(__sparc__) || defined(__sparc) || defined(__370__) || defined(__THW_370__) || defined(__s390__) || \
512
+ defined(__s390x__) || defined(__SYSC_ZARCH__)
513
+ #define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
514
+
515
+ #else
516
+ #error __BYTE_ORDER__ should be defined.
517
+ #endif /* Arch */
518
+
519
+ #endif
520
+ #endif /* __BYTE_ORDER__ || __ORDER_LITTLE_ENDIAN__ || __ORDER_BIG_ENDIAN__ */
521
+
522
+ #if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul || defined(_WIN64)
523
+ #define MDBX_WORDBITS 64
524
+ #else
525
+ #define MDBX_WORDBITS 32
526
+ #endif /* MDBX_WORDBITS */
527
+
528
+ /*----------------------------------------------------------------------------*/
529
+ /* Availability of CMOV or equivalent */
530
+
531
+ #ifndef MDBX_HAVE_CMOV
532
+ #if defined(__e2k__)
533
+ #define MDBX_HAVE_CMOV 1
534
+ #elif defined(__thumb2__) || defined(__thumb2)
535
+ #define MDBX_HAVE_CMOV 1
536
+ #elif defined(__thumb__) || defined(__thumb) || defined(__TARGET_ARCH_THUMB)
537
+ #define MDBX_HAVE_CMOV 0
538
+ #elif defined(_M_ARM) || defined(_M_ARM64) || defined(__aarch64__) || defined(__aarch64) || defined(__arm__) || \
539
+ defined(__arm) || defined(__CC_ARM)
540
+ #define MDBX_HAVE_CMOV 1
541
+ #elif (defined(__riscv__) || defined(__riscv64)) && (defined(__riscv_b) || defined(__riscv_bitmanip))
542
+ #define MDBX_HAVE_CMOV 1
543
+ #elif defined(i686) || defined(__i686) || defined(__i686__) || (defined(_M_IX86) && _M_IX86 > 600) || \
544
+ defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(__amd64) || defined(_M_X64) || \
545
+ defined(_M_AMD64)
546
+ #define MDBX_HAVE_CMOV 1
547
+ #else
548
+ #define MDBX_HAVE_CMOV 0
549
+ #endif
550
+ #endif /* MDBX_HAVE_CMOV */
551
+
552
+ /*----------------------------------------------------------------------------*/
553
+ /* Compiler's includes for builtins/intrinsics */
554
+
555
+ #if defined(_MSC_VER) || defined(__INTEL_COMPILER)
556
+ #include <intrin.h>
557
+ #elif __GNUC_PREREQ(4, 4) || defined(__clang__)
558
+ #if defined(__e2k__)
559
+ #include <e2kintrin.h>
560
+ #include <x86intrin.h>
561
+ #endif /* __e2k__ */
562
+ #if defined(__ia32__)
563
+ #include <cpuid.h>
564
+ #include <x86intrin.h>
565
+ #endif /* __ia32__ */
566
+ #ifdef __ARM_NEON
567
+ #include <arm_neon.h>
568
+ #endif
569
+ #elif defined(__SUNPRO_C) || defined(__sun) || defined(sun)
570
+ #include <mbarrier.h>
571
+ #elif (defined(_HPUX_SOURCE) || defined(__hpux) || defined(__HP_aCC)) && (defined(HP_IA64) || defined(__ia64))
572
+ #include <machine/sys/inline.h>
573
+ #elif defined(__IBMC__) && defined(__powerpc)
574
+ #include <atomic.h>
575
+ #elif defined(_AIX)
576
+ #include <builtins.h>
577
+ #include <sys/atomic_op.h>
578
+ #elif (defined(__osf__) && defined(__DECC)) || defined(__alpha)
579
+ #include <c_asm.h>
580
+ #include <machine/builtins.h>
581
+ #elif defined(__MWERKS__)
582
+ /* CodeWarrior - troubles ? */
583
+ #pragma gcc_extensions
584
+ #elif defined(__SNC__)
585
+ /* Sony PS3 - troubles ? */
586
+ #elif defined(__hppa__) || defined(__hppa)
587
+ #include <machine/inline.h>
588
+ #else
589
+ #error Unsupported C compiler, please use GNU C 4.4 or newer
590
+ #endif /* Compiler */
591
+
592
+ #if !defined(__noop) && !defined(_MSC_VER)
593
+ #define __noop \
594
+ do { \
595
+ } while (0)
596
+ #endif /* __noop */
597
+
598
+ #if defined(__fallthrough) && (defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__))
599
+ #undef __fallthrough
600
+ #endif /* __fallthrough workaround for MinGW */
601
+
602
+ #ifndef __fallthrough
603
+ #if defined(__cplusplus) && (__has_cpp_attribute(fallthrough) && (!defined(__clang__) || __clang__ > 4)) || \
604
+ __cplusplus >= 201703L
605
+ #define __fallthrough [[fallthrough]]
606
+ #elif __GNUC_PREREQ(8, 0) && defined(__cplusplus) && __cplusplus >= 201103L
607
+ #define __fallthrough [[fallthrough]]
608
+ #elif __GNUC_PREREQ(7, 0) && (!defined(__LCC__) || (__LCC__ == 124 && __LCC_MINOR__ >= 12) || \
609
+ (__LCC__ == 125 && __LCC_MINOR__ >= 5) || (__LCC__ >= 126))
610
+ #define __fallthrough __attribute__((__fallthrough__))
611
+ #elif defined(__clang__) && defined(__cplusplus) && __cplusplus >= 201103L && __has_feature(cxx_attributes) && \
612
+ __has_warning("-Wimplicit-fallthrough")
613
+ #define __fallthrough [[clang::fallthrough]]
614
+ #else
615
+ #define __fallthrough
616
+ #endif
617
+ #endif /* __fallthrough */
618
+
619
+ #ifndef __unreachable
620
+ #if __GNUC_PREREQ(4, 5) || __has_builtin(__builtin_unreachable)
621
+ #define __unreachable() __builtin_unreachable()
622
+ #elif defined(_MSC_VER)
623
+ #define __unreachable() __assume(0)
624
+ #else
625
+ #define __unreachable() \
626
+ do { \
627
+ } while (1)
628
+ #endif
629
+ #endif /* __unreachable */
630
+
631
+ #ifndef __prefetch
632
+ #if defined(__GNUC__) || defined(__clang__) || __has_builtin(__builtin_prefetch)
633
+ #define __prefetch(ptr) __builtin_prefetch(ptr)
634
+ #else
635
+ #define __prefetch(ptr) \
636
+ do { \
637
+ (void)(ptr); \
638
+ } while (0)
639
+ #endif
640
+ #endif /* __prefetch */
641
+
642
+ #ifndef offsetof
643
+ #define offsetof(type, member) __builtin_offsetof(type, member)
644
+ #endif /* offsetof */
645
+
646
+ #ifndef container_of
647
+ #define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
648
+ #endif /* container_of */
649
+
650
+ /*----------------------------------------------------------------------------*/
651
+ /* useful attributes */
652
+
653
+ #ifndef __always_inline
654
+ #if defined(__GNUC__) || __has_attribute(__always_inline__)
655
+ #define __always_inline __inline __attribute__((__always_inline__))
656
+ #elif defined(_MSC_VER)
657
+ #define __always_inline __forceinline
658
+ #else
659
+ #define __always_inline __inline
660
+ #endif
661
+ #endif /* __always_inline */
662
+
663
+ #ifndef __noinline
664
+ #if defined(__GNUC__) || __has_attribute(__noinline__)
665
+ #define __noinline __attribute__((__noinline__))
666
+ #elif defined(_MSC_VER)
667
+ #define __noinline __declspec(noinline)
668
+ #else
669
+ #define __noinline
670
+ #endif
671
+ #endif /* __noinline */
672
+
673
+ #ifndef __must_check_result
674
+ #if defined(__GNUC__) || __has_attribute(__warn_unused_result__)
675
+ #define __must_check_result __attribute__((__warn_unused_result__))
676
+ #else
677
+ #define __must_check_result
678
+ #endif
679
+ #endif /* __must_check_result */
680
+
681
+ #ifndef __nothrow
682
+ #if defined(__cplusplus)
683
+ #if __cplusplus < 201703L
684
+ #define __nothrow throw()
685
+ #else
686
+ #define __nothrow noexcept(true)
687
+ #endif /* __cplusplus */
688
+ #elif defined(__GNUC__) || __has_attribute(__nothrow__)
689
+ #define __nothrow __attribute__((__nothrow__))
690
+ #elif defined(_MSC_VER) && defined(__cplusplus)
691
+ #define __nothrow __declspec(nothrow)
692
+ #else
693
+ #define __nothrow
694
+ #endif
695
+ #endif /* __nothrow */
696
+
697
+ #ifndef __hidden
698
+ #if defined(__GNUC__) || __has_attribute(__visibility__)
699
+ #define __hidden __attribute__((__visibility__("hidden")))
700
+ #else
701
+ #define __hidden
702
+ #endif
703
+ #endif /* __hidden */
704
+
705
+ #ifndef __optimize
706
+ #if defined(__OPTIMIZE__)
707
+ #if (defined(__GNUC__) && !defined(__clang__)) || __has_attribute(__optimize__)
708
+ #define __optimize(ops) __attribute__((__optimize__(ops)))
709
+ #else
710
+ #define __optimize(ops)
711
+ #endif
712
+ #else
713
+ #define __optimize(ops)
714
+ #endif
715
+ #endif /* __optimize */
716
+
717
+ #ifndef __hot
718
+ #if defined(__OPTIMIZE__)
719
+ #if defined(__clang__) && !__has_attribute(__hot__) && __has_attribute(__section__) && \
720
+ (defined(__linux__) || defined(__gnu_linux__))
721
+ /* just put frequently used functions in separate section */
722
+ #define __hot __attribute__((__section__("text.hot"))) __optimize("O3")
723
+ #elif defined(__GNUC__) || __has_attribute(__hot__)
724
+ #define __hot __attribute__((__hot__))
725
+ #else
726
+ #define __hot __optimize("O3")
727
+ #endif
728
+ #else
729
+ #define __hot
730
+ #endif
731
+ #endif /* __hot */
732
+
733
+ #ifndef __cold
734
+ #if defined(__OPTIMIZE__)
735
+ #if defined(__clang__) && !__has_attribute(__cold__) && __has_attribute(__section__) && \
736
+ (defined(__linux__) || defined(__gnu_linux__))
737
+ /* just put infrequently used functions in separate section */
738
+ #define __cold __attribute__((__section__("text.unlikely"))) __optimize("Os")
739
+ #elif defined(__GNUC__) || __has_attribute(__cold__)
740
+ #define __cold __attribute__((__cold__))
741
+ #else
742
+ #define __cold __optimize("Os")
743
+ #endif
744
+ #else
745
+ #define __cold
746
+ #endif
747
+ #endif /* __cold */
748
+
749
+ #ifndef __flatten
750
+ #if defined(__OPTIMIZE__) && (defined(__GNUC__) || __has_attribute(__flatten__))
751
+ #define __flatten __attribute__((__flatten__))
752
+ #else
753
+ #define __flatten
754
+ #endif
755
+ #endif /* __flatten */
756
+
757
+ #ifndef likely
758
+ #if (defined(__GNUC__) || __has_builtin(__builtin_expect)) && !defined(__COVERITY__)
759
+ #define likely(cond) __builtin_expect(!!(cond), 1)
760
+ #else
761
+ #define likely(x) (!!(x))
762
+ #endif
763
+ #endif /* likely */
764
+
765
+ #ifndef unlikely
766
+ #if (defined(__GNUC__) || __has_builtin(__builtin_expect)) && !defined(__COVERITY__)
767
+ #define unlikely(cond) __builtin_expect(!!(cond), 0)
768
+ #else
769
+ #define unlikely(x) (!!(x))
770
+ #endif
771
+ #endif /* unlikely */
772
+
773
+ #ifndef __anonymous_struct_extension__
774
+ #if defined(__GNUC__)
775
+ #define __anonymous_struct_extension__ __extension__
776
+ #else
777
+ #define __anonymous_struct_extension__
778
+ #endif
779
+ #endif /* __anonymous_struct_extension__ */
780
+
781
+ #ifndef MDBX_WEAK_IMPORT_ATTRIBUTE
782
+ #ifdef WEAK_IMPORT_ATTRIBUTE
783
+ #define MDBX_WEAK_IMPORT_ATTRIBUTE WEAK_IMPORT_ATTRIBUTE
784
+ #elif __has_attribute(__weak__) && __has_attribute(__weak_import__)
785
+ #define MDBX_WEAK_IMPORT_ATTRIBUTE __attribute__((__weak__, __weak_import__))
786
+ #elif __has_attribute(__weak__) || (defined(__GNUC__) && __GNUC__ >= 4 && defined(__ELF__))
787
+ #define MDBX_WEAK_IMPORT_ATTRIBUTE __attribute__((__weak__))
788
+ #else
789
+ #define MDBX_WEAK_IMPORT_ATTRIBUTE
790
+ #endif
791
+ #endif /* MDBX_WEAK_IMPORT_ATTRIBUTE */
792
+
793
+ #if !defined(__thread) && (defined(_MSC_VER) || defined(__DMC__))
794
+ #define __thread __declspec(thread)
795
+ #endif /* __thread */
796
+
797
+ #ifndef MDBX_EXCLUDE_FOR_GPROF
798
+ #ifdef ENABLE_GPROF
799
+ #define MDBX_EXCLUDE_FOR_GPROF __attribute__((__no_instrument_function__, __no_profile_instrument_function__))
800
+ #else
801
+ #define MDBX_EXCLUDE_FOR_GPROF
802
+ #endif /* ENABLE_GPROF */
803
+ #endif /* MDBX_EXCLUDE_FOR_GPROF */
804
+
805
+ /*----------------------------------------------------------------------------*/
806
+
807
+ #ifndef expect_with_probability
808
+ #if defined(__builtin_expect_with_probability) || __has_builtin(__builtin_expect_with_probability) || \
809
+ __GNUC_PREREQ(9, 0)
810
+ #define expect_with_probability(expr, value, prob) __builtin_expect_with_probability(expr, value, prob)
811
+ #else
812
+ #define expect_with_probability(expr, value, prob) (expr)
813
+ #endif
814
+ #endif /* expect_with_probability */
815
+
816
+ #ifndef MDBX_GOOFY_MSVC_STATIC_ANALYZER
817
+ #ifdef _PREFAST_
818
+ #define MDBX_GOOFY_MSVC_STATIC_ANALYZER 1
819
+ #else
820
+ #define MDBX_GOOFY_MSVC_STATIC_ANALYZER 0
821
+ #endif
822
+ #endif /* MDBX_GOOFY_MSVC_STATIC_ANALYZER */
823
+
824
+ #if MDBX_GOOFY_MSVC_STATIC_ANALYZER || (defined(_MSC_VER) && _MSC_VER > 1919)
825
+ #define MDBX_ANALYSIS_ASSUME(expr) __analysis_assume(expr)
826
+ #ifdef _PREFAST_
827
+ #define MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(warn_id) __pragma(prefast(suppress : warn_id))
828
+ #else
829
+ #define MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(warn_id) __pragma(warning(suppress : warn_id))
830
+ #endif
831
+ #else
832
+ #define MDBX_ANALYSIS_ASSUME(expr) assert(expr)
833
+ #define MDBX_SUPPRESS_GOOFY_MSVC_ANALYZER(warn_id)
834
+ #endif /* MDBX_GOOFY_MSVC_STATIC_ANALYZER */
835
+
836
+ #ifndef FLEXIBLE_ARRAY_MEMBERS
837
+ #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (!defined(__cplusplus) && defined(_MSC_VER))
838
+ #define FLEXIBLE_ARRAY_MEMBERS 1
839
+ #else
840
+ #define FLEXIBLE_ARRAY_MEMBERS 0
841
+ #endif
842
+ #endif /* FLEXIBLE_ARRAY_MEMBERS */
843
+
844
+ /*----------------------------------------------------------------------------*/
845
+ /* Valgrind and Address Sanitizer */
846
+
847
+ #if defined(ENABLE_MEMCHECK)
848
+ #include <valgrind/memcheck.h>
849
+ #ifndef VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE
850
+ /* LY: available since Valgrind 3.10 */
851
+ #define VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(a, s)
852
+ #define VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(a, s)
853
+ #endif
854
+ #elif !defined(RUNNING_ON_VALGRIND)
855
+ #define VALGRIND_CREATE_MEMPOOL(h, r, z)
856
+ #define VALGRIND_DESTROY_MEMPOOL(h)
857
+ #define VALGRIND_MEMPOOL_TRIM(h, a, s)
858
+ #define VALGRIND_MEMPOOL_ALLOC(h, a, s)
859
+ #define VALGRIND_MEMPOOL_FREE(h, a)
860
+ #define VALGRIND_MEMPOOL_CHANGE(h, a, b, s)
861
+ #define VALGRIND_MAKE_MEM_NOACCESS(a, s)
862
+ #define VALGRIND_MAKE_MEM_DEFINED(a, s)
863
+ #define VALGRIND_MAKE_MEM_UNDEFINED(a, s)
864
+ #define VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(a, s)
865
+ #define VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(a, s)
866
+ #define VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a, s) (0)
867
+ #define VALGRIND_CHECK_MEM_IS_DEFINED(a, s) (0)
868
+ #define RUNNING_ON_VALGRIND (0)
869
+ #endif /* ENABLE_MEMCHECK */
870
+
871
+ #ifdef __SANITIZE_ADDRESS__
872
+ #include <sanitizer/asan_interface.h>
873
+ #elif !defined(ASAN_POISON_MEMORY_REGION)
874
+ #define ASAN_POISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
875
+ #define ASAN_UNPOISON_MEMORY_REGION(addr, size) ((void)(addr), (void)(size))
876
+ #endif /* __SANITIZE_ADDRESS__ */
877
+
878
+ /*----------------------------------------------------------------------------*/
879
+
880
+ #ifndef ARRAY_LENGTH
881
+ #ifdef __cplusplus
882
+ template <typename T, size_t N> char (&__ArraySizeHelper(T (&array)[N]))[N];
883
+ #define ARRAY_LENGTH(array) (sizeof(::__ArraySizeHelper(array)))
884
+ #else
885
+ #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0]))
886
+ #endif
887
+ #endif /* ARRAY_LENGTH */
888
+
889
+ #ifndef ARRAY_END
890
+ #define ARRAY_END(array) (&array[ARRAY_LENGTH(array)])
891
+ #endif /* ARRAY_END */
892
+
893
+ #define CONCAT(a, b) a##b
894
+ #define XCONCAT(a, b) CONCAT(a, b)
895
+
896
+ #define MDBX_TETRAD(a, b, c, d) ((uint32_t)(a) << 24 | (uint32_t)(b) << 16 | (uint32_t)(c) << 8 | (d))
897
+
898
+ #define MDBX_STRING_TETRAD(str) MDBX_TETRAD(str[0], str[1], str[2], str[3])
899
+
900
+ #define FIXME "FIXME: " __FILE__ ", " MDBX_STRINGIFY(__LINE__)
901
+
902
+ #ifndef STATIC_ASSERT_MSG
903
+ #if defined(static_assert)
904
+ #define STATIC_ASSERT_MSG(expr, msg) static_assert(expr, msg)
905
+ #elif defined(_STATIC_ASSERT)
906
+ #define STATIC_ASSERT_MSG(expr, msg) _STATIC_ASSERT(expr)
907
+ #elif defined(_MSC_VER)
908
+ #include <crtdbg.h>
909
+ #define STATIC_ASSERT_MSG(expr, msg) _STATIC_ASSERT(expr)
910
+ #elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __has_feature(c_static_assert)
911
+ #define STATIC_ASSERT_MSG(expr, msg) _Static_assert(expr, msg)
912
+ #else
913
+ #define STATIC_ASSERT_MSG(expr, msg) \
914
+ switch (0) { \
915
+ case 0: \
916
+ case (expr):; \
917
+ }
918
+ #endif
919
+ #endif /* STATIC_ASSERT */
920
+
921
+ #ifndef STATIC_ASSERT
922
+ #define STATIC_ASSERT(expr) STATIC_ASSERT_MSG(expr, #expr)
923
+ #endif
924
+
925
+ /*----------------------------------------------------------------------------*/
926
+
927
+ #if defined(_MSC_VER) && _MSC_VER >= 1900
928
+ /* LY: MSVC 2015/2017/2019 has buggy/inconsistent PRIuPTR/PRIxPTR macros
929
+ * for internal format-args checker. */
930
+ #undef PRIuPTR
931
+ #undef PRIiPTR
932
+ #undef PRIdPTR
933
+ #undef PRIxPTR
934
+ #define PRIuPTR "Iu"
935
+ #define PRIiPTR "Ii"
936
+ #define PRIdPTR "Id"
937
+ #define PRIxPTR "Ix"
938
+ #define PRIuSIZE "zu"
939
+ #define PRIiSIZE "zi"
940
+ #define PRIdSIZE "zd"
941
+ #define PRIxSIZE "zx"
942
+ #endif /* fix PRI*PTR for _MSC_VER */
943
+
944
+ #ifndef PRIuSIZE
945
+ #define PRIuSIZE PRIuPTR
946
+ #define PRIiSIZE PRIiPTR
947
+ #define PRIdSIZE PRIdPTR
948
+ #define PRIxSIZE PRIxPTR
949
+ #endif /* PRI*SIZE macros for MSVC */
950
+
951
+ #ifdef _MSC_VER
952
+ #pragma warning(pop)
953
+ #endif
954
+
955
+ /*----------------------------------------------------------------------------*/
956
+
957
+ #if __has_warning("-Wnested-anon-types")
958
+ #if defined(__clang__)
959
+ #pragma clang diagnostic ignored "-Wnested-anon-types"
960
+ #elif defined(__GNUC__)
961
+ #pragma GCC diagnostic ignored "-Wnested-anon-types"
962
+ #else
963
+ #pragma warning disable "nested-anon-types"
964
+ #endif
965
+ #endif /* -Wnested-anon-types */
966
+
967
+ #if __has_warning("-Wconstant-logical-operand")
968
+ #if defined(__clang__)
969
+ #pragma clang diagnostic ignored "-Wconstant-logical-operand"
970
+ #elif defined(__GNUC__)
971
+ #pragma GCC diagnostic ignored "-Wconstant-logical-operand"
972
+ #else
973
+ #pragma warning disable "constant-logical-operand"
974
+ #endif
975
+ #endif /* -Wconstant-logical-operand */
976
+
977
+ #if defined(__LCC__) && (__LCC__ <= 121)
978
+ /* bug #2798 */
979
+ #pragma diag_suppress alignment_reduction_ignored
980
+ #elif defined(__ICC)
981
+ #pragma warning(disable : 3453 1366)
982
+ #elif __has_warning("-Walignment-reduction-ignored")
983
+ #if defined(__clang__)
984
+ #pragma clang diagnostic ignored "-Walignment-reduction-ignored"
985
+ #elif defined(__GNUC__)
986
+ #pragma GCC diagnostic ignored "-Walignment-reduction-ignored"
987
+ #else
988
+ #pragma warning disable "alignment-reduction-ignored"
989
+ #endif
990
+ #endif /* -Walignment-reduction-ignored */