mirror of
https://github.com/isar/libmdbx.git
synced 2025-10-24 00:28:56 +08:00
mdbx: переделка page_alloc_slowpath()
с добавлением профилирования GC.
This commit is contained in:
55
src/osal.c
55
src/osal.c
@@ -18,6 +18,7 @@
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
|
||||
#include <psapi.h>
|
||||
#include <winioctl.h>
|
||||
|
||||
#if !MDBX_WITHOUT_MSVC_CRT && defined(_DEBUG)
|
||||
@@ -2700,6 +2701,60 @@ MDBX_INTERNAL_FUNC uint64_t osal_monotime(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
MDBX_INTERNAL_FUNC uint64_t osal_cputime(size_t *optional_page_faults) {
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
if (optional_page_faults) {
|
||||
PROCESS_MEMORY_COUNTERS pmc;
|
||||
*optional_page_faults =
|
||||
GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))
|
||||
? pmc.PageFaultCount
|
||||
: 0;
|
||||
}
|
||||
FILETIME unused, usermode;
|
||||
if (GetThreadTimes(GetCurrentThread(),
|
||||
/* CreationTime */ &unused,
|
||||
/* ExitTime */ &unused,
|
||||
/* KernelTime */ &unused,
|
||||
/* UserTime */ &usermode)) {
|
||||
/* one second = 10_000_000 * 100ns = 78125 * (1 << 7) * 100ns;
|
||||
* result = (h * f / 10_000_000) << 32) + l * f / 10_000_000 =
|
||||
* = ((h * f) >> 7) / 78125) << 32) + ((l * f) >> 7) / 78125;
|
||||
* 1) {h, l} *= f;
|
||||
* 2) {h, l} >>= 7;
|
||||
* 3) result = ((h / 78125) << 32) + l / 78125; */
|
||||
uint64_t l = usermode.dwLowDateTime * performance_frequency.QuadPart;
|
||||
uint64_t h = usermode.dwHighDateTime * performance_frequency.QuadPart;
|
||||
l = h << (64 - 7) | l >> 7;
|
||||
h = h >> 7;
|
||||
return ((h / 78125) << 32) + l / 78125;
|
||||
}
|
||||
#elif defined(RUSAGE_THREAD) || defined(RUSAGE_LWP)
|
||||
#ifndef RUSAGE_THREAD
|
||||
#define RUSAGE_THREAD RUSAGE_LWP /* Solaris */
|
||||
#endif
|
||||
struct rusage usage;
|
||||
if (getrusage(RUSAGE_THREAD, &usage) == 0) {
|
||||
if (optional_page_faults)
|
||||
*optional_page_faults = usage.ru_majflt;
|
||||
return usage.ru_utime.tv_sec * UINT64_C(1000000000) +
|
||||
usage.ru_utime.tv_usec * 1000u;
|
||||
}
|
||||
if (optional_page_faults)
|
||||
*optional_page_faults = 0;
|
||||
#elif defined(CLOCK_THREAD_CPUTIME_ID)
|
||||
if (optional_page_faults)
|
||||
*optional_page_faults = 0;
|
||||
struct timespec ts;
|
||||
if (likely(clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0))
|
||||
return ts.tv_sec * UINT64_C(1000000000) + ts.tv_nsec;
|
||||
#else
|
||||
/* FIXME */
|
||||
if (optional_page_faults)
|
||||
*optional_page_faults = 0;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
static void bootid_shake(bin128_t *p) {
|
||||
|
Reference in New Issue
Block a user