aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext/lb_policy/pick_first
diff options
context:
space:
mode:
authorGravatar David Garcia Quintas <dgq@google.com>2016-04-27 18:40:50 -0700
committerGravatar David Garcia Quintas <dgq@google.com>2016-04-27 18:40:50 -0700
commitd312a0b866b0223bf9d5a2c88530a5cd7005c990 (patch)
treef13b5748c9d83c6177b8ae6f22422af29ef9d803 /src/core/ext/lb_policy/pick_first
parent879b3b9efa634ab683fccc96261af6e7838e6b31 (diff)
Smarter pollset/pollset_set propagation
For some definition of "smart"... client_channel simply passes along pollset/pollset_set, removing the need to instantiate a pollset_set in the subchannel_call_holder: it's now up to the LB policies to handle the pollset/pollset_set.
Diffstat (limited to 'src/core/ext/lb_policy/pick_first')
-rw-r--r--src/core/ext/lb_policy/pick_first/pick_first.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/core/ext/lb_policy/pick_first/pick_first.c b/src/core/ext/lb_policy/pick_first/pick_first.c
index 0ffa003946..f6613298be 100644
--- a/src/core/ext/lb_policy/pick_first/pick_first.c
+++ b/src/core/ext/lb_policy/pick_first/pick_first.c
@@ -35,11 +35,13 @@
#include <grpc/support/alloc.h>
#include "src/core/ext/client_config/lb_policy_registry.h"
+#include "src/core/ext/lb_policy/common.h"
#include "src/core/lib/transport/connectivity_state.h"
typedef struct pending_pick {
struct pending_pick *next;
- grpc_pollset_set *pollset_set;
+ grpc_pollset *pollset;
+ grpc_pollset_set *pollset_set_alternative;
uint32_t initial_metadata_flags;
grpc_connected_subchannel **target;
grpc_closure *on_complete;
@@ -118,8 +120,9 @@ static void pf_shutdown(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
while (pp != NULL) {
pending_pick *next = pp->next;
*pp->target = NULL;
- grpc_pollset_set_del_pollset_set(exec_ctx, p->base.interested_parties,
- pp->pollset_set);
+ del_pollset_or_pollset_set_alternative(exec_ctx, p->base.interested_parties,
+ pp->pollset,
+ pp->pollset_set_alternative);
grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, true, NULL);
gpr_free(pp);
pp = next;
@@ -136,8 +139,9 @@ static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
while (pp != NULL) {
pending_pick *next = pp->next;
if (pp->target == target) {
- grpc_pollset_set_del_pollset_set(exec_ctx, p->base.interested_parties,
- pp->pollset_set);
+ del_pollset_or_pollset_set_alternative(
+ exec_ctx, p->base.interested_parties, pp->pollset,
+ pp->pollset_set_alternative);
*target = NULL;
grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, false, NULL);
gpr_free(pp);
@@ -162,8 +166,9 @@ static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
pending_pick *next = pp->next;
if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
initial_metadata_flags_eq) {
- grpc_pollset_set_del_pollset_set(exec_ctx, p->base.interested_parties,
- pp->pollset_set);
+ del_pollset_or_pollset_set_alternative(
+ exec_ctx, p->base.interested_parties, pp->pollset,
+ pp->pollset_set_alternative);
grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, false, NULL);
gpr_free(pp);
} else {
@@ -196,7 +201,8 @@ static void pf_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
}
static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
- grpc_pollset_set *pollset_set,
+ grpc_pollset *pollset,
+ grpc_pollset_set *pollset_set_alternative,
grpc_metadata_batch *initial_metadata,
uint32_t initial_metadata_flags,
grpc_connected_subchannel **target,
@@ -222,11 +228,12 @@ static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
if (!p->started_picking) {
start_picking(exec_ctx, p);
}
- grpc_pollset_set_add_pollset_set(exec_ctx, p->base.interested_parties,
- pollset_set);
+ add_pollset_or_pollset_set_alternative(exec_ctx, p->base.interested_parties,
+ pollset, pollset_set_alternative);
pp = gpr_malloc(sizeof(*pp));
pp->next = p->pending_picks;
- pp->pollset_set = pollset_set;
+ pp->pollset = pollset;
+ pp->pollset_set_alternative = pollset_set_alternative;
pp->target = target;
pp->initial_metadata_flags = initial_metadata_flags;
pp->on_complete = on_complete;
@@ -306,8 +313,9 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg,
while ((pp = p->pending_picks)) {
p->pending_picks = pp->next;
*pp->target = selected;
- grpc_pollset_set_del_pollset_set(exec_ctx, p->base.interested_parties,
- pp->pollset_set);
+ del_pollset_or_pollset_set_alternative(
+ exec_ctx, p->base.interested_parties, pp->pollset,
+ pp->pollset_set_alternative);
grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, true, NULL);
gpr_free(pp);
}