+#include "ust-ctl.h"
+
+/*
+ * Delete ust app event safely. RCU read lock must be held before calling
+ * this function.
+ */
+static void delete_ust_app_event(int sock, struct ust_app_event *ua_event)
+{
+ /* TODO : remove context */
+ //struct ust_app_ctx *ltctx;
+ //cds_lfht_for_each_entry(lte->ctx, &iter, ltctx, node) {
+ // delete_ust_app_ctx(sock, ltctx);
+ //}
+
+ ustctl_release_object(sock, ua_event->obj);
+ free(ua_event);
+}
+
+/*
+ * Delete ust app stream safely. RCU read lock must be held before calling
+ * this function.
+ */
+static void delete_ust_app_stream(int sock, struct ltt_ust_stream *stream)
+{
+ //TODO
+ //stream is used for passing to consumer.
+ //send_channel_streams is responsible for freeing the streams.
+ //note that this will not play well with flight recorder mode:
+ //we might need a criterion to discard the streams.
+}
+
+/*
+ * Delete ust app channel safely. RCU read lock must be held before calling
+ * this function.
+ */
+static void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan)
+{
+ int ret;
+ struct cds_lfht_iter iter;
+ struct ust_app_event *ua_event;
+ struct ltt_ust_stream *stream, *stmp;
+
+ cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) {
+ delete_ust_app_stream(sock, stream);
+ }
+
+ /* TODO : remove channel context */
+ //cds_lfht_for_each_entry(ltc->ctx, &iter, ltctx, node) {
+ // hashtable_del(ltc->ctx, &iter);
+ // delete_ust_app_ctx(sock, ltctx);
+ //}
+ //ret = hashtable_destroy(ltc->ctx);
+
+ cds_lfht_for_each_entry(ua_chan->events, &iter, ua_event, node) {
+ hashtable_del(ua_chan->events, &iter);
+ delete_ust_app_event(sock, ua_event);
+ }
+
+ ret = hashtable_destroy(ua_chan->events);
+ if (ret < 0) {
+ ERR("UST app destroy session hashtable failed");
+ goto error;
+ }
+
+error:
+ return;
+}
+
+/*
+ * Delete ust app session safely. RCU read lock must be held before calling
+ * this function.
+ */
+static void delete_ust_app_session(int sock,
+ struct ust_app_session *ua_sess)
+{
+ int ret;
+ struct cds_lfht_iter iter;
+ struct ust_app_channel *ua_chan;
+
+ if (ua_sess->metadata) {
+ /*
+ * We do NOT release the stream object and metadata object since they
+ * are release when fds are sent to the consumer.
+ */
+ }
+
+ cds_lfht_for_each_entry(ua_sess->channels, &iter, ua_chan, node) {
+ hashtable_del(ua_sess->channels, &iter);
+ delete_ust_app_channel(sock, ua_chan);
+ }
+
+ ret = hashtable_destroy(ua_sess->channels);
+ if (ret < 0) {
+ ERR("UST app destroy session hashtable failed");
+ goto error;
+ }
+
+error:
+ return;
+}