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.
- package/.github/workflows/ci.yml +32 -0
- package/.github/workflows/publish.yml +27 -0
- package/.gitmodules +3 -0
- package/CMakeLists.txt +53 -0
- package/LICENSE +201 -0
- package/README.md +639 -0
- package/build.js +11 -0
- package/deps/libmdbx/.clang-format +3 -0
- package/deps/libmdbx/.cmake-format.yaml +3 -0
- package/deps/libmdbx/.le.ini +40 -0
- package/deps/libmdbx/CMakeLists.txt +1269 -0
- package/deps/libmdbx/COPYRIGHT +159 -0
- package/deps/libmdbx/ChangeLog.md +2786 -0
- package/deps/libmdbx/GNUmakefile +950 -0
- package/deps/libmdbx/LICENSE +177 -0
- package/deps/libmdbx/Makefile +16 -0
- package/deps/libmdbx/NOTICE +39 -0
- package/deps/libmdbx/README.md +863 -0
- package/deps/libmdbx/TODO.md +43 -0
- package/deps/libmdbx/cmake/compiler.cmake +1221 -0
- package/deps/libmdbx/cmake/profile.cmake +58 -0
- package/deps/libmdbx/cmake/utils.cmake +524 -0
- package/deps/libmdbx/conanfile.py +323 -0
- package/deps/libmdbx/docs/Doxyfile.in +2734 -0
- package/deps/libmdbx/docs/_preface.md +47 -0
- package/deps/libmdbx/docs/_restrictions.md +248 -0
- package/deps/libmdbx/docs/_starting.md +245 -0
- package/deps/libmdbx/docs/_toc.md +34 -0
- package/deps/libmdbx/docs/header.html +96 -0
- package/deps/libmdbx/example/CMakeLists.txt +6 -0
- package/deps/libmdbx/example/README.md +1 -0
- package/deps/libmdbx/example/example-mdbx.c +154 -0
- package/deps/libmdbx/example/sample-bdb.txt +77 -0
- package/deps/libmdbx/mdbx.h +6655 -0
- package/deps/libmdbx/mdbx.h++ +6428 -0
- package/deps/libmdbx/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +173 -0
- package/deps/libmdbx/src/alloy.c +54 -0
- package/deps/libmdbx/src/api-cold.c +543 -0
- package/deps/libmdbx/src/api-copy.c +912 -0
- package/deps/libmdbx/src/api-cursor.c +754 -0
- package/deps/libmdbx/src/api-dbi.c +315 -0
- package/deps/libmdbx/src/api-env.c +1434 -0
- package/deps/libmdbx/src/api-extra.c +165 -0
- package/deps/libmdbx/src/api-key-transform.c +197 -0
- package/deps/libmdbx/src/api-misc.c +286 -0
- package/deps/libmdbx/src/api-opts.c +575 -0
- package/deps/libmdbx/src/api-range-estimate.c +365 -0
- package/deps/libmdbx/src/api-txn-data.c +454 -0
- package/deps/libmdbx/src/api-txn.c +921 -0
- package/deps/libmdbx/src/atomics-ops.h +364 -0
- package/deps/libmdbx/src/atomics-types.h +97 -0
- package/deps/libmdbx/src/audit.c +109 -0
- package/deps/libmdbx/src/bits.md +34 -0
- package/deps/libmdbx/src/chk.c +1796 -0
- package/deps/libmdbx/src/cogs.c +309 -0
- package/deps/libmdbx/src/cogs.h +506 -0
- package/deps/libmdbx/src/coherency.c +170 -0
- package/deps/libmdbx/src/config.h.in +88 -0
- package/deps/libmdbx/src/cursor.c +2396 -0
- package/deps/libmdbx/src/cursor.h +391 -0
- package/deps/libmdbx/src/dbi.c +717 -0
- package/deps/libmdbx/src/dbi.h +142 -0
- package/deps/libmdbx/src/debug_begin.h +36 -0
- package/deps/libmdbx/src/debug_end.h +15 -0
- package/deps/libmdbx/src/dpl.c +486 -0
- package/deps/libmdbx/src/dpl.h +134 -0
- package/deps/libmdbx/src/dxb.c +1335 -0
- package/deps/libmdbx/src/env.c +607 -0
- package/deps/libmdbx/src/essentials.h +125 -0
- package/deps/libmdbx/src/gc-get.c +1345 -0
- package/deps/libmdbx/src/gc-put.c +970 -0
- package/deps/libmdbx/src/gc.h +40 -0
- package/deps/libmdbx/src/global.c +474 -0
- package/deps/libmdbx/src/internals.h +585 -0
- package/deps/libmdbx/src/layout-dxb.h +288 -0
- package/deps/libmdbx/src/layout-lck.h +289 -0
- package/deps/libmdbx/src/lck-posix.c +859 -0
- package/deps/libmdbx/src/lck-windows.c +607 -0
- package/deps/libmdbx/src/lck.c +174 -0
- package/deps/libmdbx/src/lck.h +110 -0
- package/deps/libmdbx/src/logging_and_debug.c +250 -0
- package/deps/libmdbx/src/logging_and_debug.h +159 -0
- package/deps/libmdbx/src/man1/mdbx_chk.1 +106 -0
- package/deps/libmdbx/src/man1/mdbx_copy.1 +95 -0
- package/deps/libmdbx/src/man1/mdbx_drop.1 +48 -0
- package/deps/libmdbx/src/man1/mdbx_dump.1 +101 -0
- package/deps/libmdbx/src/man1/mdbx_load.1 +105 -0
- package/deps/libmdbx/src/man1/mdbx_stat.1 +86 -0
- package/deps/libmdbx/src/mdbx.c++ +1837 -0
- package/deps/libmdbx/src/meta.c +656 -0
- package/deps/libmdbx/src/meta.h +168 -0
- package/deps/libmdbx/src/mvcc-readers.c +414 -0
- package/deps/libmdbx/src/node.c +365 -0
- package/deps/libmdbx/src/node.h +102 -0
- package/deps/libmdbx/src/ntdll.def +1246 -0
- package/deps/libmdbx/src/options.h +534 -0
- package/deps/libmdbx/src/osal.c +3485 -0
- package/deps/libmdbx/src/osal.h +587 -0
- package/deps/libmdbx/src/page-get.c +483 -0
- package/deps/libmdbx/src/page-iov.c +185 -0
- package/deps/libmdbx/src/page-iov.h +34 -0
- package/deps/libmdbx/src/page-ops.c +744 -0
- package/deps/libmdbx/src/page-ops.h +142 -0
- package/deps/libmdbx/src/pnl.c +236 -0
- package/deps/libmdbx/src/pnl.h +146 -0
- package/deps/libmdbx/src/preface.h +990 -0
- package/deps/libmdbx/src/proto.h +105 -0
- package/deps/libmdbx/src/refund.c +212 -0
- package/deps/libmdbx/src/sort.h +484 -0
- package/deps/libmdbx/src/spill.c +431 -0
- package/deps/libmdbx/src/spill.h +74 -0
- package/deps/libmdbx/src/table.c +107 -0
- package/deps/libmdbx/src/tls.c +551 -0
- package/deps/libmdbx/src/tls.h +43 -0
- package/deps/libmdbx/src/tools/chk.c +673 -0
- package/deps/libmdbx/src/tools/copy.c +166 -0
- package/deps/libmdbx/src/tools/drop.c +199 -0
- package/deps/libmdbx/src/tools/dump.c +515 -0
- package/deps/libmdbx/src/tools/load.c +831 -0
- package/deps/libmdbx/src/tools/stat.c +516 -0
- package/deps/libmdbx/src/tools/wingetopt.c +87 -0
- package/deps/libmdbx/src/tools/wingetopt.h +30 -0
- package/deps/libmdbx/src/tree-ops.c +1554 -0
- package/deps/libmdbx/src/tree-search.c +140 -0
- package/deps/libmdbx/src/txl.c +99 -0
- package/deps/libmdbx/src/txl.h +26 -0
- package/deps/libmdbx/src/txn.c +1083 -0
- package/deps/libmdbx/src/unaligned.h +205 -0
- package/deps/libmdbx/src/utils.c +32 -0
- package/deps/libmdbx/src/utils.h +76 -0
- package/deps/libmdbx/src/version.c.in +44 -0
- package/deps/libmdbx/src/walk.c +290 -0
- package/deps/libmdbx/src/walk.h +20 -0
- package/deps/libmdbx/src/windows-import.c +152 -0
- package/deps/libmdbx/src/windows-import.h +128 -0
- package/deps/libmdbx/test/CMakeLists.txt +317 -0
- package/deps/libmdbx/test/append.c++ +237 -0
- package/deps/libmdbx/test/base.h++ +92 -0
- package/deps/libmdbx/test/battery-tmux.sh +64 -0
- package/deps/libmdbx/test/cases.c++ +118 -0
- package/deps/libmdbx/test/chrono.c++ +134 -0
- package/deps/libmdbx/test/chrono.h++ +85 -0
- package/deps/libmdbx/test/config.c++ +643 -0
- package/deps/libmdbx/test/config.h++ +334 -0
- package/deps/libmdbx/test/copy.c++ +62 -0
- package/deps/libmdbx/test/dead.c++ +39 -0
- package/deps/libmdbx/test/dump-load.sh +40 -0
- package/deps/libmdbx/test/extra/crunched_delete.c++ +409 -0
- package/deps/libmdbx/test/extra/cursor_closing.c++ +410 -0
- package/deps/libmdbx/test/extra/dbi.c++ +229 -0
- package/deps/libmdbx/test/extra/doubtless_positioning.c++ +253 -0
- package/deps/libmdbx/test/extra/dupfix_addodd.c +94 -0
- package/deps/libmdbx/test/extra/dupfix_multiple.c++ +311 -0
- package/deps/libmdbx/test/extra/early_close_dbi.c++ +137 -0
- package/deps/libmdbx/test/extra/hex_base64_base58.c++ +118 -0
- package/deps/libmdbx/test/extra/maindb_ordinal.c++ +61 -0
- package/deps/libmdbx/test/extra/open.c++ +96 -0
- package/deps/libmdbx/test/extra/pcrf/README.md +2 -0
- package/deps/libmdbx/test/extra/pcrf/pcrf_test.c +380 -0
- package/deps/libmdbx/test/extra/probe.c++ +10 -0
- package/deps/libmdbx/test/extra/txn.c++ +407 -0
- package/deps/libmdbx/test/extra/upsert_alldups.c +193 -0
- package/deps/libmdbx/test/fork.c++ +263 -0
- package/deps/libmdbx/test/hill.c++ +447 -0
- package/deps/libmdbx/test/jitter.c++ +197 -0
- package/deps/libmdbx/test/keygen.c++ +393 -0
- package/deps/libmdbx/test/keygen.h++ +130 -0
- package/deps/libmdbx/test/log.c++ +358 -0
- package/deps/libmdbx/test/log.h++ +91 -0
- package/deps/libmdbx/test/main.c++ +706 -0
- package/deps/libmdbx/test/nested.c++ +318 -0
- package/deps/libmdbx/test/osal-unix.c++ +647 -0
- package/deps/libmdbx/test/osal-windows.c++ +440 -0
- package/deps/libmdbx/test/osal.h++ +41 -0
- package/deps/libmdbx/test/stochastic.sh +690 -0
- package/deps/libmdbx/test/stub/LICENSE +24 -0
- package/deps/libmdbx/test/stub/README.md +8 -0
- package/deps/libmdbx/test/stub/pthread_barrier.c +104 -0
- package/deps/libmdbx/test/stub/pthread_barrier.h +77 -0
- package/deps/libmdbx/test/test.c++ +1551 -0
- package/deps/libmdbx/test/test.h++ +298 -0
- package/deps/libmdbx/test/tmux.conf +3 -0
- package/deps/libmdbx/test/try.c++ +30 -0
- package/deps/libmdbx/test/ttl.c++ +240 -0
- package/deps/libmdbx/test/utils.c++ +203 -0
- package/deps/libmdbx/test/utils.h++ +326 -0
- package/deps/libmdbx/test/valgrind_suppress.txt +536 -0
- package/lib/mdbx_evn_async.js +211 -0
- package/lib/mdbx_worker.js +195 -0
- package/lib/nativemou.js +6 -0
- package/package.json +38 -0
- package/src/async/envmou_close.cpp +34 -0
- package/src/async/envmou_close.hpp +32 -0
- package/src/async/envmou_copy_to.cpp +29 -0
- package/src/async/envmou_copy_to.hpp +38 -0
- package/src/async/envmou_keys.cpp +201 -0
- package/src/async/envmou_keys.hpp +50 -0
- package/src/async/envmou_open.cpp +38 -0
- package/src/async/envmou_open.hpp +33 -0
- package/src/async/envmou_query.cpp +167 -0
- package/src/async/envmou_query.hpp +53 -0
- package/src/dbimou.cpp +522 -0
- package/src/dbimou.hpp +82 -0
- package/src/env_arg0.hpp +24 -0
- package/src/envmou.cpp +445 -0
- package/src/envmou.hpp +116 -0
- package/src/modulemou.cpp +113 -0
- package/src/querymou.cpp +177 -0
- package/src/querymou.hpp +93 -0
- package/src/txnmou.cpp +254 -0
- package/src/txnmou.hpp +122 -0
- package/src/typemou.hpp +239 -0
- package/src/valuemou.hpp +194 -0
- package/test/async.js +67 -0
- package/test/e3.js +38 -0
- package/test/e4.js +89 -0
- package/test/e5.js +162 -0
- package/test/test-batch-ops.js +243 -0
- package/test/test-cursor-mode.js +84 -0
- 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 */
|