mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 21:35:45 +02:00
time: separate sleep time calculation from sleep_for method
We need to replace nanosleeps with condition variables so that we can implement BeesContext::stop. Export the time calculation from sleep_for() into a new method called sleep_time(). If the thread executing RateLimiter::sleep_for() is interrupted, it will no longer be able to restart, as the sleep_time() method is destructive. This calls for further refactoring of sleep_time() into destructive and non-destructive parts; however, there are currently no users of sleep_for() which rely on being able to restart after being interrupted by a signal. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
parent
0e42c75f5a
commit
cbc6725f0f
@ -42,6 +42,7 @@ namespace crucible {
|
||||
RateLimiter(double rate, double burst);
|
||||
RateLimiter(double rate);
|
||||
void sleep_for(double cost = 1.0);
|
||||
double sleep_time(double cost = 1.0);
|
||||
bool is_ready();
|
||||
void borrow(double cost = 1.0);
|
||||
};
|
||||
|
21
lib/time.cc
21
lib/time.cc
@ -116,25 +116,28 @@ namespace crucible {
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RateLimiter::sleep_for(double cost)
|
||||
double
|
||||
RateLimiter::sleep_time(double cost)
|
||||
{
|
||||
borrow(cost);
|
||||
while (1) {
|
||||
unique_lock<mutex> lock(m_mutex);
|
||||
update_tokens();
|
||||
if (m_tokens >= 0) {
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
double sleep_time(-m_tokens / m_rate);
|
||||
lock.unlock();
|
||||
if (sleep_time > 0.0) {
|
||||
nanosleep(sleep_time);
|
||||
return -m_tokens / m_rate;
|
||||
}
|
||||
|
||||
void
|
||||
RateLimiter::sleep_for(double cost)
|
||||
{
|
||||
double time_to_sleep = sleep_time(cost);
|
||||
if (time_to_sleep > 0.0) {
|
||||
nanosleep(time_to_sleep);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
RateLimiter::is_ready()
|
||||
|
Loading…
x
Reference in New Issue
Block a user