{
struct lttng_channel *chan;
const char *channel_name = DEFAULT_CHANNEL_NAME;
+ struct lttng_channel_extended *extended_attr = NULL;
chan = zmalloc(sizeof(struct lttng_channel));
if (chan == NULL) {
goto error_alloc;
}
+ extended_attr = zmalloc(sizeof(struct lttng_channel_extended));
+ if (!extended_attr) {
+ PERROR("zmalloc channel extended init");
+ goto error;
+ }
+
+ chan->attr.extended.ptr = extended_attr;
+
/* Same for all domains. */
chan->attr.overwrite = DEFAULT_CHANNEL_OVERWRITE;
chan->attr.tracefile_size = DEFAULT_CHANNEL_TRACEFILE_SIZE;
chan->attr.switch_timer_interval = DEFAULT_KERNEL_CHANNEL_SWITCH_TIMER;
chan->attr.read_timer_interval = DEFAULT_KERNEL_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval = DEFAULT_KERNEL_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_KERNEL_CHANNEL_BLOCKING_TIMEOUT;
+ extended_attr->monitor_timer_interval =
+ DEFAULT_KERNEL_CHANNEL_MONITOR_TIMER;
break;
case LTTNG_DOMAIN_JUL:
channel_name = DEFAULT_JUL_CHANNEL_NAME;
DEFAULT_UST_UID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_UST_UID_CHANNEL_BLOCKING_TIMEOUT;
+ extended_attr->monitor_timer_interval =
+ DEFAULT_UST_UID_CHANNEL_MONITOR_TIMER;
break;
case LTTNG_BUFFER_PER_PID:
default:
chan->attr.read_timer_interval =
DEFAULT_UST_PID_CHANNEL_READ_TIMER;
chan->attr.live_timer_interval =
- DEFAULT_UST_UID_CHANNEL_LIVE_TIMER;
+ DEFAULT_UST_PID_CHANNEL_LIVE_TIMER;
+ extended_attr->blocking_timeout = DEFAULT_UST_PID_CHANNEL_BLOCKING_TIMEOUT;
+ extended_attr->monitor_timer_interval =
+ DEFAULT_UST_PID_CHANNEL_MONITOR_TIMER;
break;
}
break;
return chan;
error:
+ free(extended_attr);
free(chan);
error_alloc:
return NULL;
}
+void channel_attr_destroy(struct lttng_channel *channel)
+{
+ if (!channel) {
+ return;
+ }
+ free(channel->attr.extended.ptr);
+ free(channel);
+}
+
/*
* Disable kernel channel of the kernel session.
*/
return 0;
}
+static int channel_validate_kernel(struct lttng_channel *attr)
+{
+ /* Kernel channels do not support blocking timeout. */
+ if (((struct lttng_channel_extended *)attr->attr.extended.ptr)->blocking_timeout) {
+ return -1;
+ }
+ return 0;
+}
+
/*
* Create kernel channel of the kernel session and notify kernel thread.
*/
attr = defattr;
}
+ /*
+ * Set the overwrite mode for this channel based on the session
+ * type unless the client explicitly overrides the channel mode.
+ */
+ if (attr->attr.overwrite == DEFAULT_CHANNEL_OVERWRITE) {
+ attr->attr.overwrite = !!ksession->snapshot_mode;
+ }
+
+ /* Enforce mmap output for snapshot sessions. */
if (ksession->snapshot_mode) {
- /* Force channel attribute for snapshot mode. */
- attr->attr.overwrite = 1;
attr->attr.output = LTTNG_EVENT_MMAP;
}
goto error;
}
+ if (channel_validate_kernel(attr) < 0) {
+ ret = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
/* Channel not found, creating it */
ret = kernel_create_channel(ksession, attr);
if (ret < 0) {
ret = LTTNG_OK;
error:
- free(defattr);
+ channel_attr_destroy(defattr);
return ret;
}
}
}
+ /*
+ * Set the overwrite mode for this channel based on the session
+ * type unless the client explicitly overrides the channel mode.
+ */
+ if (attr->attr.overwrite == DEFAULT_CHANNEL_OVERWRITE) {
+ attr->attr.overwrite = !!usess->snapshot_mode;
+ }
+
+ /* Enforce mmap output for snapshot sessions. */
if (usess->snapshot_mode) {
- /* Force channel attribute for snapshot mode. */
- attr->attr.overwrite = 1;
attr->attr.output = LTTNG_EVENT_MMAP;
}
}
}
- free(defattr);
+ channel_attr_destroy(defattr);
return LTTNG_OK;
error_free_chan:
*/
trace_ust_destroy_channel(uchan);
error:
- free(defattr);
+ channel_attr_destroy(defattr);
return ret;
}