Remove header dependencies from sequence_checker.h to sequenced_worker_pool.h

This CL removes #include to sequenced_worker_pool.h in sequence_checker.h
by hiding its members into a nested class, and adds #include and forward
decls to other files as needed.

Note that the non trivial diffs are in sequence_checker_impl.{h,cc} only.

The header dependency from sequence_checker.h to sequenced_worker_pool.h
prevents other headers to use sequence_checker.h due to a dependency
cycle.

[email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]

Review-Url: https://codereview.chromium.org/2690533002
Cr-Original-Commit-Position: refs/heads/master@{#450321}
Committed: https://chromium.googlesource.com/chromium/src/+/d502a3f2fa0b673a5082c1d601298bd114a9d237
Review-Url: https://codereview.chromium.org/2690533002
Cr-Commit-Position: refs/heads/master@{#450384}
Committed: https://chromium.googlesource.com/chromium/src/+/70b7c5d796420107930c72d4ad82e0c850166b1a
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.win:win10_chromium_x64_rel_ng

Review-Url: https://codereview.chromium.org/2690533002
Cr-Commit-Position: refs/heads/master@{#450903}
diff --git a/base/sequence_checker_impl.cc b/base/sequence_checker_impl.cc
index b8e87e6d..df2a8cb2 100644
--- a/base/sequence_checker_impl.cc
+++ b/base/sequence_checker_impl.cc
@@ -5,54 +5,65 @@
 #include "base/sequence_checker_impl.h"
 
 #include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/sequence_token.h"
+#include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/thread_checker_impl.h"
 
 namespace base {
 
-SequenceCheckerImpl::SequenceCheckerImpl() {
-  AutoLock auto_lock(lock_);
-  EnsureSequenceTokenAssigned();
-}
+class SequenceCheckerImpl::Core {
+ public:
+  Core()
+      : sequence_token_(SequenceToken::GetForCurrentThread()),
+        sequenced_worker_pool_token_(
+            SequencedWorkerPool::GetSequenceTokenForCurrentThread()) {
+    // SequencedWorkerPool doesn't use SequenceToken and code outside of
+    // SequenceWorkerPool doesn't set a SequencedWorkerPool token.
+    DCHECK(!sequence_token_.IsValid() ||
+           !sequenced_worker_pool_token_.IsValid());
+  }
 
+  ~Core() = default;
+
+  bool CalledOnValidThread() const {
+    if (sequence_token_.IsValid())
+      return sequence_token_ == SequenceToken::GetForCurrentThread();
+
+    if (sequenced_worker_pool_token_.IsValid()) {
+      return sequenced_worker_pool_token_.Equals(
+          SequencedWorkerPool::GetSequenceTokenForCurrentThread());
+    }
+
+    // SequenceChecker behaves as a ThreadChecker when it is not bound to a
+    // valid sequence token.
+    return thread_checker_.CalledOnValidThread();
+  }
+
+ private:
+  SequenceToken sequence_token_;
+
+  // TODO(gab): Remove this when SequencedWorkerPool is deprecated in favor of
+  // TaskScheduler. crbug.com/622400
+  SequencedWorkerPool::SequenceToken sequenced_worker_pool_token_;
+
+  // Used when |sequenced_worker_pool_token_| and |sequence_token_| are invalid.
+  ThreadCheckerImpl thread_checker_;
+};
+
+SequenceCheckerImpl::SequenceCheckerImpl() : core_(MakeUnique<Core>()) {}
 SequenceCheckerImpl::~SequenceCheckerImpl() = default;
 
 bool SequenceCheckerImpl::CalledOnValidSequence() const {
   AutoLock auto_lock(lock_);
-  EnsureSequenceTokenAssigned();
-
-  if (sequence_token_.IsValid())
-    return sequence_token_ == SequenceToken::GetForCurrentThread();
-
-  if (sequenced_worker_pool_token_.IsValid()) {
-    return sequenced_worker_pool_token_.Equals(
-        SequencedWorkerPool::GetSequenceTokenForCurrentThread());
-  }
-
-  // SequenceChecker behaves as a ThreadChecker when it is not bound to a valid
-  // sequence token.
-  return thread_checker_.CalledOnValidThread();
+  if (!core_)
+    core_ = MakeUnique<Core>();
+  return core_->CalledOnValidThread();
 }
 
 void SequenceCheckerImpl::DetachFromSequence() {
   AutoLock auto_lock(lock_);
-  is_assigned_ = false;
-  sequence_token_ = SequenceToken();
-  sequenced_worker_pool_token_ = SequencedWorkerPool::SequenceToken();
-  thread_checker_.DetachFromThread();
-}
-
-void SequenceCheckerImpl::EnsureSequenceTokenAssigned() const {
-  lock_.AssertAcquired();
-  if (is_assigned_)
-    return;
-
-  is_assigned_ = true;
-  sequence_token_ = SequenceToken::GetForCurrentThread();
-  sequenced_worker_pool_token_ =
-      SequencedWorkerPool::GetSequenceTokenForCurrentThread();
-
-  // SequencedWorkerPool doesn't use SequenceToken and code outside of
-  // SequenceWorkerPool doesn't set a SequencedWorkerPool token.
-  DCHECK(!sequence_token_.IsValid() || !sequenced_worker_pool_token_.IsValid());
+  core_.reset();
 }
 
 }  // namespace base