[sequencemanager] Move EnqueueOrder out of the internal namespace.
The goal is to allow EnqueueOrder to be used to identify tasks
outside of SequenceManager code, for example in task
ready/started/completed callbacks in
https://chromium-review.googlesource.com/c/chromium/src/+/1689339.
It also makes sense to move EnqueueOrder out of the internal
namespace since it was already exposed on non-public methods of
the non-internal base::sequence_manager::Task class.
Bug: 984057
Change-Id: I6ddd83c55d3a21350b6ff12fbc02a68800b653a1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1700266
Commit-Queue: François Doray <fdoray@chromium.org>
Reviewed-by: Alexander Timin <altimin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#677423}
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 6d5590b..bba5f627 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -777,8 +777,9 @@
"task/sequence_manager/associated_thread_id.h",
"task/sequence_manager/atomic_flag_set.cc",
"task/sequence_manager/atomic_flag_set.h",
- "task/sequence_manager/enqueue_order.cc",
"task/sequence_manager/enqueue_order.h",
+ "task/sequence_manager/enqueue_order_generator.cc",
+ "task/sequence_manager/enqueue_order_generator.h",
"task/sequence_manager/lazily_deallocated_deque.h",
"task/sequence_manager/lazy_now.cc",
"task/sequence_manager/lazy_now.h",
diff --git a/base/task/sequence_manager/enqueue_order.h b/base/task/sequence_manager/enqueue_order.h
index fac1d17..0fc491f 100644
--- a/base/task/sequence_manager/enqueue_order.h
+++ b/base/task/sequence_manager/enqueue_order.h
@@ -7,14 +7,12 @@
#include <stdint.h>
-#include <atomic>
-
-#include "base/base_export.h"
-#include "base/macros.h"
-
namespace base {
namespace sequence_manager {
+
namespace internal {
+class EnqueueOrderGenerator;
+}
// 64-bit number which is used to order tasks.
// SequenceManager assumes this number will never overflow.
@@ -34,25 +32,11 @@
return EnqueueOrder(value);
}
- // EnqueueOrder can't be created from a raw number in non-test code.
- // Generator is used to create it with strictly monotonic guarantee.
- class BASE_EXPORT Generator {
- public:
- Generator();
- ~Generator();
-
- // Can be called from any thread.
- EnqueueOrder GenerateNext() {
- return EnqueueOrder(std::atomic_fetch_add_explicit(
- &counter_, uint64_t(1), std::memory_order_relaxed));
- }
-
- private:
- std::atomic<uint64_t> counter_;
- DISALLOW_COPY_AND_ASSIGN(Generator);
- };
-
private:
+ // EnqueueOrderGenerator is the only class allowed to create an EnqueueOrder
+ // with a non-default constructor.
+ friend class internal::EnqueueOrderGenerator;
+
explicit EnqueueOrder(uint64_t value) : value_(value) {}
enum SpecialValues : uint64_t {
@@ -64,7 +48,6 @@
uint64_t value_;
};
-} // namespace internal
} // namespace sequence_manager
} // namespace base
diff --git a/base/task/sequence_manager/enqueue_order.cc b/base/task/sequence_manager/enqueue_order_generator.cc
similarity index 60%
rename from base/task/sequence_manager/enqueue_order.cc
rename to base/task/sequence_manager/enqueue_order_generator.cc
index 066ef038..50d37a3c 100644
--- a/base/task/sequence_manager/enqueue_order.cc
+++ b/base/task/sequence_manager/enqueue_order_generator.cc
@@ -2,15 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/task/sequence_manager/enqueue_order.h"
+#include "base/task/sequence_manager/enqueue_order_generator.h"
namespace base {
namespace sequence_manager {
namespace internal {
-EnqueueOrder::Generator::Generator() : counter_(kFirst) {}
+EnqueueOrderGenerator::EnqueueOrderGenerator()
+ : counter_(EnqueueOrder::kFirst) {}
-EnqueueOrder::Generator::~Generator() = default;
+EnqueueOrderGenerator::~EnqueueOrderGenerator() = default;
} // namespace internal
} // namespace sequence_manager
diff --git a/base/task/sequence_manager/enqueue_order_generator.h b/base/task/sequence_manager/enqueue_order_generator.h
new file mode 100644
index 0000000..36d19e2b
--- /dev/null
+++ b/base/task/sequence_manager/enqueue_order_generator.h
@@ -0,0 +1,43 @@
+
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_
+#define BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_
+
+#include <stdint.h>
+
+#include <atomic>
+
+#include "base/base_export.h"
+#include "base/macros.h"
+#include "base/task/sequence_manager/enqueue_order.h"
+
+namespace base {
+namespace sequence_manager {
+namespace internal {
+
+// EnqueueOrder can't be created from a raw number in non-test code.
+// EnqueueOrderGenerator is used to create it with strictly monotonic guarantee.
+class BASE_EXPORT EnqueueOrderGenerator {
+ public:
+ EnqueueOrderGenerator();
+ ~EnqueueOrderGenerator();
+
+ // Can be called from any thread.
+ EnqueueOrder GenerateNext() {
+ return EnqueueOrder(std::atomic_fetch_add_explicit(
+ &counter_, uint64_t(1), std::memory_order_relaxed));
+ }
+
+ private:
+ std::atomic<uint64_t> counter_;
+ DISALLOW_COPY_AND_ASSIGN(EnqueueOrderGenerator);
+};
+
+} // namespace internal
+} // namespace sequence_manager
+} // namespace base
+
+#endif // BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index b2336c6..6bfe2aa 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -878,7 +878,7 @@
return !task_was_run;
}
-internal::EnqueueOrder SequenceManagerImpl::GetNextSequenceNumber() {
+EnqueueOrder SequenceManagerImpl::GetNextSequenceNumber() {
return enqueue_order_generator_.GenerateNext();
}
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h
index 6b7eec8..b70d128 100644
--- a/base/task/sequence_manager/sequence_manager_impl.h
+++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -29,6 +29,7 @@
#include "base/task/common/task_annotator.h"
#include "base/task/sequence_manager/associated_thread_id.h"
#include "base/task/sequence_manager/enqueue_order.h"
+#include "base/task/sequence_manager/enqueue_order_generator.h"
#include "base/task/sequence_manager/sequence_manager.h"
#include "base/task/sequence_manager/task_queue_impl.h"
#include "base/task/sequence_manager/task_queue_selector.h"
@@ -335,7 +336,7 @@
void NotifyWillProcessTask(ExecutingTask* task, LazyNow* time_before_task);
void NotifyDidProcessTask(ExecutingTask* task, LazyNow* time_after_task);
- internal::EnqueueOrder GetNextSequenceNumber();
+ EnqueueOrder GetNextSequenceNumber();
bool GetAddQueueTimeToTasks();
@@ -394,7 +395,7 @@
scoped_refptr<AssociatedThreadId> associated_thread_;
- internal::EnqueueOrder::Generator enqueue_order_generator_;
+ EnqueueOrderGenerator enqueue_order_generator_;
const std::unique_ptr<internal::ThreadController> controller_;
const Settings settings_;
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
index f2ad27bd..a419daa 100644
--- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc
+++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -53,7 +53,7 @@
#include "build/build_config.h"
#include "testing/gmock/include/gmock/gmock.h"
-using base::sequence_manager::internal::EnqueueOrder;
+using base::sequence_manager::EnqueueOrder;
using testing::_;
using testing::AnyNumber;
using testing::Contains;
diff --git a/base/task/sequence_manager/task_queue_selector_unittest.cc b/base/task/sequence_manager/task_queue_selector_unittest.cc
index b76a582a..c993664 100644
--- a/base/task/sequence_manager/task_queue_selector_unittest.cc
+++ b/base/task/sequence_manager/task_queue_selector_unittest.cc
@@ -16,6 +16,7 @@
#include "base/macros.h"
#include "base/memory/ptr_util.h"
#include "base/pending_task.h"
+#include "base/task/sequence_manager/enqueue_order_generator.h"
#include "base/task/sequence_manager/task_queue_impl.h"
#include "base/task/sequence_manager/test/mock_time_domain.h"
#include "base/task/sequence_manager/work_queue.h"
@@ -70,7 +71,7 @@
~TaskQueueSelectorTestBase() override = default;
void PushTasks(const size_t queue_indices[], size_t num_tasks) {
- EnqueueOrder::Generator enqueue_order_generator;
+ EnqueueOrderGenerator enqueue_order_generator;
for (size_t i = 0; i < num_tasks; i++) {
task_queues_[queue_indices[i]]->immediate_work_queue()->Push(
Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(),
diff --git a/base/task/sequence_manager/tasks.cc b/base/task/sequence_manager/tasks.cc
index 1006762..14bd306 100644
--- a/base/task/sequence_manager/tasks.cc
+++ b/base/task/sequence_manager/tasks.cc
@@ -9,8 +9,8 @@
Task::Task(internal::PostedTask posted_task,
TimeTicks desired_run_time,
- internal::EnqueueOrder sequence_order,
- internal::EnqueueOrder enqueue_order,
+ EnqueueOrder sequence_order,
+ EnqueueOrder enqueue_order,
internal::WakeUpResolution resolution)
: PendingTask(posted_task.location,
std::move(posted_task.callback),
diff --git a/base/task/sequence_manager/tasks.h b/base/task/sequence_manager/tasks.h
index f9658a7a..0c886c4b 100644
--- a/base/task/sequence_manager/tasks.h
+++ b/base/task/sequence_manager/tasks.h
@@ -72,8 +72,8 @@
struct BASE_EXPORT Task : public PendingTask {
Task(internal::PostedTask posted_task,
TimeTicks desired_run_time,
- internal::EnqueueOrder sequence_order,
- internal::EnqueueOrder enqueue_order = internal::EnqueueOrder(),
+ EnqueueOrder sequence_order,
+ EnqueueOrder enqueue_order = EnqueueOrder(),
internal::WakeUpResolution wake_up_resolution =
internal::WakeUpResolution::kLow);
@@ -83,12 +83,12 @@
// SequenceManager is particularly sensitive to enqueue order,
// so we have accessors for safety.
- internal::EnqueueOrder enqueue_order() const {
+ EnqueueOrder enqueue_order() const {
DCHECK(enqueue_order_);
return enqueue_order_;
}
- void set_enqueue_order(internal::EnqueueOrder enqueue_order) {
+ void set_enqueue_order(EnqueueOrder enqueue_order) {
DCHECK(!enqueue_order_);
enqueue_order_ = enqueue_order;
}
@@ -107,7 +107,7 @@
// is set when posted, but for delayed tasks it's not defined until they are
// enqueued. This is because otherwise delayed tasks could run before
// an immediate task posted after the delayed task.
- internal::EnqueueOrder enqueue_order_;
+ EnqueueOrder enqueue_order_;
};
} // namespace sequence_manager
diff --git a/base/task/sequence_manager/test/fake_task.cc b/base/task/sequence_manager/test/fake_task.cc
index 30dd12f..6d1c794 100644
--- a/base/task/sequence_manager/test/fake_task.cc
+++ b/base/task/sequence_manager/test/fake_task.cc
@@ -16,8 +16,8 @@
Nestable::kNestable,
task_type),
TimeTicks(),
- internal::EnqueueOrder(),
- internal::EnqueueOrder(),
+ EnqueueOrder(),
+ EnqueueOrder(),
internal::WakeUpResolution::kLow) {}
FakeTaskTiming::FakeTaskTiming()
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
index a58bb85e..64eb8f7 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
@@ -107,8 +107,7 @@
DCHECK(tasks_.empty() || delayed_run_time.is_null() ||
tasks_.back().delayed_run_time < delayed_run_time);
tasks_.push(Task(internal::PostedTask(std::move(task), posted_from),
- delayed_run_time,
- internal::EnqueueOrder::FromIntForTesting(13)));
+ delayed_run_time, EnqueueOrder::FromIntForTesting(13)));
}
bool HasPendingHighResolutionTasks() override { return false; }