struct channel *chan;
struct lttng_ust_lib_ring_buffer_config *config;
void *chan_data;
+ int wakeup_fd;
uint64_t len;
int ret;
enum lttng_ust_chan_type type;
chan_data = uargs->channel.chan_data;
+ wakeup_fd = uargs->channel.wakeup_fd;
len = ust_chan->len;
type = ust_chan->type;
case LTTNG_UST_CHAN_PER_CPU:
break;
default:
- return -EINVAL;
+ ret = -EINVAL;
+ goto invalid;
}
if (session->been_active) {
goto active; /* Refuse to add channel to active session */
}
- channel_handle = channel_handle_create(chan_data, len);
+ channel_handle = channel_handle_create(chan_data, len, wakeup_fd);
if (!channel_handle) {
ret = -EINVAL;
goto handle_error;
switch (type) {
case LTTNG_UST_CHAN_PER_CPU:
if (config->output == RING_BUFFER_MMAP) {
- transport_name = config->mode == RING_BUFFER_OVERWRITE ?
- "relay-overwrite-mmap" : "relay-discard-mmap";
+ if (config->mode == RING_BUFFER_OVERWRITE) {
+ if (config->wakeup == RING_BUFFER_WAKEUP_BY_WRITER) {
+ transport_name = "relay-overwrite-mmap";
+ } else {
+ transport_name = "relay-overwrite-rt-mmap";
+ }
+ } else {
+ if (config->wakeup == RING_BUFFER_WAKEUP_BY_WRITER) {
+ transport_name = "relay-discard-mmap";
+ } else {
+ transport_name = "relay-discard-rt-mmap";
+ }
+ }
} else {
ret = -EINVAL;
goto notransport;
objd_ref(session_objd);
return chan_objd;
+ /* error path after channel was created */
objd_error:
notransport:
free(lttng_chan);
alloc_error:
channel_destroy(chan, channel_handle, 0);
+ return ret;
+
+ /*
+ * error path before channel creation (owning chan_data and
+ * wakeup_fd).
+ */
handle_error:
active:
+invalid:
+ {
+ int close_ret;
+
+ close_ret = close(wakeup_fd);
+ if (close_ret) {
+ PERROR("close");
+ }
+ }
+ free(chan_data);
return ret;
}