diff --git a/src/core.c b/src/core.c index 09ecd9b5..a8371188 100644 --- a/src/core.c +++ b/src/core.c @@ -10714,7 +10714,7 @@ provide_latency: latency->sync = (ts_4 && ts_5) ? osal_monotime_to_16dot16(ts_5 - ts_4) : 0; const uint64_t ts_6 = osal_monotime(); latency->ending = ts_5 ? osal_monotime_to_16dot16(ts_6 - ts_5) : 0; - latency->whole = osal_monotime_to_16dot16(ts_6 - ts_0); + latency->whole = osal_monotime_to_16dot16_noUnderflow(ts_6 - ts_0); } return rc; @@ -20775,14 +20775,15 @@ __cold static int fetch_envinfo_ex(const MDBX_env *env, const MDBX_txn *txn, const uint64_t monotime_now = osal_monotime(); uint64_t ts = atomic_load64(&lck->mti_sync_timestamp, mo_Relaxed); arg->mi_since_sync_seconds16dot16 = - ts ? osal_monotime_to_16dot16(monotime_now - ts) : 0; + ts ? osal_monotime_to_16dot16_noUnderflow(monotime_now - ts) : 0; ts = atomic_load64(&lck->mti_reader_check_timestamp, mo_Relaxed); arg->mi_since_reader_check_seconds16dot16 = - ts ? osal_monotime_to_16dot16(monotime_now - ts) : 0; + ts ? osal_monotime_to_16dot16_noUnderflow(monotime_now - ts) : 0; arg->mi_autosync_threshold = pgno2bytes( env, atomic_load32(&lck->mti_autosync_threshold, mo_Relaxed)); - arg->mi_autosync_period_seconds16dot16 = osal_monotime_to_16dot16( - atomic_load64(&lck->mti_autosync_period, mo_Relaxed)); + arg->mi_autosync_period_seconds16dot16 = + osal_monotime_to_16dot16_noUnderflow( + atomic_load64(&lck->mti_autosync_period, mo_Relaxed)); arg->mi_bootid.current.x = bootid.x; arg->mi_bootid.current.y = bootid.y; arg->mi_mode = env->me_lck_mmap.lck ? lck->mti_envmode.weak : env->me_flags; diff --git a/src/osal.c b/src/osal.c index 6a2697fa..79760a12 100644 --- a/src/osal.c +++ b/src/osal.c @@ -2655,9 +2655,7 @@ MDBX_INTERNAL_FUNC uint32_t osal_monotime_to_16dot16(uint64_t monotime) { #else (uint32_t)(monotime * 128 / 1953125); #endif - if (likely(ret > 0)) - return ret; - return monotime > 0 /* fix underflow */; + return ret; } MDBX_INTERNAL_FUNC uint64_t osal_monotime(void) { diff --git a/src/osal.h b/src/osal.h index 7d4b37b3..20842eff 100644 --- a/src/osal.h +++ b/src/osal.h @@ -585,6 +585,11 @@ MDBX_INTERNAL_FUNC uint64_t osal_monotime(void); MDBX_INTERNAL_FUNC uint64_t osal_16dot16_to_monotime(uint32_t seconds_16dot16); MDBX_INTERNAL_FUNC uint32_t osal_monotime_to_16dot16(uint64_t monotime); +static inline uint32_t osal_monotime_to_16dot16_noUnderflow(uint64_t monotime) { + uint32_t seconds_16dot16 = osal_monotime_to_16dot16(monotime); + return seconds_16dot16 ? seconds_16dot16 : /* fix underflow */ (monotime > 0); +} + MDBX_INTERNAL_FUNC bin128_t osal_bootid(void); /*----------------------------------------------------------------------------*/ /* lck stuff */