From 2dd2c849dcb506a3071efab92fd05a353cfc3b28 Mon Sep 17 00:00:00 2001 From: Marcin Kowalczyk Date: Wed, 21 Feb 2024 19:24:00 +0100 Subject: [PATCH] Fix an irregularity in `BackgroundCleaner::ScheduleCleaning()` with `absl::InfiniteFuture()`: replace the existing scheduled cleaning (to do nothing) instead of always doing nothing. PiperOrigin-RevId: 609042280 --- riegeli/base/background_cleaning.cc | 17 ++++++++++++++--- riegeli/base/background_cleaning.h | 12 ++---------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/riegeli/base/background_cleaning.cc b/riegeli/base/background_cleaning.cc index 825c55ee..a5993d8d 100644 --- a/riegeli/base/background_cleaning.cc +++ b/riegeli/base/background_cleaning.cc @@ -43,6 +43,7 @@ void BackgroundCleaner::Unregister(Token token) { void BackgroundCleaner::CancelCleaning(Token token) { absl::MutexLock lock(&mutex_); CancelCleaningInternal(token); + // Move `token.iter()` anywhere before `next_`. if (next_ == token.iter()) { ++next_; } else { @@ -64,11 +65,21 @@ inline void BackgroundCleaner::CancelCleaningInternal(Token token) { &args)); } -void BackgroundCleaner::ScheduleCleaningSlow(Token token, absl::Time deadline) { +void BackgroundCleaner::ScheduleCleaning(Token token, absl::Time deadline) { absl::MutexLock lock(&mutex_); - - // Update `entries_` by moving `token.iter()` into the right place, and update + // Update `entries_` by moving `token.iter()` to the right place, and update // `next_`. + + if (deadline == absl::InfiniteFuture()) { + // Move `token.iter()` anywhere before `next_`. + if (next_ == token.iter()) { + ++next_; + } else { + entries_.splice(entries_.begin(), entries_, token.iter()); + } + return; + } + Entries::iterator iter = entries_.end(); for (;;) { if (iter == next_) { diff --git a/riegeli/base/background_cleaning.h b/riegeli/base/background_cleaning.h index de9b4f26..a7ab287b 100644 --- a/riegeli/base/background_cleaning.h +++ b/riegeli/base/background_cleaning.h @@ -112,8 +112,8 @@ class BackgroundCleaner { // Schedules cleaning the cleanee corresponding to `token` at `deadline`. // - // Does nothing if `deadline == absl::InfiniteFuture()`. If `deadline` is in - // the past, cleaning will be scheduled. + // If `deadline` is `absl::InfiniteFuture()`, cleaning will never happen. + // If `deadline` is in the past, cleaning will be scheduled immediately. // // If `ScheduleCleaning()` is called again for the same cleanee with a pending // cleaning, its deadline is replaced. @@ -131,8 +131,6 @@ class BackgroundCleaner { void CancelCleaningInternal(Token token) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mutex_); - void ScheduleCleaningSlow(Token token, absl::Time deadline); - void BackgroundThread(); absl::Mutex mutex_; @@ -157,12 +155,6 @@ class BackgroundCleaner { // Implementation details follow. -inline void BackgroundCleaner::ScheduleCleaning(Token token, - absl::Time deadline) { - if (deadline == absl::InfiniteFuture()) return; - ScheduleCleaningSlow(token, deadline); -} - inline absl::Time BackgroundCleaner::TimeNow() { return absl::Now(); } } // namespace riegeli