提交 75ca779e 编写于 作者: N nroskill 提交者: wangzelin.wzl

[CP] fix ThreadCond time_us overflow

上级 e12438aa
......@@ -11,6 +11,7 @@
*/
#include "lib/lock/ob_thread_cond.h"
#include <limits>
#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<int64_t>(curtime.tv_sec) * static_cast<int64_t>(1000000) +
static_cast<int64_t>(curtime.tv_usec) + time_us);
uint64_t cur_time = static_cast<uint64_t>(curtime.tv_sec) * static_cast<uint64_t>(1000000) +
static_cast<uint64_t>(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<int>(us / static_cast<uint64_t>(1000000));
abstime.tv_nsec = static_cast<int>(us % static_cast<uint64_t>(1000000)) * 1000;
abstime.tv_sec = static_cast<decltype(abstime.tv_sec)>(
std::min(static_cast<uint64_t>(std::numeric_limits<decltype(abstime.tv_sec)>::max()),
static_cast<uint64_t>(us / 1000000)));
abstime.tv_nsec = static_cast<decltype(abstime.tv_nsec)>(us % static_cast<uint64_t>(1000000)) * 1000;
if (OB_UNLIKELY(0 != (tmp_ret = pthread_cond_timedwait(&cond_, &mutex_, &abstime)))) {
if (ETIMEDOUT != tmp_ret) {
ret = OB_ERR_SYS;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册