mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-04 16:34:14 +08:00
mdbx: avoid underflow during monotime/16dot16 conversion.
This commit is contained in:
parent
c5268f1da7
commit
9c7c709b3e
11
src/osal.c
11
src/osal.c
@ -1908,7 +1908,8 @@ mdbx_osal_16dot16_to_monotime(uint32_t seconds_16dot16) {
|
|||||||
#else
|
#else
|
||||||
const uint64_t ratio = UINT64_C(1000000000);
|
const uint64_t ratio = UINT64_C(1000000000);
|
||||||
#endif
|
#endif
|
||||||
return (ratio * seconds_16dot16 + 32768) >> 16;
|
const uint64_t ret = (ratio * seconds_16dot16 + 32768) >> 16;
|
||||||
|
return likely(ret || seconds_16dot16 == 0) ? ret : /* fix underflow */ 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
MDBX_INTERNAL_FUNC uint32_t mdbx_osal_monotime_to_16dot16(uint64_t monotime) {
|
MDBX_INTERNAL_FUNC uint32_t mdbx_osal_monotime_to_16dot16(uint64_t monotime) {
|
||||||
@ -1920,13 +1921,15 @@ MDBX_INTERNAL_FUNC uint32_t mdbx_osal_monotime_to_16dot16(uint64_t monotime) {
|
|||||||
if (monotime > limit)
|
if (monotime > limit)
|
||||||
return UINT32_MAX;
|
return UINT32_MAX;
|
||||||
}
|
}
|
||||||
|
const uint32_t ret =
|
||||||
#if defined(_WIN32) || defined(_WIN64)
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
return (uint32_t)((monotime << 16) / performance_frequency.QuadPart);
|
(uint32_t)((monotime << 16) / performance_frequency.QuadPart);
|
||||||
#elif defined(__APPLE__) || defined(__MACH__)
|
#elif defined(__APPLE__) || defined(__MACH__)
|
||||||
return (uint32_t)((monotime << 16) / ratio_16dot16_to_monotine);
|
(uint32_t)((monotime << 16) / ratio_16dot16_to_monotine);
|
||||||
#else
|
#else
|
||||||
return (uint32_t)(monotime * 128 / 1953125);
|
(uint32_t)(monotime * 128 / 1953125);
|
||||||
#endif
|
#endif
|
||||||
|
return likely(ret || monotime == 0) ? ret : /* fix underflow */ 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
MDBX_INTERNAL_FUNC uint64_t mdbx_osal_monotime(void) {
|
MDBX_INTERNAL_FUNC uint64_t mdbx_osal_monotime(void) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user