[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; }