diff --git a/deps/oblib/src/lib/lock/ob_thread_cond.cpp b/deps/oblib/src/lib/lock/ob_thread_cond.cpp index 6d64a5e17967fccf555ac7d48cd0165b0cb4d2f7..73b61340b4e486d5b0fb460f5d5b3ed3911c8db5 100644 --- a/deps/oblib/src/lib/lock/ob_thread_cond.cpp +++ b/deps/oblib/src/lib/lock/ob_thread_cond.cpp @@ -11,6 +11,7 @@ */ #include "lib/lock/ob_thread_cond.h" +#include #include "lib/stat/ob_diagnose_info.h" #include "lib/oblog/ob_log.h" @@ -129,11 +130,17 @@ int ObThreadCond::wait_us(const uint64_t time_us) ret = OB_ERR_SYS; COMMON_LOG(WARN, "Fail to get time, ", K(tmp_ret), K(ret)); } else { - uint64_t us = (static_cast(curtime.tv_sec) * static_cast(1000000) + - static_cast(curtime.tv_usec) + time_us); + uint64_t cur_time = static_cast(curtime.tv_sec) * static_cast(1000000) + + static_cast(curtime.tv_usec); + uint64_t us = cur_time + time_us; + if (us < cur_time || us < time_us) { + us = UINT64_MAX; + } - abstime.tv_sec = static_cast(us / static_cast(1000000)); - abstime.tv_nsec = static_cast(us % static_cast(1000000)) * 1000; + abstime.tv_sec = static_cast( + std::min(static_cast(std::numeric_limits::max()), + static_cast(us / 1000000))); + abstime.tv_nsec = static_cast(us % static_cast(1000000)) * 1000; if (OB_UNLIKELY(0 != (tmp_ret = pthread_cond_timedwait(&cond_, &mutex_, &abstime)))) { if (ETIMEDOUT != tmp_ret) { ret = OB_ERR_SYS;