diff options
-rw-r--r-- | src/core/client_config/connector.c | 16 | ||||
-rw-r--r-- | src/core/client_config/connector.h | 11 | ||||
-rw-r--r-- | src/core/client_config/resolver_factory.c | 15 | ||||
-rw-r--r-- | src/core/client_config/subchannel.c | 28 | ||||
-rw-r--r-- | src/core/client_config/subchannel.h | 17 | ||||
-rw-r--r-- | src/core/client_config/subchannel_factory.h | 14 | ||||
-rw-r--r-- | src/core/surface/channel_create.c | 53 |
7 files changed, 107 insertions, 47 deletions
diff --git a/src/core/client_config/connector.c b/src/core/client_config/connector.c index c9115ac93a..c3a8962ea6 100644 --- a/src/core/client_config/connector.c +++ b/src/core/client_config/connector.c @@ -33,3 +33,19 @@ #include "src/core/client_config/connector.h" +void grpc_connector_ref(grpc_connector *connector) { + connector->vtable->ref(connector); +} + +void grpc_connector_unref(grpc_connector *connector) { + connector->vtable->unref(connector); +} + +void grpc_connector_connect(grpc_connector *connector, + const grpc_channel_args *channel_args, + grpc_mdctx *metadata_context, + grpc_transport **transport, + grpc_iomgr_closure *notify) { + connector->vtable->connect(connector, channel_args, metadata_context, + transport, notify); +} diff --git a/src/core/client_config/connector.h b/src/core/client_config/connector.h index 0985432761..8ada75ec70 100644 --- a/src/core/client_config/connector.h +++ b/src/core/client_config/connector.h @@ -46,11 +46,18 @@ struct grpc_connector { struct grpc_connector_vtable { void (*ref)(grpc_connector *connector); void (*unref)(grpc_connector *connector); - void (*connect)(grpc_connector *connector, const grpc_channel_args *channel_args, grpc_mdctx *metadata_context, grpc_transport **transport, grpc_iomgr_closure *notify); + void (*connect)(grpc_connector *connector, + const grpc_channel_args *channel_args, + grpc_mdctx *metadata_context, grpc_transport **transport, + grpc_iomgr_closure *notify); }; void grpc_connector_ref(grpc_connector *connector); void grpc_connector_unref(grpc_connector *connector); -void grpc_connector_connect(grpc_connector *connector, const grpc_channel_args *channel_args, grpc_mdctx *metadata_context, grpc_transport **transport, grpc_iomgr_closure *notify); +void grpc_connector_connect(grpc_connector *connector, + const grpc_channel_args *channel_args, + grpc_mdctx *metadata_context, + grpc_transport **transport, + grpc_iomgr_closure *notify); #endif diff --git a/src/core/client_config/resolver_factory.c b/src/core/client_config/resolver_factory.c index 60ce65f554..378529d5b2 100644 --- a/src/core/client_config/resolver_factory.c +++ b/src/core/client_config/resolver_factory.c @@ -32,3 +32,18 @@ */ #include "src/core/client_config/resolver_factory.h" + +void grpc_resolver_factory_ref(grpc_resolver_factory *factory) { + factory->vtable->ref(factory); +} + +void grpc_resolver_factory_unref(grpc_resolver_factory *factory) { + factory->vtable->unref(factory); +} + +/** Create a resolver instance for a name */ +grpc_resolver *grpc_resolver_factory_create_resolver( + grpc_resolver_factory *factory, grpc_uri *uri, + grpc_subchannel_factory *subchannel_factory) { + return factory->vtable->create_resolver(factory, uri, subchannel_factory); +} diff --git a/src/core/client_config/subchannel.c b/src/core/client_config/subchannel.c index 588c63cdd3..037f0c0ab0 100644 --- a/src/core/client_config/subchannel.c +++ b/src/core/client_config/subchannel.c @@ -33,11 +33,22 @@ #include "src/core/client_config/subchannel.h" +#include <string.h> + #include <grpc/support/alloc.h> struct grpc_subchannel { gpr_refcount refs; grpc_connector *connector; + + /** non-transport related channel filters */ + const grpc_channel_filter **filters; + size_t filter_count; + /** channel arguments */ + grpc_channel_args *args; + /** address to connect to */ + struct sockaddr *addr; + size_t addr_len; }; struct grpc_subchannel_call { @@ -59,6 +70,23 @@ void grpc_subchannel_unref(grpc_subchannel *channel) { } } +grpc_subchannel *grpc_subchannel_create(grpc_connector *connector, + grpc_subchannel_args *args) { + grpc_subchannel *c = gpr_malloc(sizeof(*c)); + memset(c, 0, sizeof(*c)); + gpr_ref_init(&c->refs, 1); + c->connector = connector; + grpc_connector_ref(c->connector); + c->filters = gpr_malloc(sizeof(grpc_channel_filter *) * args->filter_count); + memcpy(c->filters, args->filters, + sizeof(grpc_channel_filter *) * args->filter_count); + c->filter_count = args->filter_count; + c->addr = gpr_malloc(args->addr_len); + memcpy(c->addr, args->addr, args->addr_len); + c->addr_len = args->addr_len; + return c; +} + /* * grpc_subchannel_call implementation */ diff --git a/src/core/client_config/subchannel.h b/src/core/client_config/subchannel.h index ab24123854..b4d40eadfa 100644 --- a/src/core/client_config/subchannel.h +++ b/src/core/client_config/subchannel.h @@ -41,6 +41,7 @@ address. Provides a target for load balancing. */ typedef struct grpc_subchannel grpc_subchannel; typedef struct grpc_subchannel_call grpc_subchannel_call; +typedef struct grpc_subchannel_args grpc_subchannel_args; void grpc_subchannel_ref(grpc_subchannel *channel); void grpc_subchannel_unref(grpc_subchannel *channel); @@ -69,7 +70,21 @@ void grpc_subchannel_create_call(grpc_subchannel *subchannel, void grpc_subchannel_call_process_op(grpc_subchannel_call *subchannel_call, grpc_transport_stream_op *op); +struct grpc_subchannel_args { + /** Channel filters for this channel - wrapped factories will likely + want to mutate this */ + const grpc_channel_filter **filters; + /** The number of filters in the above array */ + size_t filter_count; + /** Channel arguments to be supplied to the newly created channel */ + const grpc_channel_args *args; + /** Address to connect to */ + struct sockaddr *addr; + size_t addr_len; +}; + /** create a subchannel given a connector */ -grpc_subchannel *grpc_subchannel_create(grpc_connector *connector); +grpc_subchannel *grpc_subchannel_create(grpc_connector *connector, + grpc_subchannel_args *args); #endif /* GRPC_INTERNAL_CORE_CLIENT_CONFIG_SUBCHANNEL_H */ diff --git a/src/core/client_config/subchannel_factory.h b/src/core/client_config/subchannel_factory.h index cbe984f428..d7eae1c964 100644 --- a/src/core/client_config/subchannel_factory.h +++ b/src/core/client_config/subchannel_factory.h @@ -39,7 +39,6 @@ typedef struct grpc_subchannel_factory grpc_subchannel_factory; typedef struct grpc_subchannel_factory_vtable grpc_subchannel_factory_vtable; -typedef struct grpc_subchannel_args grpc_subchannel_args; /** Constructor for new configured channels. Creating decorators around this type is encouraged to adapt behavior. */ @@ -47,19 +46,6 @@ struct grpc_subchannel_factory { const grpc_subchannel_factory_vtable *vtable; }; -struct grpc_subchannel_args { - /** Channel filters for this channel - wrapped factories will likely - want to mutate this */ - const grpc_channel_filter **filters; - /** The number of filters in the above array */ - size_t filter_count; - /** Channel arguments to be supplied to the newly created channel */ - const grpc_channel_args *args; - /** Address to connect to */ - struct sockaddr *addr; - size_t addr_len; -}; - struct grpc_subchannel_factory_vtable { void (*ref)(grpc_subchannel_factory *factory); void (*unref)(grpc_subchannel_factory *factory); diff --git a/src/core/surface/channel_create.c b/src/core/surface/channel_create.c index 2d63d7e766..ba4e1a24ec 100644 --- a/src/core/surface/channel_create.c +++ b/src/core/surface/channel_create.c @@ -46,44 +46,42 @@ typedef struct { grpc_connector base; gpr_refcount refs; - struct sockaddr *addr; - int addr_len; - grpc_channel_args *args; } connector; -typedef struct { - grpc_subchannel_factory base; - gpr_refcount refs; - grpc_channel_args *args; -} subchannel_factory; - -static void subchannel_factory_ref(grpc_subchannel_factory *scf) { - subchannel_factory *f = (subchannel_factory*)scf; - gpr_ref(&f->refs); +static void connector_ref(grpc_connector *con) { + connector *c = (connector *)con; + gpr_ref(&c->refs); } -static void subchannel_factory_unref(grpc_subchannel_factory *scf) { - subchannel_factory *f = (subchannel_factory*)scf; - if (gpr_unref(&f->refs)) { - grpc_channel_args_destroy(f->args); - gpr_free(f); +static void connector_unref(grpc_connector *con) { + connector *c = (connector *)con; + if (gpr_unref(&c->refs)) { + gpr_free(c); } } +static void connector_connect(grpc_connector *connector, const grpc_channel_args *channel_args, grpc_mdctx *metadata_context, grpc_transport **transport, grpc_iomgr_closure *notify) { + abort(); +} + +static const grpc_connector_vtable connector_vtable = {connector_ref, connector_unref, connector_connect}; + +static void subchannel_factory_ref(grpc_subchannel_factory *scf) {} + +static void subchannel_factory_unref(grpc_subchannel_factory *scf) {} + static grpc_subchannel *subchannel_factory_create_subchannel(grpc_subchannel_factory *scf, grpc_subchannel_args *args) { - subchannel_factory *f = (subchannel_factory*)scf; connector *c = gpr_malloc(sizeof(*c)); + grpc_subchannel *s; c->base.vtable = &connector_vtable; gpr_ref_init(&c->refs, 1); - c->addr = gpr_malloc(args->addr_len); - memcpy(c->addr, args->addr, args->addr_len); - c->addr_len = args->addr_len; - c->args = grpc_channel_args_merge(args->args, f->args); - - return grpc_subchannel_create(&c->base); + s = grpc_subchannel_create(&c->base, args); + grpc_connector_unref(&c->base); + return s; } static const grpc_subchannel_factory_vtable subchannel_factory_vtable = {subchannel_factory_ref, subchannel_factory_unref, subchannel_factory_create_subchannel}; +static grpc_subchannel_factory subchannel_factory = {&subchannel_factory_vtable}; /* Create a client channel: Asynchronously: - resolve target @@ -92,7 +90,6 @@ static const grpc_subchannel_factory_vtable subchannel_factory_vtable = {subchan grpc_channel *grpc_channel_create(const char *target, const grpc_channel_args *args) { grpc_channel *channel = NULL; - subchannel_factory *scfactory = gpr_malloc(sizeof(*scfactory)); #define MAX_FILTERS 3 const grpc_channel_filter *filters[MAX_FILTERS]; grpc_resolver *resolver; @@ -104,11 +101,7 @@ grpc_channel *grpc_channel_create(const char *target, filters[n++] = &grpc_client_channel_filter; GPR_ASSERT(n <= MAX_FILTERS); - scfactory->base.vtable = &subchannel_factory_vtable; - gpr_ref_init(&scfactory->refs, 1); - scfactory->args = grpc_channel_args_copy(args); - - resolver = grpc_resolver_create(target, &scfactory->base); + resolver = grpc_resolver_create(target, &subchannel_factory); if (!resolver) { return NULL; } |