|
|
@ -32,6 +32,7 @@ |
|
|
|
#include "src/core/ext/filters/client_channel/parse_address.h" |
|
|
|
#include "src/core/ext/filters/client_channel/parse_address.h" |
|
|
|
#include "src/core/ext/filters/client_channel/resolver_registry.h" |
|
|
|
#include "src/core/ext/filters/client_channel/resolver_registry.h" |
|
|
|
#include "src/core/lib/channel/channel_args.h" |
|
|
|
#include "src/core/lib/channel/channel_args.h" |
|
|
|
|
|
|
|
#include "src/core/lib/iomgr/closure.h" |
|
|
|
#include "src/core/lib/iomgr/combiner.h" |
|
|
|
#include "src/core/lib/iomgr/combiner.h" |
|
|
|
#include "src/core/lib/iomgr/resolve_address.h" |
|
|
|
#include "src/core/lib/iomgr/resolve_address.h" |
|
|
|
#include "src/core/lib/iomgr/unix_sockets_posix.h" |
|
|
|
#include "src/core/lib/iomgr/unix_sockets_posix.h" |
|
|
@ -125,7 +126,6 @@ static const grpc_resolver_vtable fake_resolver_vtable = { |
|
|
|
|
|
|
|
|
|
|
|
struct grpc_fake_resolver_response_generator { |
|
|
|
struct grpc_fake_resolver_response_generator { |
|
|
|
fake_resolver* resolver; // Set by the fake_resolver constructor to itself.
|
|
|
|
fake_resolver* resolver; // Set by the fake_resolver constructor to itself.
|
|
|
|
grpc_channel_args* next_response; |
|
|
|
|
|
|
|
gpr_refcount refcount; |
|
|
|
gpr_refcount refcount; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -151,19 +151,26 @@ void grpc_fake_resolver_response_generator_unref( |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void set_response_cb(grpc_exec_ctx* exec_ctx, void* arg, |
|
|
|
typedef struct set_response_closure_arg { |
|
|
|
grpc_error* error) { |
|
|
|
grpc_closure set_response_closure; |
|
|
|
grpc_fake_resolver_response_generator* generator = |
|
|
|
grpc_fake_resolver_response_generator* generator; |
|
|
|
(grpc_fake_resolver_response_generator*)arg; |
|
|
|
grpc_channel_args* next_response; |
|
|
|
|
|
|
|
} set_response_closure_arg; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void set_response_closure_fn(grpc_exec_ctx* exec_ctx, void* arg, |
|
|
|
|
|
|
|
grpc_error* error) { |
|
|
|
|
|
|
|
set_response_closure_arg* closure_arg = arg; |
|
|
|
|
|
|
|
grpc_fake_resolver_response_generator* generator = closure_arg->generator; |
|
|
|
fake_resolver* r = generator->resolver; |
|
|
|
fake_resolver* r = generator->resolver; |
|
|
|
if (r->next_results != NULL) { |
|
|
|
if (r->next_results != NULL) { |
|
|
|
grpc_channel_args_destroy(exec_ctx, r->next_results); |
|
|
|
grpc_channel_args_destroy(exec_ctx, r->next_results); |
|
|
|
} |
|
|
|
} |
|
|
|
r->next_results = generator->next_response; |
|
|
|
r->next_results = closure_arg->next_response; |
|
|
|
if (r->results_upon_error != NULL) { |
|
|
|
if (r->results_upon_error != NULL) { |
|
|
|
grpc_channel_args_destroy(exec_ctx, r->results_upon_error); |
|
|
|
grpc_channel_args_destroy(exec_ctx, r->results_upon_error); |
|
|
|
} |
|
|
|
} |
|
|
|
r->results_upon_error = grpc_channel_args_copy(generator->next_response); |
|
|
|
r->results_upon_error = grpc_channel_args_copy(closure_arg->next_response); |
|
|
|
|
|
|
|
gpr_free(closure_arg); |
|
|
|
fake_resolver_maybe_finish_next_locked(exec_ctx, r); |
|
|
|
fake_resolver_maybe_finish_next_locked(exec_ctx, r); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -171,12 +178,15 @@ void grpc_fake_resolver_response_generator_set_response( |
|
|
|
grpc_exec_ctx* exec_ctx, grpc_fake_resolver_response_generator* generator, |
|
|
|
grpc_exec_ctx* exec_ctx, grpc_fake_resolver_response_generator* generator, |
|
|
|
grpc_channel_args* next_response) { |
|
|
|
grpc_channel_args* next_response) { |
|
|
|
GPR_ASSERT(generator->resolver != NULL); |
|
|
|
GPR_ASSERT(generator->resolver != NULL); |
|
|
|
generator->next_response = grpc_channel_args_copy(next_response); |
|
|
|
set_response_closure_arg* closure_arg = gpr_zalloc(sizeof(*closure_arg)); |
|
|
|
GRPC_CLOSURE_SCHED( |
|
|
|
closure_arg->generator = generator; |
|
|
|
exec_ctx, GRPC_CLOSURE_CREATE(set_response_cb, generator, |
|
|
|
closure_arg->next_response = grpc_channel_args_copy(next_response); |
|
|
|
grpc_combiner_scheduler( |
|
|
|
GRPC_CLOSURE_SCHED(exec_ctx, |
|
|
|
generator->resolver->base.combiner)), |
|
|
|
GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, |
|
|
|
GRPC_ERROR_NONE); |
|
|
|
set_response_closure_fn, closure_arg, |
|
|
|
|
|
|
|
grpc_combiner_scheduler( |
|
|
|
|
|
|
|
generator->resolver->base.combiner)), |
|
|
|
|
|
|
|
GRPC_ERROR_NONE); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void* response_generator_arg_copy(void* p) { |
|
|
|
static void* response_generator_arg_copy(void* p) { |
|
|
|