Use structured ABSL types for handling time values
This CL migrates a bunch of GFE code to use absl::Time and absl::Duration rather than bare numbers to represent time values.
PiperOrigin-RevId: 504627740
diff --git a/quiche/http2/core/priority_write_scheduler.h b/quiche/http2/core/priority_write_scheduler.h
index 4e32b90..d63a316 100644
--- a/quiche/http2/core/priority_write_scheduler.h
+++ b/quiche/http2/core/priority_write_scheduler.h
@@ -16,6 +16,8 @@
#include "absl/container/flat_hash_map.h"
#include "absl/strings/str_cat.h"
+#include "absl/time/time.h"
+#include "absl/types/optional.h"
#include "quiche/common/platform/api/quiche_bug_tracker.h"
#include "quiche/common/platform/api/quiche_export.h"
#include "quiche/common/platform/api/quiche_logging.h"
@@ -149,11 +151,10 @@
stream_info->priority = std::move(priority);
}
- // Records time (in microseconds) of a read/write event for the given
- // stream.
+ // Records time of a read/write event for the given stream.
//
// Preconditions: `stream_id` should be registered.
- void RecordStreamEventTime(StreamIdType stream_id, int64_t now_in_usec) {
+ void RecordStreamEventTime(StreamIdType stream_id, absl::Time now) {
auto it = stream_infos_.find(stream_id);
if (it == stream_infos_.end()) {
QUICHE_BUG(spdy_bug_19_4) << "Stream " << stream_id << " not registered";
@@ -161,29 +162,30 @@
}
PriorityInfo& priority_info =
priority_infos_[PriorityTypeToInt()(it->second->priority)];
- priority_info.last_event_time_usec =
- std::max(priority_info.last_event_time_usec, now_in_usec);
+ priority_info.last_event_time =
+ std::max(priority_info.last_event_time, absl::make_optional(now));
}
- // Returns time (in microseconds) of the last read/write event for a stream
- // with higher priority than the priority of the given stream, or 0 if there
- // is no such event.
+ // Returns time of the last read/write event for a stream with higher priority
+ // than the priority of the given stream, or nullopt if there is no such
+ // event.
//
// Preconditions: `stream_id` should be registered.
- int64_t GetLatestEventWithPriority(StreamIdType stream_id) const {
+ absl::optional<absl::Time> GetLatestEventWithPriority(
+ StreamIdType stream_id) const {
auto it = stream_infos_.find(stream_id);
if (it == stream_infos_.end()) {
QUICHE_BUG(spdy_bug_19_5) << "Stream " << stream_id << " not registered";
- return 0;
+ return absl::nullopt;
}
- int64_t last_event_time_usec = 0;
+ absl::optional<absl::Time> last_event_time;
const StreamInfo* const stream_info = it->second.get();
for (int p = kHighestPriority;
p < PriorityTypeToInt()(stream_info->priority); ++p) {
- last_event_time_usec = std::max(last_event_time_usec,
- priority_infos_[p].last_event_time_usec);
+ last_event_time =
+ std::max(last_event_time, priority_infos_[p].last_event_time);
}
- return last_event_time_usec;
+ return last_event_time;
}
// If the scheduler has any ready streams, returns the next scheduled
@@ -344,8 +346,8 @@
struct QUICHE_EXPORT PriorityInfo {
// IDs of streams that are ready to write.
ReadyList ready_list;
- // Time of latest write event for stream of this priority, in microseconds.
- int64_t last_event_time_usec = 0;
+ // Time of latest write event for stream of this priority.
+ absl::optional<absl::Time> last_event_time;
};
// Use std::unique_ptr, because absl::flat_hash_map does not have pointer
diff --git a/quiche/http2/core/priority_write_scheduler_test.cc b/quiche/http2/core/priority_write_scheduler_test.cc
index 8a4e518..96c4bd2 100644
--- a/quiche/http2/core/priority_write_scheduler_test.cc
+++ b/quiche/http2/core/priority_write_scheduler_test.cc
@@ -15,6 +15,8 @@
using ::spdy::kHttp2RootStreamId;
using ::spdy::SpdyPriority;
using ::spdy::SpdyStreamId;
+using ::testing::Eq;
+using ::testing::Optional;
template <typename StreamIdType>
class PriorityWriteSchedulerPeer {
@@ -314,22 +316,26 @@
}
TEST_F(PriorityWriteSchedulerTest, GetLatestEventWithPriority) {
- EXPECT_QUICHE_BUG(scheduler_.RecordStreamEventTime(3, 5),
- "Stream 3 not registered");
- EXPECT_QUICHE_BUG(EXPECT_EQ(0, scheduler_.GetLatestEventWithPriority(4)),
- "Stream 4 not registered");
+ EXPECT_QUICHE_BUG(
+ scheduler_.RecordStreamEventTime(3, absl::FromUnixMicros(5)),
+ "Stream 3 not registered");
+ EXPECT_QUICHE_BUG(
+ EXPECT_FALSE(scheduler_.GetLatestEventWithPriority(4).has_value()),
+ "Stream 4 not registered");
for (int i = 1; i < 5; ++i) {
scheduler_.RegisterStream(i, i);
}
for (int i = 1; i < 5; ++i) {
- EXPECT_EQ(0, scheduler_.GetLatestEventWithPriority(i));
+ EXPECT_FALSE(scheduler_.GetLatestEventWithPriority(i).has_value());
}
for (int i = 1; i < 5; ++i) {
- scheduler_.RecordStreamEventTime(i, i * 100);
+ scheduler_.RecordStreamEventTime(i, absl::FromUnixMicros(i * 100));
}
- for (int i = 1; i < 5; ++i) {
- EXPECT_EQ((i - 1) * 100, scheduler_.GetLatestEventWithPriority(i));
+ EXPECT_FALSE(scheduler_.GetLatestEventWithPriority(1).has_value());
+ for (int i = 2; i < 5; ++i) {
+ EXPECT_THAT(scheduler_.GetLatestEventWithPriority(i),
+ Optional(Eq(absl::FromUnixMicros((i - 1) * 100))));
}
}