Built motion from commit 6a09e18b.|2.6.11
[motion2.git] / legacy-libs / grpc / deps / grpc / src / core / ext / filters / client_channel / subchannel_pool_interface.h
diff --git a/legacy-libs/grpc/deps/grpc/src/core/ext/filters/client_channel/subchannel_pool_interface.h b/legacy-libs/grpc/deps/grpc/src/core/ext/filters/client_channel/subchannel_pool_interface.h
new file mode 100644 (file)
index 0000000..eeb56fa
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ *
+ * Copyright 2018 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_POOL_INTERFACE_H
+#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_POOL_INTERFACE_H
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/avl/avl.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/gprpp/abstract.h"
+#include "src/core/lib/gprpp/ref_counted.h"
+
+namespace grpc_core {
+
+class Subchannel;
+
+extern TraceFlag grpc_subchannel_pool_trace;
+
+// A key that can uniquely identify a subchannel.
+class SubchannelKey {
+ public:
+  explicit SubchannelKey(const grpc_channel_args* args);
+  ~SubchannelKey();
+
+  // Copyable.
+  SubchannelKey(const SubchannelKey& other);
+  SubchannelKey& operator=(const SubchannelKey& other);
+  // Not movable.
+  SubchannelKey(SubchannelKey&&) = delete;
+  SubchannelKey& operator=(SubchannelKey&&) = delete;
+
+  int Cmp(const SubchannelKey& other) const;
+
+ private:
+  // Initializes the subchannel key with the given \a args and the function to
+  // copy channel args.
+  void Init(
+      const grpc_channel_args* args,
+      grpc_channel_args* (*copy_channel_args)(const grpc_channel_args* args));
+
+  const grpc_channel_args* args_;
+};
+
+// Interface for subchannel pool.
+// TODO(juanlishen): This refcounting mechanism may lead to memory leak.
+// To solve that, we should force polling to flush any pending callbacks, then
+// shut down safely. See https://github.com/grpc/grpc/issues/12560.
+class SubchannelPoolInterface : public RefCounted<SubchannelPoolInterface> {
+ public:
+  SubchannelPoolInterface() : RefCounted(&grpc_subchannel_pool_trace) {}
+  virtual ~SubchannelPoolInterface() {}
+
+  // Registers a subchannel against a key. Returns the subchannel registered
+  // with \a key, which may be different from \a constructed because we reuse
+  // (instead of update) any existing subchannel already registered with \a key.
+  virtual Subchannel* RegisterSubchannel(SubchannelKey* key,
+                                         Subchannel* constructed) GRPC_ABSTRACT;
+
+  // Removes the registered subchannel found by \a key.
+  virtual void UnregisterSubchannel(SubchannelKey* key) GRPC_ABSTRACT;
+
+  // Finds the subchannel registered for the given subchannel key. Returns NULL
+  // if no such channel exists. Thread-safe.
+  virtual Subchannel* FindSubchannel(SubchannelKey* key) GRPC_ABSTRACT;
+
+  // Creates a channel arg from \a subchannel pool.
+  static grpc_arg CreateChannelArg(SubchannelPoolInterface* subchannel_pool);
+
+  // Gets the subchannel pool from the channel args.
+  static SubchannelPoolInterface* GetSubchannelPoolFromChannelArgs(
+      const grpc_channel_args* args);
+
+  GRPC_ABSTRACT_BASE_CLASS
+};
+
+}  // namespace grpc_core
+
+#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SUBCHANNEL_POOL_INTERFACE_H */