Restructure QUICHE platform by splitting it into "default" and "overrides".

This demonstrates an example where a default is used directly in google3 (quic_mutex) and where a google3-specific override exists (quic_testvalue).

PiperOrigin-RevId: 354158548
Change-Id: I1036ede80cd354c494b43916fa1876d47891785a
diff --git a/common/platform/default/quiche_platform_impl/quic_mutex_impl.cc b/common/platform/default/quiche_platform_impl/quic_mutex_impl.cc
new file mode 100644
index 0000000..8c9081f
--- /dev/null
+++ b/common/platform/default/quiche_platform_impl/quic_mutex_impl.cc
@@ -0,0 +1,25 @@
+#include "quiche_platform_impl/quic_mutex_impl.h"
+
+namespace quic {
+
+void QuicLockImpl::WriterLock() {
+  mu_.WriterLock();
+}
+
+void QuicLockImpl::WriterUnlock() {
+  mu_.WriterUnlock();
+}
+
+void QuicLockImpl::ReaderLock() {
+  mu_.ReaderLock();
+}
+
+void QuicLockImpl::ReaderUnlock() {
+  mu_.ReaderUnlock();
+}
+
+void QuicLockImpl::AssertReaderHeld() const {
+  mu_.AssertReaderHeld();
+}
+
+}  // namespace quic
diff --git a/common/platform/default/quiche_platform_impl/quic_mutex_impl.h b/common/platform/default/quiche_platform_impl/quic_mutex_impl.h
new file mode 100644
index 0000000..b21ef7d
--- /dev/null
+++ b/common/platform/default/quiche_platform_impl/quic_mutex_impl.h
@@ -0,0 +1,68 @@
+#ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUIC_MUTEX_IMPL_H_
+#define QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUIC_MUTEX_IMPL_H_
+
+#include "absl/synchronization/mutex.h"
+#include "absl/synchronization/notification.h"
+#include "quic/platform/api/quic_export.h"
+
+#define QUIC_EXCLUSIVE_LOCKS_REQUIRED_IMPL ABSL_EXCLUSIVE_LOCKS_REQUIRED
+#define QUIC_GUARDED_BY_IMPL ABSL_GUARDED_BY
+#define QUIC_LOCKABLE_IMPL ABSL_LOCKABLE
+#define QUIC_LOCKS_EXCLUDED_IMPL ABSL_LOCKS_EXCLUDED
+#define QUIC_SHARED_LOCKS_REQUIRED_IMPL ABSL_SHARED_LOCKS_REQUIRED
+#define QUIC_EXCLUSIVE_LOCK_FUNCTION_IMPL ABSL_EXCLUSIVE_LOCK_FUNCTION
+#define QUIC_UNLOCK_FUNCTION_IMPL ABSL_UNLOCK_FUNCTION
+#define QUIC_SHARED_LOCK_FUNCTION_IMPL ABSL_SHARED_LOCK_FUNCTION
+#define QUIC_SCOPED_LOCKABLE_IMPL ABSL_SCOPED_LOCKABLE
+#define QUIC_ASSERT_SHARED_LOCK_IMPL ABSL_ASSERT_SHARED_LOCK
+
+namespace quic {
+
+// A class wrapping a non-reentrant mutex.
+class ABSL_LOCKABLE QUIC_EXPORT_PRIVATE QuicLockImpl {
+ public:
+  QuicLockImpl() = default;
+  QuicLockImpl(const QuicLockImpl&) = delete;
+  QuicLockImpl& operator=(const QuicLockImpl&) = delete;
+
+  // Block until mu_ is free, then acquire it exclusively.
+  void WriterLock() ABSL_EXCLUSIVE_LOCK_FUNCTION();
+
+  // Release mu_. Caller must hold it exclusively.
+  void WriterUnlock() ABSL_UNLOCK_FUNCTION();
+
+  // Block until mu_ is free or shared, then acquire a share of it.
+  void ReaderLock() ABSL_SHARED_LOCK_FUNCTION();
+
+  // Release mu_. Caller could hold it in shared mode.
+  void ReaderUnlock() ABSL_UNLOCK_FUNCTION();
+
+  // Returns immediately if current thread holds mu_ in at least shared
+  // mode.  Otherwise, reports an error by crashing with a diagnostic.
+  void AssertReaderHeld() const ABSL_ASSERT_SHARED_LOCK();
+
+ private:
+  absl::Mutex mu_;
+};
+
+// A Notification allows threads to receive notification of a single occurrence
+// of a single event.
+class QUIC_EXPORT_PRIVATE QuicNotificationImpl {
+ public:
+  QuicNotificationImpl() = default;
+  QuicNotificationImpl(const QuicNotificationImpl&) = delete;
+  QuicNotificationImpl& operator=(const QuicNotificationImpl&) = delete;
+
+  bool HasBeenNotified() { return notification_.HasBeenNotified(); }
+
+  void Notify() { notification_.Notify(); }
+
+  void WaitForNotification() { notification_.WaitForNotification(); }
+
+ private:
+  absl::Notification notification_;
+};
+
+}  // namespace quic
+
+#endif  // QUICHE_COMMON_PLATFORM_DEFAULT_QUICHE_PLATFORM_IMPL_QUIC_MUTEX_IMPL_H_
diff --git a/common/platform/default/quiche_platform_impl/quic_testvalue_impl.h b/common/platform/default/quiche_platform_impl/quic_testvalue_impl.h
new file mode 100644
index 0000000..f4678e7
--- /dev/null
+++ b/common/platform/default/quiche_platform_impl/quic_testvalue_impl.h
@@ -0,0 +1,13 @@
+#ifndef QUICHE_COMMON_PLATFORM_DEFAULT_QUIC_TESTVALUE_IMPL_H_
+#define QUICHE_COMMON_PLATFORM_DEFAULT_QUIC_TESTVALUE_IMPL_H_
+
+#include "absl/strings/string_view.h"
+
+namespace quic {
+
+template <class T>
+void AdjustTestValueImpl(absl::string_view /*label*/, T* /*var*/) {}
+
+}  // namespace quic
+
+#endif  // QUICHE_COMMON_PLATFORM_DEFAULT_QUIC_TESTVALUE_IMPL_H_
diff --git a/quic/platform/api/quic_mutex.h b/quic/platform/api/quic_mutex.h
index d35c660..33f01e4 100644
--- a/quic/platform/api/quic_mutex.h
+++ b/quic/platform/api/quic_mutex.h
@@ -5,7 +5,8 @@
 #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_MUTEX_H_
 #define QUICHE_QUIC_PLATFORM_API_QUIC_MUTEX_H_
 
-#include "net/quic/platform/impl/quic_mutex_impl.h"
+// TODO(b/178613777): move into the common QUICHE platform.
+#include "quiche_platform_impl/quic_mutex_impl.h"
 
 #define QUIC_EXCLUSIVE_LOCKS_REQUIRED QUIC_EXCLUSIVE_LOCKS_REQUIRED_IMPL
 #define QUIC_GUARDED_BY QUIC_GUARDED_BY_IMPL
diff --git a/quic/platform/api/quic_testvalue.h b/quic/platform/api/quic_testvalue.h
index 96ce968..58bc4f4 100644
--- a/quic/platform/api/quic_testvalue.h
+++ b/quic/platform/api/quic_testvalue.h
@@ -6,7 +6,9 @@
 #define QUICHE_QUIC_PLATFORM_API_QUIC_TESTVALUE_H_
 
 #include "absl/strings/string_view.h"
-#include "net/quic/platform/impl/quic_testvalue_impl.h"
+
+// TODO(b/178613777): move into the common QUICHE platform.
+#include "quiche_platform_impl/quic_testvalue_impl.h"
 
 namespace quic {