aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Mark D. Roth <roth@google.com>2016-09-13 11:17:33 -0700
committerGravatar Mark D. Roth <roth@google.com>2016-09-13 11:17:33 -0700
commitd316beff3c9c135ec1e60bf9182f7968e73790c6 (patch)
treea9656e5e252a9afde6584c16e7ea52f1d3492d14 /src/core
parent673de79a0e4ad81eae7b371a5dfd3313487801c5 (diff)
parent1beb35b24b277598b9101f122de4cf8400973e96 (diff)
Merge branch 'grpclb_resolver_changes2' into service_config
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ext/client_config/resolver_result.c171
-rw-r--r--src/core/ext/client_config/resolver_result.h172
2 files changed, 172 insertions, 171 deletions
diff --git a/src/core/ext/client_config/resolver_result.c b/src/core/ext/client_config/resolver_result.c
index 417dc4caa8..c70c8d3ffa 100644
--- a/src/core/ext/client_config/resolver_result.c
+++ b/src/core/ext/client_config/resolver_result.c
@@ -1,35 +1,33 @@
-/*
- *
- * Copyright 2015, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
+//
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
#include "src/core/ext/client_config/resolver_result.h"
@@ -40,10 +38,12 @@
#include "src/core/lib/transport/metadata.h"
-/* grpc_addresses */
+//
+// grpc_addresses
+//
-grpc_addresses *grpc_addresses_create(size_t num_addresses) {
- grpc_addresses *addresses = gpr_malloc(sizeof(grpc_addresses));
+grpc_addresses* grpc_addresses_create(size_t num_addresses) {
+ grpc_addresses* addresses = gpr_malloc(sizeof(grpc_addresses));
addresses->num_addresses = num_addresses;
const size_t addresses_size = sizeof(grpc_address) * num_addresses;
addresses->addresses = gpr_malloc(addresses_size);
@@ -51,29 +51,31 @@ grpc_addresses *grpc_addresses_create(size_t num_addresses) {
return addresses;
}
-grpc_addresses *grpc_addresses_copy(grpc_addresses* addresses) {
- grpc_addresses *new = grpc_addresses_create(addresses->num_addresses);
+grpc_addresses* grpc_addresses_copy(grpc_addresses* addresses) {
+ grpc_addresses* new = grpc_addresses_create(addresses->num_addresses);
memcpy(new->addresses, addresses->addresses,
sizeof(grpc_address) * addresses->num_addresses);
return new;
}
-void grpc_addresses_set_address(grpc_addresses *addresses, size_t index,
- void *address, size_t address_len,
+void grpc_addresses_set_address(grpc_addresses* addresses, size_t index,
+ void* address, size_t address_len,
bool is_balancer) {
GPR_ASSERT(index < addresses->num_addresses);
- grpc_address *target = &addresses->addresses[index];
+ grpc_address* target = &addresses->addresses[index];
memcpy(target->address.addr, address, address_len);
target->address.len = address_len;
target->is_balancer = is_balancer;
}
-void grpc_addresses_destroy(grpc_addresses *addresses) {
+void grpc_addresses_destroy(grpc_addresses* addresses) {
gpr_free(addresses->addresses);
gpr_free(addresses);
}
-/* grpc_method_config */
+//
+// grpc_method_config
+//
struct grpc_method_config {
gpr_refcount refs;
@@ -83,10 +85,10 @@ struct grpc_method_config {
int32_t* max_response_message_bytes;
};
-grpc_method_config *grpc_method_config_create(
- bool *wait_for_ready, gpr_timespec *timeout,
- int32_t *max_request_message_bytes, int32_t *max_response_message_bytes) {
- grpc_method_config *config = gpr_malloc(sizeof(*config));
+grpc_method_config* grpc_method_config_create(
+ bool* wait_for_ready, gpr_timespec* timeout,
+ int32_t* max_request_message_bytes, int32_t* max_response_message_bytes) {
+ grpc_method_config* config = gpr_malloc(sizeof(*config));
memset(config, 0, sizeof(*config));
gpr_ref_init(&config->refs, 1);
if (wait_for_ready != NULL) {
@@ -110,12 +112,12 @@ grpc_method_config *grpc_method_config_create(
return config;
}
-grpc_method_config *grpc_method_config_ref(grpc_method_config *method_config) {
+grpc_method_config* grpc_method_config_ref(grpc_method_config* method_config) {
gpr_ref(&method_config->refs);
return method_config;
}
-void grpc_method_config_unref(grpc_method_config *method_config) {
+void grpc_method_config_unref(grpc_method_config* method_config) {
if (gpr_unref(&method_config->refs)) {
gpr_free(method_config->wait_for_ready);
gpr_free(method_config->timeout);
@@ -125,31 +127,32 @@ void grpc_method_config_unref(grpc_method_config *method_config) {
}
}
-bool* grpc_method_config_get_wait_for_ready(
- grpc_method_config *method_config) {
+bool* grpc_method_config_get_wait_for_ready(grpc_method_config* method_config) {
return method_config->wait_for_ready;
}
gpr_timespec* grpc_method_config_get_timeout(
- grpc_method_config *method_config) {
+ grpc_method_config* method_config) {
return method_config->timeout;
}
int32_t* grpc_method_config_get_max_request_message_bytes(
- grpc_method_config *method_config) {
+ grpc_method_config* method_config) {
return method_config->max_request_message_bytes;
}
int32_t* grpc_method_config_get_max_response_message_bytes(
- grpc_method_config *method_config) {
+ grpc_method_config* method_config) {
return method_config->max_response_message_bytes;
}
-/* method_config_table */
+//
+// method_config_table
+//
typedef struct method_config_table_entry {
- grpc_mdstr *path;
- grpc_method_config *method_config;
+ grpc_mdstr* path;
+ grpc_method_config* method_config;
} method_config_table_entry;
#define METHOD_CONFIG_TABLE_SIZE 128
@@ -163,7 +166,7 @@ static void method_config_table_init(method_config_table* table) {
static void method_config_table_destroy(method_config_table* table) {
for (size_t i = 0; i < GPR_ARRAY_SIZE(table->entries); ++i) {
- method_config_table_entry *entry = &table->entries[i];
+ method_config_table_entry* entry = &table->entries[i];
if (entry->path != NULL) {
GRPC_MDSTR_UNREF(entry->path);
grpc_method_config_unref(entry->method_config);
@@ -174,50 +177,51 @@ static void method_config_table_destroy(method_config_table* table) {
// Helper function for insert and get operations that performs quadratic
// probing (https://en.wikipedia.org/wiki/Quadratic_probing).
static size_t method_config_table_find_index(method_config_table* table,
- grpc_mdstr *path,
+ grpc_mdstr* path,
bool find_empty) {
for (size_t i = 0; i < GPR_ARRAY_SIZE(table->entries); ++i) {
const size_t idx = (path->hash + i * i) % GPR_ARRAY_SIZE(table->entries);
if (table->entries[idx].path == NULL)
return find_empty ? idx : GPR_ARRAY_SIZE(table->entries);
- if (table->entries[idx].path == path)
- return idx;
+ if (table->entries[idx].path == path) return idx;
}
return GPR_ARRAY_SIZE(table->entries) + 1; // Not found.
}
static void method_config_table_insert(method_config_table* table,
- grpc_mdstr *path,
- grpc_method_config *config) {
+ grpc_mdstr* path,
+ grpc_method_config* config) {
const size_t idx =
method_config_table_find_index(table, path, true /* find_empty */);
// This can happen if the table is full.
GPR_ASSERT(idx != GPR_ARRAY_SIZE(table->entries));
- method_config_table_entry *entry = &table->entries[idx];
+ method_config_table_entry* entry = &table->entries[idx];
entry->path = GRPC_MDSTR_REF(path);
entry->method_config = grpc_method_config_ref(config);
}
-static grpc_method_config *method_config_table_get(method_config_table* table,
- grpc_mdstr *path) {
+static grpc_method_config* method_config_table_get(method_config_table* table,
+ grpc_mdstr* path) {
const size_t idx =
method_config_table_find_index(table, path, false /* find_empty */);
if (idx == GPR_ARRAY_SIZE(table->entries)) return NULL; // Not found.
return table->entries[idx].method_config;
}
-/* grpc_resolver_result */
+//
+// grpc_resolver_result
+//
struct grpc_resolver_result {
gpr_refcount refs;
- grpc_addresses *addresses;
- char *lb_policy_name;
+ grpc_addresses* addresses;
+ char* lb_policy_name;
method_config_table method_configs;
};
-grpc_resolver_result *grpc_resolver_result_create(grpc_addresses *addresses,
- const char *lb_policy_name) {
- grpc_resolver_result *result = gpr_malloc(sizeof(*result));
+grpc_resolver_result* grpc_resolver_result_create(grpc_addresses* addresses,
+ const char* lb_policy_name) {
+ grpc_resolver_result* result = gpr_malloc(sizeof(*result));
memset(result, 0, sizeof(*result));
gpr_ref_init(&result->refs, 1);
result->addresses = addresses;
@@ -226,12 +230,12 @@ grpc_resolver_result *grpc_resolver_result_create(grpc_addresses *addresses,
return result;
}
-void grpc_resolver_result_ref(grpc_resolver_result *result) {
+void grpc_resolver_result_ref(grpc_resolver_result* result) {
gpr_ref(&result->refs);
}
-void grpc_resolver_result_unref(grpc_exec_ctx *exec_ctx,
- grpc_resolver_result *result) {
+void grpc_resolver_result_unref(grpc_exec_ctx* exec_ctx,
+ grpc_resolver_result* result) {
if (gpr_unref(&result->refs)) {
grpc_addresses_destroy(result->addresses);
gpr_free(result->lb_policy_name);
@@ -240,26 +244,27 @@ void grpc_resolver_result_unref(grpc_exec_ctx *exec_ctx,
}
}
-grpc_addresses *grpc_resolver_result_get_addresses(
- grpc_resolver_result *result) {
+grpc_addresses* grpc_resolver_result_get_addresses(
+ grpc_resolver_result* result) {
return result->addresses;
}
-const char *grpc_resolver_result_get_lb_policy_name(
- grpc_resolver_result *result) {
+const char* grpc_resolver_result_get_lb_policy_name(
+ grpc_resolver_result* result) {
return result->lb_policy_name;
}
-void grpc_resolver_result_add_method_config(
- grpc_resolver_result *result, grpc_mdstr **paths, size_t num_paths,
- grpc_method_config *method_config) {
+void grpc_resolver_result_add_method_config(grpc_resolver_result* result,
+ grpc_mdstr** paths,
+ size_t num_paths,
+ grpc_method_config* method_config) {
for (size_t i = 0; i < num_paths; ++i) {
method_config_table_insert(&result->method_configs, paths[i],
method_config);
}
}
-grpc_method_config *grpc_resolver_result_get_method_config(
- grpc_resolver_result *result, grpc_mdstr *path) {
+grpc_method_config* grpc_resolver_result_get_method_config(
+ grpc_resolver_result* result, grpc_mdstr* path) {
return method_config_table_get(&result->method_configs, path);
}
diff --git a/src/core/ext/client_config/resolver_result.h b/src/core/ext/client_config/resolver_result.h
index 877c0fb744..8402bb581d 100644
--- a/src/core/ext/client_config/resolver_result.h
+++ b/src/core/ext/client_config/resolver_result.h
@@ -1,35 +1,33 @@
-/*
- *
- * Copyright 2015, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
+//
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
#ifndef GRPC_CORE_EXT_CLIENT_CONFIG_RESOLVER_RESULT_H
#define GRPC_CORE_EXT_CLIENT_CONFIG_RESOLVER_RESULT_H
@@ -39,8 +37,7 @@
#include "src/core/ext/client_config/lb_policy.h"
#include "src/core/lib/iomgr/resolve_address.h"
-/** Used to represent addresses returned by the resolver. */
-
+/// Used to represent addresses returned by the resolver.
typedef struct grpc_address {
grpc_resolved_address address;
bool is_balancer;
@@ -48,76 +45,75 @@ typedef struct grpc_address {
typedef struct grpc_addresses {
size_t num_addresses;
- grpc_address *addresses;
+ grpc_address* addresses;
} grpc_addresses;
-/** Returns a grpc_addresses struct with enough space for
- \a num_addresses addresses. */
-grpc_addresses *grpc_addresses_create(size_t num_addresses);
+/// Returns a grpc_addresses struct with enough space for
+/// \a num_addresses addresses.
+grpc_addresses* grpc_addresses_create(size_t num_addresses);
-grpc_addresses *grpc_addresses_copy(grpc_addresses* addresses);
+grpc_addresses* grpc_addresses_copy(grpc_addresses* addresses);
-void grpc_addresses_set_address(grpc_addresses *addresses, size_t index,
- void *address, size_t address_len,
+void grpc_addresses_set_address(grpc_addresses* addresses, size_t index,
+ void* address, size_t address_len,
bool is_balancer);
-void grpc_addresses_destroy(grpc_addresses *addresses);
+void grpc_addresses_destroy(grpc_addresses* addresses);
-/** Per-method configuration. */
+/// Per-method configuration.
typedef struct grpc_method_config grpc_method_config;
-/** Any parameter may be NULL to indicate that the value is unset. */
-grpc_method_config *grpc_method_config_create(
- bool *wait_for_ready, gpr_timespec *timeout,
- int32_t *max_request_message_bytes, int32_t *max_response_message_bytes);
+/// Any parameter may be NULL to indicate that the value is unset.
+grpc_method_config* grpc_method_config_create(
+ bool* wait_for_ready, gpr_timespec* timeout,
+ int32_t* max_request_message_bytes, int32_t* max_response_message_bytes);
-grpc_method_config *grpc_method_config_ref(grpc_method_config *method_config);
-void grpc_method_config_unref(grpc_method_config *method_config);
+grpc_method_config* grpc_method_config_ref(grpc_method_config* method_config);
+void grpc_method_config_unref(grpc_method_config* method_config);
-/** These methods return NULL if the requested field is unset.
- The caller does NOT take ownership of the result. */
-bool *grpc_method_config_get_wait_for_ready(
- grpc_method_config *method_config);
-gpr_timespec* grpc_method_config_get_timeout(grpc_method_config *method_config);
+/// These methods return NULL if the requested field is unset.
+/// The caller does NOT take ownership of the result.
+bool* grpc_method_config_get_wait_for_ready(grpc_method_config* method_config);
+gpr_timespec* grpc_method_config_get_timeout(grpc_method_config* method_config);
int32_t* grpc_method_config_get_max_request_message_bytes(
- grpc_method_config *method_config);
+ grpc_method_config* method_config);
int32_t* grpc_method_config_get_max_response_message_bytes(
- grpc_method_config *method_config);
-
-/** Results reported from a grpc_resolver. */
+ grpc_method_config* method_config);
+/// Results reported from a grpc_resolver.
typedef struct grpc_resolver_result grpc_resolver_result;
-/** Takes ownership of \a addresses. */
-grpc_resolver_result *grpc_resolver_result_create(grpc_addresses *addresses,
- const char *lb_policy_name);
-void grpc_resolver_result_ref(grpc_resolver_result *result);
-void grpc_resolver_result_unref(grpc_exec_ctx *exec_ctx,
- grpc_resolver_result *result);
-
-/** Caller does NOT take ownership of result. */
-grpc_addresses *grpc_resolver_result_get_addresses(
- grpc_resolver_result *result);
-
-/** Caller does NOT take ownership of result. */
-const char *grpc_resolver_result_get_lb_policy_name(
- grpc_resolver_result *result);
-
-/** Adds a method config. \a paths indicates the set of path names
- for which this config applies. Each name is of one of the following
- forms:
- service/method -- specifies exact service and method name
- service/\* -- matches all methods for the specified service
- * -- matches all methods for all services
- Takes new references to all elements of \a paths and to \a method_config. */
-void grpc_resolver_result_add_method_config(
- grpc_resolver_result *result, grpc_mdstr **paths, size_t num_paths,
- grpc_method_config *method_config);
-
-/** Returns NULL if the method has no config.
- Caller does NOT take ownership of result. */
-grpc_method_config *grpc_resolver_result_get_method_config(
- grpc_resolver_result *result, grpc_mdstr *path);
+/// Takes ownership of \a addresses.
+grpc_resolver_result* grpc_resolver_result_create(grpc_addresses* addresses,
+ const char* lb_policy_name);
+void grpc_resolver_result_ref(grpc_resolver_result* result);
+void grpc_resolver_result_unref(grpc_exec_ctx* exec_ctx,
+ grpc_resolver_result* result);
+
+/// Caller does NOT take ownership of result.
+grpc_addresses* grpc_resolver_result_get_addresses(
+ grpc_resolver_result* result);
+
+/// Caller does NOT take ownership of result.
+const char* grpc_resolver_result_get_lb_policy_name(
+ grpc_resolver_result* result);
+
+/// Adds a method config. \a paths indicates the set of path names
+/// for which this config applies. Each name is of one of the following
+/// forms:
+/// service/method -- specifies exact service and method name
+/// service/* -- matches all methods for the specified service
+/// * -- matches all methods for all services
+/// Takes new references to all elements of \a paths and to \a method_config.
+void grpc_resolver_result_add_method_config(grpc_resolver_result* result,
+ grpc_mdstr** paths,
+ size_t num_paths,
+ grpc_method_config* method_config);
+
+/// Returns NULL if the method has no config.
+/// Caller does NOT take ownership of result.
+grpc_method_config* grpc_resolver_result_get_method_config(
+ grpc_resolver_result* result, grpc_mdstr* path);
#endif /* GRPC_CORE_EXT_CLIENT_CONFIG_RESOLVER_RESULT_H */