/* Add stream to channel shm and map its shm into process memory */ int ustctl_add_stream(struct lttng_ust_shm_handle *handle, struct lttng_ust_object_data *stream_data) { int ret; if (!handle || !stream_data) return -EINVAL; if (!stream_data->handle) return -ENOENT; /* map stream */ ret = channel_handle_add_stream(handle, stream_data->shm_fd, stream_data->wait_fd, stream_data->memory_map_size); if (ret) { ERR("add stream error\n"); return ret; } /* * Set to -1 because the lttng_ust_shm_handle destruction will take care * of closing shm_fd and wait_fd. */ stream_data->shm_fd = -1; stream_data->wait_fd = -1; return 0; }
static struct lttng_ust_shm_handle *map_channel(struct lttng_ust_object_data *chan_data, struct lttng_ust_object_data *stream_datas, int nr_check) { struct lttng_ust_shm_handle *handle; struct channel *chan; int k, ret; /* map metadata channel */ handle = channel_handle_create(chan_data->shm_fd, chan_data->wait_fd, chan_data->memory_map_size); if (!handle) { printf("create handle error\n"); return NULL; } chan_data->shm_fd = -1; chan_data->wait_fd = -1; chan = shmp(handle, handle->chan); for (k = 0; k < nr_check; k++) { struct lttng_ust_object_data *stream_data = &stream_datas[k]; if (!stream_data->handle) break; /* map stream */ ret = channel_handle_add_stream(handle, stream_data->shm_fd, stream_data->wait_fd, stream_data->memory_map_size); if (ret) { printf("add stream error\n"); goto error_destroy; } stream_data->shm_fd = -1; stream_data->wait_fd = -1; } return handle; error_destroy: channel_destroy(chan, handle, 1); return NULL; }