Timer: protect usages of ms timers from rollover
This commit is contained in:
parent
0fe99e9bc8
commit
fec61f89a3
|
@ -48,8 +48,7 @@ void Timer::Start()
|
||||||
void Timer::StartWithOffset(u64 offset)
|
void Timer::StartWithOffset(u64 offset)
|
||||||
{
|
{
|
||||||
Start();
|
Start();
|
||||||
if (m_start_ms > offset)
|
m_start_ms -= offset;
|
||||||
m_start_ms -= offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer::Stop()
|
void Timer::Stop()
|
||||||
|
@ -60,23 +59,10 @@ void Timer::Stop()
|
||||||
|
|
||||||
u64 Timer::ElapsedMs() const
|
u64 Timer::ElapsedMs() const
|
||||||
{
|
{
|
||||||
// If we have not started yet, return zero
|
const u64 end = m_running ? NowMs() : m_end_ms;
|
||||||
if (m_start_ms == 0)
|
// Can handle up to 1 rollover event (underflow produces correct result)
|
||||||
return 0;
|
// If Start() has never been called, will return 0
|
||||||
|
return end - m_start_ms;
|
||||||
if (m_running)
|
|
||||||
{
|
|
||||||
u64 now = NowMs();
|
|
||||||
if (m_start_ms >= now)
|
|
||||||
return 0;
|
|
||||||
return now - m_start_ms;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m_start_ms >= m_end_ms)
|
|
||||||
return 0;
|
|
||||||
return m_end_ms - m_start_ms;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 Timer::GetLocalTimeSinceJan1970()
|
u64 Timer::GetLocalTimeSinceJan1970()
|
||||||
|
|
|
@ -18,7 +18,6 @@ public:
|
||||||
// Effectively "resumes" a timer
|
// Effectively "resumes" a timer
|
||||||
void StartWithOffset(u64 offset);
|
void StartWithOffset(u64 offset);
|
||||||
void Stop();
|
void Stop();
|
||||||
bool IsRunning() const { return m_running; }
|
|
||||||
u64 ElapsedMs() const;
|
u64 ElapsedMs() const;
|
||||||
|
|
||||||
// The rest of these functions probably belong somewhere else
|
// The rest of these functions probably belong somewhere else
|
||||||
|
|
|
@ -159,7 +159,8 @@ void HiresTexture::Prefetch()
|
||||||
const size_t max_mem =
|
const size_t max_mem =
|
||||||
(sys_mem / 2 < recommended_min_mem) ? (sys_mem / 2) : (sys_mem - recommended_min_mem);
|
(sys_mem / 2 < recommended_min_mem) ? (sys_mem / 2) : (sys_mem - recommended_min_mem);
|
||||||
|
|
||||||
const u64 start_time = Common::Timer::NowMs();
|
Common::Timer timer;
|
||||||
|
timer.Start();
|
||||||
for (const auto& entry : s_textureMap)
|
for (const auto& entry : s_textureMap)
|
||||||
{
|
{
|
||||||
const std::string& base_filename = entry.first;
|
const std::string& base_filename = entry.first;
|
||||||
|
@ -207,9 +208,8 @@ void HiresTexture::Prefetch()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const u64 stop_time = Common::Timer::NowMs();
|
|
||||||
OSD::AddMessage(fmt::format("Custom Textures loaded, {:.1f} MB in {:.1f}s",
|
OSD::AddMessage(fmt::format("Custom Textures loaded, {:.1f} MB in {:.1f}s",
|
||||||
size_sum / (1024.0 * 1024.0), (stop_time - start_time) / 1000.0),
|
size_sum / (1024.0 * 1024.0), timer.ElapsedMs() / 1000.0),
|
||||||
10000);
|
10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,12 +32,14 @@ static std::atomic<int> s_obscured_pixels_top = 0;
|
||||||
struct Message
|
struct Message
|
||||||
{
|
{
|
||||||
Message() = default;
|
Message() = default;
|
||||||
Message(std::string text_, u64 timestamp_, u32 duration_, u32 color_)
|
Message(std::string text_, u32 duration_, u32 color_)
|
||||||
: text(std::move(text_)), timestamp(timestamp_), duration(duration_), color(color_)
|
: text(std::move(text_)), duration(duration_), color(color_)
|
||||||
{
|
{
|
||||||
|
timer.Start();
|
||||||
}
|
}
|
||||||
|
s64 TimeRemaining() const { return duration - timer.ElapsedMs(); }
|
||||||
std::string text;
|
std::string text;
|
||||||
u64 timestamp = 0;
|
Common::Timer timer;
|
||||||
u32 duration = 0;
|
u32 duration = 0;
|
||||||
bool ever_drawn = false;
|
bool ever_drawn = false;
|
||||||
u32 color = 0;
|
u32 color = 0;
|
||||||
|
@ -93,20 +95,18 @@ void AddTypedMessage(MessageType type, std::string message, u32 ms, u32 argb)
|
||||||
{
|
{
|
||||||
std::lock_guard lock{s_messages_mutex};
|
std::lock_guard lock{s_messages_mutex};
|
||||||
s_messages.erase(type);
|
s_messages.erase(type);
|
||||||
s_messages.emplace(type, Message(std::move(message), Common::Timer::NowMs() + ms, ms, argb));
|
s_messages.emplace(type, Message(std::move(message), ms, argb));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddMessage(std::string message, u32 ms, u32 argb)
|
void AddMessage(std::string message, u32 ms, u32 argb)
|
||||||
{
|
{
|
||||||
std::lock_guard lock{s_messages_mutex};
|
std::lock_guard lock{s_messages_mutex};
|
||||||
s_messages.emplace(MessageType::Typeless,
|
s_messages.emplace(MessageType::Typeless, Message(std::move(message), ms, argb));
|
||||||
Message(std::move(message), Common::Timer::NowMs() + ms, ms, argb));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawMessages()
|
void DrawMessages()
|
||||||
{
|
{
|
||||||
const bool draw_messages = Config::Get(Config::MAIN_OSD_MESSAGES);
|
const bool draw_messages = Config::Get(Config::MAIN_OSD_MESSAGES);
|
||||||
const u64 now = Common::Timer::NowMs();
|
|
||||||
const float current_x =
|
const float current_x =
|
||||||
LEFT_MARGIN * ImGui::GetIO().DisplayFramebufferScale.x + s_obscured_pixels_left;
|
LEFT_MARGIN * ImGui::GetIO().DisplayFramebufferScale.x + s_obscured_pixels_left;
|
||||||
float current_y = TOP_MARGIN * ImGui::GetIO().DisplayFramebufferScale.y + s_obscured_pixels_top;
|
float current_y = TOP_MARGIN * ImGui::GetIO().DisplayFramebufferScale.y + s_obscured_pixels_top;
|
||||||
|
@ -117,7 +117,7 @@ void DrawMessages()
|
||||||
for (auto it = s_messages.begin(); it != s_messages.end();)
|
for (auto it = s_messages.begin(); it != s_messages.end();)
|
||||||
{
|
{
|
||||||
Message& msg = it->second;
|
Message& msg = it->second;
|
||||||
const int time_left = static_cast<int>(msg.timestamp - now);
|
const s64 time_left = msg.TimeRemaining();
|
||||||
|
|
||||||
// Make sure we draw them at least once if they were printed with 0ms,
|
// Make sure we draw them at least once if they were printed with 0ms,
|
||||||
// unless enough time has expired, in that case, we drop them
|
// unless enough time has expired, in that case, we drop them
|
||||||
|
|
Loading…
Reference in New Issue