aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-06-26 09:02:20 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-06-26 09:02:20 -0700
commitf7afa1f1ba4953c7bd6d20f0bbabc5742d3faea8 (patch)
tree651bfcbdb62fb9e464ed360ddd639c216469a484 /src
parent916246625bad68c6ea63d5a2cfca644a7e01cfe1 (diff)
client_config: chttp2_fullstack_no_op_unsecure_test passes
Diffstat (limited to 'src')
-rw-r--r--src/core/client_config/connector.c16
-rw-r--r--src/core/client_config/connector.h11
-rw-r--r--src/core/client_config/resolver_factory.c15
-rw-r--r--src/core/client_config/subchannel.c28
-rw-r--r--src/core/client_config/subchannel.h17
-rw-r--r--src/core/client_config/subchannel_factory.h14
-rw-r--r--src/core/surface/channel_create.c53
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;
}