Move SequenceChecker header to API: step 1, move header only

Bug: webrtc:12419
Change-Id: I54db9a594f56d051a295167ca5997351443a0f2e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/205380
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33189}
diff --git a/BUILD.gn b/BUILD.gn
index 8d9a76b..c0b47d5 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -555,7 +555,6 @@
       "rtc_base:untyped_function_unittest",
       "rtc_base:weak_ptr_unittests",
       "rtc_base/experiments:experiments_unittests",
-      "rtc_base/synchronization:sequence_checker_unittests",
       "rtc_base/task_utils:pending_task_safety_flag_unittests",
       "rtc_base/task_utils:to_queued_task_unittests",
       "sdk:sdk_tests",
diff --git a/api/BUILD.gn b/api/BUILD.gn
index fd952ab..fba4411 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -706,6 +706,16 @@
   deps = [ "../rtc_base:checks" ]
 }
 
+rtc_source_set("sequence_checker") {
+  visibility = [ "*" ]
+  sources = [ "sequence_checker.h" ]
+  deps = [
+    "../rtc_base:checks",
+    "../rtc_base:macromagic",
+    "../rtc_base/synchronization:sequence_checker_internal",
+  ]
+}
+
 if (rtc_include_tests) {
   if (rtc_enable_protobuf && !build_with_chromium) {
     rtc_library("audioproc_f_api") {
@@ -1039,6 +1049,7 @@
       "rtp_packet_infos_unittest.cc",
       "rtp_parameters_unittest.cc",
       "scoped_refptr_unittest.cc",
+      "sequence_checker_unittest.cc",
       "test/create_time_controller_unittest.cc",
     ]
 
@@ -1052,11 +1063,13 @@
       ":rtp_packet_info",
       ":rtp_parameters",
       ":scoped_refptr",
+      ":sequence_checker",
       ":time_controller",
       "../rtc_base:checks",
       "../rtc_base:gunit_helpers",
       "../rtc_base:rtc_base_approved",
       "../rtc_base:rtc_task_queue",
+      "../rtc_base:task_queue_for_test",
       "../rtc_base/task_utils:repeating_task",
       "../test:fileutils",
       "../test:test_support",
diff --git a/api/DEPS b/api/DEPS
index 21afca9..ffa9e98 100644
--- a/api/DEPS
+++ b/api/DEPS
@@ -277,6 +277,11 @@
     "+rtc_base/ref_count.h",
   ],
 
+  "sequence_checker\.h": [
+    "+rtc_base/synchronization/sequence_checker_internal.h",
+    "+rtc_base/thread_annotations.h",
+  ],
+
   # .cc files in api/ should not be restricted in what they can #include,
   # so we re-add all the top-level directories here. (That's because .h
   # files leak their #includes to whoever's #including them, but .cc files
diff --git a/api/sequence_checker.h b/api/sequence_checker.h
new file mode 100644
index 0000000..6b46128
--- /dev/null
+++ b/api/sequence_checker.h
@@ -0,0 +1,116 @@
+/*
+ *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+#ifndef API_SEQUENCE_CHECKER_H_
+#define API_SEQUENCE_CHECKER_H_
+
+#include "rtc_base/checks.h"
+#include "rtc_base/synchronization/sequence_checker_internal.h"
+#include "rtc_base/thread_annotations.h"
+
+namespace webrtc {
+
+// SequenceChecker is a helper class used to help verify that some methods
+// of a class are called on the same task queue or thread. A
+// SequenceChecker is bound to a a task queue if the object is
+// created on a task queue, or a thread otherwise.
+//
+//
+// Example:
+// class MyClass {
+//  public:
+//   void Foo() {
+//     RTC_DCHECK_RUN_ON(sequence_checker_);
+//     ... (do stuff) ...
+//   }
+//
+//  private:
+//   SequenceChecker sequence_checker_;
+// }
+//
+// In Release mode, IsCurrent will always return true.
+class RTC_LOCKABLE SequenceChecker
+#if RTC_DCHECK_IS_ON
+    : public webrtc_sequence_checker_internal::SequenceCheckerImpl {
+  using Impl = webrtc_sequence_checker_internal::SequenceCheckerImpl;
+#else
+    : public webrtc_sequence_checker_internal::SequenceCheckerDoNothing {
+  using Impl = webrtc_sequence_checker_internal::SequenceCheckerDoNothing;
+#endif
+ public:
+  // Returns true if sequence checker is attached to the current sequence.
+  bool IsCurrent() const { return Impl::IsCurrent(); }
+  // Detaches checker from sequence to which it is attached. Next attempt
+  // to do a check with this checker will result in attaching this checker
+  // to the sequence on which check was performed.
+  void Detach() { Impl::Detach(); }
+};
+
+}  // namespace webrtc
+
+// RTC_RUN_ON/RTC_GUARDED_BY/RTC_DCHECK_RUN_ON macros allows to annotate
+// variables are accessed from same thread/task queue.
+// Using tools designed to check mutexes, it checks at compile time everywhere
+// variable is access, there is a run-time dcheck thread/task queue is correct.
+//
+// class SequenceCheckerExample {
+//  public:
+//   int CalledFromPacer() RTC_RUN_ON(pacer_sequence_checker_) {
+//     return var2_;
+//   }
+//
+//   void CallMeFromPacer() {
+//     RTC_DCHECK_RUN_ON(&pacer_sequence_checker_)
+//        << "Should be called from pacer";
+//     CalledFromPacer();
+//   }
+//
+//  private:
+//   int pacer_var_ RTC_GUARDED_BY(pacer_sequence_checker_);
+//   SequenceChecker pacer_sequence_checker_;
+// };
+//
+// class TaskQueueExample {
+//  public:
+//   class Encoder {
+//    public:
+//     rtc::TaskQueueBase& Queue() { return encoder_queue_; }
+//     void Encode() {
+//       RTC_DCHECK_RUN_ON(&encoder_queue_);
+//       DoSomething(var_);
+//     }
+//
+//    private:
+//     rtc::TaskQueueBase& encoder_queue_;
+//     Frame var_ RTC_GUARDED_BY(encoder_queue_);
+//   };
+//
+//   void Encode() {
+//     // Will fail at runtime when DCHECK is enabled:
+//     // encoder_->Encode();
+//     // Will work:
+//     rtc::scoped_refptr<Encoder> encoder = encoder_;
+//     encoder_->Queue().PostTask([encoder] { encoder->Encode(); });
+//   }
+//
+//  private:
+//   rtc::scoped_refptr<Encoder> encoder_;
+// }
+
+// Document if a function expected to be called from same thread/task queue.
+#define RTC_RUN_ON(x) \
+  RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(x))
+
+#define RTC_DCHECK_RUN_ON(x)                                     \
+  webrtc::webrtc_sequence_checker_internal::SequenceCheckerScope \
+      seq_check_scope(x);                                        \
+  RTC_DCHECK((x)->IsCurrent())                                   \
+      << webrtc::webrtc_sequence_checker_internal::ExpectationToString(x)
+
+#endif  // API_SEQUENCE_CHECKER_H_
diff --git a/rtc_base/synchronization/sequence_checker_unittest.cc b/api/sequence_checker_unittest.cc
similarity index 97%
rename from rtc_base/synchronization/sequence_checker_unittest.cc
rename to api/sequence_checker_unittest.cc
index ff91b0a..4029b8c 100644
--- a/rtc_base/synchronization/sequence_checker_unittest.cc
+++ b/api/sequence_checker_unittest.cc
@@ -8,7 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "rtc_base/synchronization/sequence_checker.h"
+#include "api/sequence_checker.h"
 
 #include <memory>
 #include <utility>
@@ -16,7 +16,6 @@
 #include "api/function_view.h"
 #include "rtc_base/event.h"
 #include "rtc_base/platform_thread.h"
-#include "rtc_base/synchronization/sequence_checker.h"
 #include "rtc_base/task_queue_for_test.h"
 #include "test/gtest.h"
 
diff --git a/rtc_base/synchronization/BUILD.gn b/rtc_base/synchronization/BUILD.gn
index 29e46b4..55c5fa8 100644
--- a/rtc_base/synchronization/BUILD.gn
+++ b/rtc_base/synchronization/BUILD.gn
@@ -46,16 +46,11 @@
 
 rtc_source_set("sequence_checker") {
   sources = [ "sequence_checker.h" ]
-  deps = [
-    ":sequence_checker_internal",
-    "..:checks",
-    "..:deprecation",
-    "..:macromagic",
-  ]
+  deps = [ "../../api:sequence_checker" ]
 }
 
 rtc_library("sequence_checker_internal") {
-  visibility = [ ":sequence_checker" ]
+  visibility = [ "../../api:sequence_checker" ]
   sources = [
     "sequence_checker_internal.cc",
     "sequence_checker_internal.h",
@@ -115,21 +110,4 @@
       ]
     }
   }
-
-  if (!build_with_chromium) {
-    rtc_library("sequence_checker_unittests") {
-      testonly = true
-
-      sources = [ "sequence_checker_unittest.cc" ]
-      deps = [
-        ":sequence_checker",
-        "..:checks",
-        "..:rtc_base_approved",
-        "..:task_queue_for_test",
-        "../../api:function_view",
-        "../../test:test_main",
-        "../../test:test_support",
-      ]
-    }
-  }
 }
diff --git a/rtc_base/synchronization/sequence_checker.h b/rtc_base/synchronization/sequence_checker.h
index abf0ebf..52577bc 100644
--- a/rtc_base/synchronization/sequence_checker.h
+++ b/rtc_base/synchronization/sequence_checker.h
@@ -7,115 +7,5 @@
  *  in the file PATENTS.  All contributing project authors may
  *  be found in the AUTHORS file in the root of the source tree.
  */
-#ifndef RTC_BASE_SYNCHRONIZATION_SEQUENCE_CHECKER_H_
-#define RTC_BASE_SYNCHRONIZATION_SEQUENCE_CHECKER_H_
 
-#include <type_traits>
-
-#include "rtc_base/checks.h"
-#include "rtc_base/deprecation.h"
-#include "rtc_base/synchronization/sequence_checker_internal.h"
-#include "rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-// SequenceChecker is a helper class used to help verify that some methods
-// of a class are called on the same task queue or thread. A
-// SequenceChecker is bound to a a task queue if the object is
-// created on a task queue, or a thread otherwise.
-//
-//
-// Example:
-// class MyClass {
-//  public:
-//   void Foo() {
-//     RTC_DCHECK_RUN_ON(sequence_checker_);
-//     ... (do stuff) ...
-//   }
-//
-//  private:
-//   SequenceChecker sequence_checker_;
-// }
-//
-// In Release mode, IsCurrent will always return true.
-#if RTC_DCHECK_IS_ON
-class RTC_LOCKABLE SequenceChecker
-    : public webrtc_sequence_checker_internal::SequenceCheckerImpl {};
-#else
-class RTC_LOCKABLE SequenceChecker
-    : public webrtc_sequence_checker_internal::SequenceCheckerDoNothing {};
-#endif  // RTC_ENABLE_THREAD_CHECKER
-
-}  // namespace webrtc
-
-// RTC_RUN_ON/RTC_GUARDED_BY/RTC_DCHECK_RUN_ON macros allows to annotate
-// variables are accessed from same thread/task queue.
-// Using tools designed to check mutexes, it checks at compile time everywhere
-// variable is access, there is a run-time dcheck thread/task queue is correct.
-//
-// class ThreadExample {
-//  public:
-//   void NeedVar1() {
-//     RTC_DCHECK_RUN_ON(network_thread_);
-//     transport_->Send();
-//   }
-//
-//  private:
-//   rtc::Thread* network_thread_;
-//   int transport_ RTC_GUARDED_BY(network_thread_);
-// };
-//
-// class SequenceCheckerExample {
-//  public:
-//   int CalledFromPacer() RTC_RUN_ON(pacer_sequence_checker_) {
-//     return var2_;
-//   }
-//
-//   void CallMeFromPacer() {
-//     RTC_DCHECK_RUN_ON(&pacer_sequence_checker_)
-//        << "Should be called from pacer";
-//     CalledFromPacer();
-//   }
-//
-//  private:
-//   int pacer_var_ RTC_GUARDED_BY(pacer_sequence_checker_);
-//   SequenceChecker pacer_sequence_checker_;
-// };
-//
-// class TaskQueueExample {
-//  public:
-//   class Encoder {
-//    public:
-//     rtc::TaskQueue* Queue() { return encoder_queue_; }
-//     void Encode() {
-//       RTC_DCHECK_RUN_ON(encoder_queue_);
-//       DoSomething(var_);
-//     }
-//
-//    private:
-//     rtc::TaskQueue* const encoder_queue_;
-//     Frame var_ RTC_GUARDED_BY(encoder_queue_);
-//   };
-//
-//   void Encode() {
-//     // Will fail at runtime when DCHECK is enabled:
-//     // encoder_->Encode();
-//     // Will work:
-//     rtc::scoped_refptr<Encoder> encoder = encoder_;
-//     encoder_->Queue()->PostTask([encoder] { encoder->Encode(); });
-//   }
-//
-//  private:
-//   rtc::scoped_refptr<Encoder> encoder_;
-// }
-
-// Document if a function expected to be called from same thread/task queue.
-#define RTC_RUN_ON(x) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(x))
-
-#define RTC_DCHECK_RUN_ON(x)                                               \
-  webrtc::webrtc_sequence_checker_internal::SequenceCheckerScope scope(x); \
-  RTC_DCHECK((x)->IsCurrent())                                             \
-      << webrtc::webrtc_sequence_checker_internal::ExpectationToString(x)
-
-#endif  // RTC_BASE_SYNCHRONIZATION_SEQUENCE_CHECKER_H_
+#include "api/sequence_checker.h"