- relay_connection = zmalloc(sizeof(struct relay_command));
- if (relay_connection == NULL) {
- PERROR("Relay command zmalloc");
- goto error;
- }
- ret = lttng_read(fd, relay_connection, sizeof(struct relay_command));
- if (ret < sizeof(struct relay_command)) {
- PERROR("read relay cmd pipe");
- goto error_read;
- }
- CDS_INIT_LIST_HEAD(&relay_connection->recv_head);
-
- lttng_ht_node_init_ulong(&relay_connection->sock_n,
- (unsigned long) relay_connection->sock->fd);
- rcu_read_lock();
- lttng_ht_add_unique_ulong(relay_connections_ht,
- &relay_connection->sock_n);
- rcu_read_unlock();
- return lttng_poll_add(events,
- relay_connection->sock->fd,
- LPOLLIN | LPOLLRDHUP);
-
-error_read:
- free(relay_connection);
-error:
- return -1;
-}
-
-static
-void deferred_free_connection(struct rcu_head *head)
-{
- struct relay_command *relay_connection =
- caa_container_of(head, struct relay_command, rcu_node);
-
- lttcomm_destroy_sock(relay_connection->sock);
- free(relay_connection);
-}
-
-static
-void relay_del_connection(struct lttng_ht *relay_connections_ht,
- struct lttng_ht_iter *iter, struct relay_command *relay_connection,
- struct lttng_ht *sessions_ht)
-{
- int ret;
-
- ret = lttng_ht_del(relay_connections_ht, iter);
- assert(!ret);
-
- if (relay_connection->type == RELAY_CONTROL) {
- struct relay_stream *stream, *tmp_stream;
-
- /* Clean up recv list. */
- cds_list_for_each_entry_safe(stream, tmp_stream,
- &relay_connection->recv_head, recv_list) {
- cds_list_del(&stream->recv_list);
- }
-
- relay_delete_session(relay_connection, sessions_ht);