summaryrefslogtreecommitdiff
path: root/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Dbx_mdbx/src/libmdbx/test/utils.cc')
-rw-r--r--plugins/Dbx_mdbx/src/libmdbx/test/utils.cc349
1 files changed, 0 insertions, 349 deletions
diff --git a/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc b/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc
deleted file mode 100644
index 0855c7eef3..0000000000
--- a/plugins/Dbx_mdbx/src/libmdbx/test/utils.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright 2017-2018 Leonid Yuriev <leo@yuriev.ru>
- * and other libmdbx authors: please see AUTHORS file.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted only as authorized by the OpenLDAP
- * Public License.
- *
- * A copy of this license is available in the file LICENSE in the
- * top-level directory of the distribution or, alternatively, at
- * <http://www.OpenLDAP.org/license.html>.
- */
-
-#include "test.h"
-#include <float.h>
-#if defined(HAVE_IEEE754_H) || __has_include(<ieee754.h>)
-#include <ieee754.h>
-#endif
-
-std::string format(const char *fmt, ...) {
- va_list ap, ones;
- va_start(ap, fmt);
- va_copy(ones, ap);
-#ifdef _MSC_VER
- int needed = _vscprintf(fmt, ap);
-#else
- int needed = vsnprintf(nullptr, 0, fmt, ap);
-#endif
- assert(needed >= 0);
- va_end(ap);
- std::string result;
- result.reserve((size_t)needed + 1);
- result.resize((size_t)needed, '\0');
- int actual = vsnprintf((char *)result.data(), result.capacity(), fmt, ones);
- assert(actual == needed);
- (void)actual;
- va_end(ones);
- return result;
-}
-
-std::string data2hex(const void *ptr, size_t bytes, simple_checksum &checksum) {
- std::string result;
- if (bytes > 0) {
- const uint8_t *data = (const uint8_t *)ptr;
- checksum.push(data, bytes);
- result.reserve(bytes * 2);
- const uint8_t *const end = data + bytes;
- do {
- char h = *data >> 4;
- char l = *data & 15;
- result.push_back((l < 10) ? l + '0' : l - 10 + 'a');
- result.push_back((h < 10) ? h + '0' : h - 10 + 'a');
- } while (++data < end);
- }
- assert(result.size() == bytes * 2);
- return result;
-}
-
-bool hex2data(const char *hex_begin, const char *hex_end, void *ptr,
- size_t bytes, simple_checksum &checksum) {
- if (bytes * 2 != (size_t)(hex_end - hex_begin))
- return false;
-
- uint8_t *data = (uint8_t *)ptr;
- for (const char *hex = hex_begin; hex != hex_end; hex += 2, ++data) {
- unsigned l = hex[0], h = hex[1];
-
- if (l >= '0' && l <= '9')
- l = l - '0';
- else if (l >= 'A' && l <= 'F')
- l = l - 'A' + 10;
- else if (l >= 'a' && l <= 'f')
- l = l - 'a' + 10;
- else
- return false;
-
- if (h >= '0' && h <= '9')
- h = h - '0';
- else if (h >= 'A' && h <= 'F')
- h = h - 'A' + 10;
- else if (h >= 'a' && h <= 'f')
- h = h - 'a' + 10;
- else
- return false;
-
- uint32_t c = l + (h << 4);
- checksum.push(c);
- *data = (uint8_t)c;
- }
- return true;
-}
-
-//-----------------------------------------------------------------------------
-
-/* TODO: replace my 'libmera' fomr t1ha. */
-uint64_t entropy_ticks(void) {
-#if defined(EMSCRIPTEN)
- return (uint64_t)emscripten_get_now();
-#endif /* EMSCRIPTEN */
-
-#if defined(__APPLE__) || defined(__MACH__)
- return mach_absolute_time();
-#endif /* defined(__APPLE__) || defined(__MACH__) */
-
-#if defined(__sun__) || defined(__sun)
- return gethrtime();
-#endif /* __sun__ */
-
-#if defined(__GNUC__) || defined(__clang__)
-
-#if defined(__ia64__)
- uint64_t ticks;
- __asm __volatile("mov %0=ar.itc" : "=r"(ticks));
- return ticks;
-#elif defined(__hppa__)
- uint64_t ticks;
- __asm __volatile("mfctl 16, %0" : "=r"(ticks));
- return ticks;
-#elif defined(__s390__)
- uint64_t ticks;
- __asm __volatile("stck 0(%0)" : : "a"(&(ticks)) : "memory", "cc");
- return ticks;
-#elif defined(__alpha__)
- uint64_t ticks;
- __asm __volatile("rpcc %0" : "=r"(ticks));
- return ticks;
-#elif defined(__sparc__) || defined(__sparc) || defined(__sparc64__) || \
- defined(__sparc64) || defined(__sparc_v8plus__) || \
- defined(__sparc_v8plus) || defined(__sparc_v8plusa__) || \
- defined(__sparc_v8plusa) || defined(__sparc_v9__) || defined(__sparc_v9)
-
- union {
- uint64_t u64;
- struct {
-#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
- uint32_t h, l;
-#else
- uint32_t l, h;
-#endif
- } u32;
- } cycles;
-
-#if defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || \
- defined(__sparc_v9__) || defined(__sparc_v8plus) || \
- defined(__sparc_v8plusa) || defined(__sparc_v9)
-
-#if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul || \
- defined(__sparc64__) || defined(__sparc64)
- __asm __volatile("rd %%tick, %0" : "=r"(cycles.u64));
-#else
- __asm __volatile("rd %%tick, %1; srlx %1, 32, %0"
- : "=r"(cycles.u32.h), "=r"(cycles.u32.l));
-#endif /* __sparc64__ */
-
-#else
- __asm __volatile(".byte 0x83, 0x41, 0x00, 0x00; mov %%g1, %0"
- : "=r"(cycles.u64)
- :
- : "%g1");
-#endif /* __sparc8plus__ || __sparc_v9__ */
- return cycles.u64;
-
-#elif (defined(__powerpc64__) || defined(__ppc64__) || defined(__ppc64) || \
- defined(__powerpc64))
- uint64_t ticks;
- __asm __volatile("mfspr %0, 268" : "=r"(ticks));
- return ticks;
-#elif (defined(__powerpc__) || defined(__ppc__) || defined(__powerpc) || \
- defined(__ppc))
-#if UINTPTR_MAX > 0xffffFFFFul || ULONG_MAX > 0xffffFFFFul
- uint64_t ticks;
- __asm __volatile("mftb %0" : "=r"(ticks));
- *now = ticks;
-#else
- uint64_t ticks;
- uint32_t low, high_before, high_after;
- __asm __volatile("mftbu %0; mftb %1; mftbu %2"
- : "=r"(high_before), "=r"(low), "=r"(high_after));
- ticks = (uint64_t)high_after << 32;
- ticks |= low & /* zeroes if high part has changed */
- ~(high_before - high_after);
-#endif
-#elif defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH > 7)
- uint64_t virtual_timer;
- __asm __volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer));
- return virtual_timer;
-#elif defined(__ARM_ARCH) && __ARM_ARCH > 5 && __ARM_ARCH < 8
- unsigned long pmccntr;
- __asm __volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr));
- return pmccntr;
-#elif defined(__mips__) || defined(__mips) || defined(_R4000)
- unsigned count;
- __asm __volatile("rdhwr %0, $2" : "=r"(count));
- return count;
-#endif /* arch selector */
-#endif /* __GNUC__ || __clang__ */
-
-#if defined(__e2k__) || defined(__ia32__)
- return __rdtsc();
-#elif defined(_M_ARM)
- return __rdpmccntr64();
-#elif defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS)
- LARGE_INTEGER PerformanceCount;
- if (QueryPerformanceCounter(&PerformanceCount))
- return PerformanceCount.QuadPart;
- return GetTickCount64();
-#else
- struct timespec ts;
-#if defined(CLOCK_MONOTONIC_COARSE)
- clockid_t clock = CLOCK_MONOTONIC_COARSE;
-#elif defined(CLOCK_MONOTONIC_RAW)
- clockid_t clock = CLOCK_MONOTONIC_RAW;
-#else
- clockid_t clock = CLOCK_MONOTONIC;
-#endif
- int rc = clock_gettime(clock, &ts);
- if (unlikely(rc))
- failure_perror("clock_gettime()", rc);
-
- return (((uint64_t)ts.tv_sec) << 32) + ts.tv_nsec;
-#endif
-}
-
-//-----------------------------------------------------------------------------
-
-static __inline uint64_t bleach64(uint64_t dirty) {
- return mul_64x64_high(bswap64(dirty), UINT64_C(17048867929148541611));
-}
-
-static __inline uint32_t bleach32(uint32_t dirty) {
- return (uint32_t)((bswap32(dirty) * UINT64_C(2175734609)) >> 32);
-}
-
-uint64_t prng64_careless(uint64_t &state) {
- state = state * UINT64_C(6364136223846793005) + 1;
- return state;
-}
-
-uint64_t prng64_white(uint64_t &state) {
- state = state * UINT64_C(6364136223846793005) + UINT64_C(1442695040888963407);
- return bleach64(state);
-}
-
-uint32_t prng32(uint64_t &state) {
- return (uint32_t)(prng64_careless(state) >> 32);
-}
-
-void prng_fill(uint64_t &state, void *ptr, size_t bytes) {
- while (bytes >= 4) {
- *((uint32_t *)ptr) = prng32(state);
- ptr = (uint32_t *)ptr + 1;
- bytes -= 4;
- }
-
- switch (bytes & 3) {
- case 3: {
- uint32_t u32 = prng32(state);
- memcpy(ptr, &u32, 3);
- } break;
- case 2:
- *((uint16_t *)ptr) = (uint16_t)prng32(state);
- break;
- case 1:
- *((uint8_t *)ptr) = (uint8_t)prng32(state);
- break;
- case 0:
- break;
- }
-}
-
-static __thread uint64_t prng_state;
-
-void prng_seed(uint64_t seed) { prng_state = bleach64(seed); }
-
-uint32_t prng32(void) { return prng32(prng_state); }
-
-uint64_t prng64(void) { return prng64_white(prng_state); }
-
-void prng_fill(void *ptr, size_t bytes) { prng_fill(prng_state, ptr, bytes); }
-
-uint64_t entropy_white() { return bleach64(entropy_ticks()); }
-
-double double_from_lower(uint64_t salt) {
-#ifdef IEEE754_DOUBLE_BIAS
- ieee754_double r;
- r.ieee.negative = 0;
- r.ieee.exponent = IEEE754_DOUBLE_BIAS;
- r.ieee.mantissa0 = (unsigned)(salt >> 32);
- r.ieee.mantissa1 = (unsigned)salt;
- return r.d;
-#else
- const uint64_t top = (UINT64_C(1) << DBL_MANT_DIG) - 1;
- const double scale = 1.0 / (double)top;
- return (salt & top) * scale;
-#endif
-}
-
-double double_from_upper(uint64_t salt) {
-#ifdef IEEE754_DOUBLE_BIAS
- ieee754_double r;
- r.ieee.negative = 0;
- r.ieee.exponent = IEEE754_DOUBLE_BIAS;
- salt >>= 64 - DBL_MANT_DIG;
- r.ieee.mantissa0 = (unsigned)(salt >> 32);
- r.ieee.mantissa1 = (unsigned)salt;
- return r.d;
-#else
- const uint64_t top = (UINT64_C(1) << DBL_MANT_DIG) - 1;
- const double scale = 1.0 / (double)top;
- return (salt >> (64 - DBL_MANT_DIG)) * scale;
-#endif
-}
-
-bool flipcoin() { return bleach32((uint32_t)entropy_ticks()) & 1; }
-
-bool jitter(unsigned probability_percent) {
- const uint32_t top = UINT32_MAX - UINT32_MAX % 100;
- uint32_t dice, edge = (top) / 100 * probability_percent;
- do
- dice = bleach32((uint32_t)entropy_ticks());
- while (dice >= top);
- return dice < edge;
-}
-
-void jitter_delay(bool extra) {
- unsigned dice = entropy_white() & 3;
- if (dice == 0) {
- log_trace("== jitter.no-delay");
- } else {
- log_trace(">> jitter.delay: dice %u", dice);
- do {
- cpu_relax();
- memory_barrier();
- cpu_relax();
- if (dice > 1) {
- osal_yield();
- cpu_relax();
- if (dice > 2) {
- unsigned us = entropy_white() &
- (extra ? 0xfffff /* 1.05 s */ : 0x3ff /* 1 ms */);
- log_trace("== jitter.delay: %0.6f", us / 1000000.0);
- osal_udelay(us);
- }
- }
- } while (flipcoin());
- log_trace("<< jitter.delay: dice %u", dice);
- }
-}