in source/event_stream_rpc_client.c [245:321]
int aws_event_stream_rpc_client_connection_connect(
struct aws_allocator *allocator,
const struct aws_event_stream_rpc_client_connection_options *conn_options) {
AWS_PRECONDITION(allocator);
AWS_PRECONDITION(conn_options);
AWS_PRECONDITION(conn_options->on_connection_protocol_message);
AWS_PRECONDITION(conn_options->on_connection_setup);
AWS_PRECONDITION(conn_options->on_connection_shutdown);
struct aws_event_stream_rpc_client_connection *connection =
aws_mem_calloc(allocator, 1, sizeof(struct aws_event_stream_rpc_client_connection));
AWS_LOGF_TRACE(AWS_LS_EVENT_STREAM_RPC_CLIENT, "id=%p: creating new connection", (void *)connection);
if (!connection) {
return AWS_OP_ERR;
}
connection->allocator = allocator;
aws_atomic_init_int(&connection->ref_count, 1);
connection->bootstrap_ref = conn_options->bootstrap;
/* this is released in the connection release which gets called regardless of if this function is successful or
* not*/
aws_client_bootstrap_acquire(connection->bootstrap_ref);
aws_atomic_init_int(&connection->handshake_state, CONNECTION_HANDSHAKE_STATE_INITIALIZED);
aws_atomic_init_int(&connection->is_open, 1);
aws_mutex_init(&connection->stream_lock);
connection->on_connection_shutdown = conn_options->on_connection_shutdown;
connection->on_connection_protocol_message = conn_options->on_connection_protocol_message;
connection->on_connection_setup = conn_options->on_connection_setup;
connection->user_data = conn_options->user_data;
if (aws_hash_table_init(
&connection->continuation_table,
allocator,
64,
aws_event_stream_rpc_hash_streamid,
aws_event_stream_rpc_streamid_eq,
NULL,
NULL)) {
AWS_LOGF_ERROR(
AWS_LS_EVENT_STREAM_RPC_CLIENT,
"id=%p: failed initializing continuation table with error %s.",
(void *)connection,
aws_error_debug_str(aws_last_error()));
goto error;
}
struct aws_socket_channel_bootstrap_options bootstrap_options = {
.bootstrap = connection->bootstrap_ref,
.tls_options = conn_options->tls_options,
.socket_options = conn_options->socket_options,
.user_data = connection,
.host_name = conn_options->host_name,
.port = conn_options->port,
.enable_read_back_pressure = false,
.setup_callback = s_on_channel_setup_fn,
.shutdown_callback = s_on_channel_shutdown_fn,
};
if (aws_client_bootstrap_new_socket_channel(&bootstrap_options)) {
AWS_LOGF_ERROR(
AWS_LS_EVENT_STREAM_RPC_CLIENT,
"id=%p: failed creating new socket channel with error %s.",
(void *)connection,
aws_error_debug_str(aws_last_error()));
goto error;
}
return AWS_OP_SUCCESS;
error:
aws_event_stream_rpc_client_connection_release(connection);
return AWS_OP_ERR;
}