+ {
+ int err;
+
+ err = lttng_ust_objd_unref(list_objd, 1);
+ assert(!err);
+ }
+objd_error:
+ return ret;
+}
+
+static
+int lttng_release_tracepoint_field_list(int objd)
+{
+ struct lttng_ust_field_list *list = objd_private(objd);
+
+ if (list) {
+ lttng_probes_prune_field_list(list);
+ free(list);
+ return 0;
+ } else {
+ return -EINVAL;
+ }
+}
+
+static const struct lttng_ust_objd_ops lttng_tracepoint_field_list_ops = {
+ .release = lttng_release_tracepoint_field_list,
+ .cmd = lttng_tracepoint_field_list_cmd,
+};
+
+static
+int lttng_abi_map_stream(int channel_objd, struct lttng_ust_stream *info,
+ union ust_args *uargs, void *owner)
+{
+ struct lttng_channel *channel = objd_private(channel_objd);
+ int ret;
+
+ ret = channel_handle_add_stream(channel->handle,
+ uargs->stream.shm_fd, uargs->stream.wakeup_fd,
+ info->stream_nr, info->len);
+ if (ret)
+ goto error_add_stream;
+ /* Take ownership of shm_fd and wakeup_fd. */
+ uargs->stream.shm_fd = -1;
+ uargs->stream.wakeup_fd = -1;
+
+ return 0;
+
+error_add_stream: