const char * const config_element_targets = "targets";
const char * const config_element_target_pid = "pid_target";
-LTTNG_HIDDEN const char * const config_element_rotation_timer_interval = "rotation_schedule_timer_period";
-LTTNG_HIDDEN const char * const config_element_rotation_size = "rotation_schedule_size";
-LTTNG_HIDDEN const char * const config_element_rotation_schedule = "rotation_schedule";
+LTTNG_HIDDEN const char * const config_element_rotation_schedules = "rotation_schedules";
+LTTNG_HIDDEN const char * const config_element_rotation_schedule_periodic = "periodic";
+LTTNG_HIDDEN const char * const config_element_rotation_schedule_periodic_time_us = "time_us";
+LTTNG_HIDDEN const char * const config_element_rotation_schedule_size_threshold = "size_threshold";
+LTTNG_HIDDEN const char * const config_element_rotation_schedule_size_threshold_bytes = "bytes";
const char * const config_domain_type_kernel = "KERNEL";
const char * const config_domain_type_ust = "UST";
LTTNG_HIDDEN const char * const config_event_context_preemptible = "PREEMPTIBLE";
LTTNG_HIDDEN const char * const config_event_context_need_reschedule = "NEED_RESCHEDULE";
LTTNG_HIDDEN const char * const config_event_context_migratable = "MIGRATABLE";
+LTTNG_HIDDEN const char * const config_event_context_callstack_user= "CALLSTACK_USER";
+LTTNG_HIDDEN const char * const config_event_context_callstack_kernel = "CALLSTACK_KERNEL";
/* Deprecated symbols */
const char * const config_element_perf;
} else if (!strcmp((char *) context_type,
config_event_context_migratable)) {
ret = LTTNG_EVENT_CONTEXT_MIGRATABLE;
+ } else if (!strcmp((char *) context_type,
+ config_event_context_callstack_user)) {
+ ret = LTTNG_EVENT_CONTEXT_CALLSTACK_USER;
+ } else if (!strcmp((char *) context_type,
+ config_event_context_callstack_kernel)) {
+ ret = LTTNG_EVENT_CONTEXT_CALLSTACK_KERNEL;
} else {
goto error;
}
return ret;
}
+static
+int add_periodic_rotation(const char *name, uint64_t time_us)
+{
+ int ret;
+ enum lttng_rotation_status status;
+ struct lttng_rotation_schedule *periodic =
+ lttng_rotation_schedule_periodic_create();
+
+ if (!periodic) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto error;
+ }
+
+ status = lttng_rotation_schedule_periodic_set_period(periodic,
+ time_us);
+ if (status != LTTNG_ROTATION_STATUS_OK) {
+ ret = -LTTNG_ERR_INVALID;
+ goto error;
+ }
+
+ status = lttng_session_add_rotation_schedule(name, periodic);
+ switch (status) {
+ case LTTNG_ROTATION_STATUS_OK:
+ ret = 0;
+ break;
+ case LTTNG_ROTATION_STATUS_SCHEDULE_ALREADY_SET:
+ case LTTNG_ROTATION_STATUS_INVALID:
+ ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+ break;
+ default:
+ ret = -LTTNG_ERR_UNK;
+ break;
+ }
+error:
+ lttng_rotation_schedule_destroy(periodic);
+ return ret;
+}
+
+static
+int add_size_rotation(const char *name, uint64_t size_bytes)
+{
+ int ret;
+ enum lttng_rotation_status status;
+ struct lttng_rotation_schedule *size =
+ lttng_rotation_schedule_size_threshold_create();
+
+ if (!size) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto error;
+ }
+
+ status = lttng_rotation_schedule_size_threshold_set_threshold(size,
+ size_bytes);
+ if (status != LTTNG_ROTATION_STATUS_OK) {
+ ret = -LTTNG_ERR_INVALID;
+ goto error;
+ }
+
+ status = lttng_session_add_rotation_schedule(name, size);
+ switch (status) {
+ case LTTNG_ROTATION_STATUS_OK:
+ ret = 0;
+ break;
+ case LTTNG_ROTATION_STATUS_SCHEDULE_ALREADY_SET:
+ case LTTNG_ROTATION_STATUS_INVALID:
+ ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+ break;
+ default:
+ ret = -LTTNG_ERR_UNK;
+ break;
+ }
+error:
+ lttng_rotation_schedule_destroy(size);
+ return ret;
+}
+
+static
+int process_session_rotation_schedules_node(
+ xmlNodePtr schedules_node,
+ uint64_t *rotation_timer_interval,
+ uint64_t *rotation_size)
+{
+ int ret = 0;
+ xmlNodePtr child;
+
+ for (child = xmlFirstElementChild(schedules_node);
+ child;
+ child = xmlNextElementSibling(child)) {
+ if (!strcmp((const char *) child->name,
+ config_element_rotation_schedule_periodic)) {
+ xmlChar *content;
+ xmlNodePtr time_us_node;
+
+ /* periodic rotation schedule */
+ time_us_node = xmlFirstElementChild(child);
+ if (!time_us_node ||
+ strcmp((const char *) time_us_node->name,
+ config_element_rotation_schedule_periodic_time_us)) {
+ ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+ goto end;
+ }
+
+ /* time_us child */
+ content = xmlNodeGetContent(time_us_node);
+ if (!content) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto end;
+ }
+ ret = parse_uint(content, rotation_timer_interval);
+ free(content);
+ if (ret) {
+ ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+ goto end;
+ }
+ } else if (!strcmp((const char *) child->name,
+ config_element_rotation_schedule_size_threshold)) {
+ xmlChar *content;
+ xmlNodePtr bytes_node;
+
+ /* size_threshold rotation schedule */
+ bytes_node = xmlFirstElementChild(child);
+ if (!bytes_node ||
+ strcmp((const char *) bytes_node->name,
+ config_element_rotation_schedule_size_threshold_bytes)) {
+ ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+ goto end;
+ }
+
+ /* bytes child */
+ content = xmlNodeGetContent(bytes_node);
+ if (!content) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto end;
+ }
+ ret = parse_uint(content, rotation_size);
+ free(content);
+ if (ret) {
+ ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
+ goto end;
+ }
+ }
+ }
+
+end:
+ return ret;
+}
+
static
int process_session_node(xmlNodePtr session_node, const char *session_name,
int overwrite,
ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
goto error;
}
- }
- if (!strcmp((const char *) attributes_child->name,
- config_element_rotation_timer_interval)) {
- /* rotation_timer_interval */
- xmlChar *timer_interval_content =
- xmlNodeGetContent(attributes_child);
- if (!timer_interval_content) {
- ret = -LTTNG_ERR_NOMEM;
- goto error;
- }
-
- ret = parse_uint(timer_interval_content, &rotation_timer_interval);
- free(timer_interval_content);
+ } else if (!strcmp((const char *) attributes_child->name,
+ config_element_rotation_schedules)) {
+ ret = process_session_rotation_schedules_node(
+ attributes_child,
+ &rotation_timer_interval,
+ &rotation_size);
if (ret) {
ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
goto error;
}
- }
- if (!strcmp((const char *) attributes_child->name,
- config_element_rotation_size)) {
- /* rotation_size */
- xmlChar *rotation_size_content =
- xmlNodeGetContent(attributes_child);
- if (!rotation_size_content) {
- ret = -LTTNG_ERR_NOMEM;
- goto error;
- }
- ret = parse_uint(rotation_size_content, &rotation_size);
- free(rotation_size_content);
- if (ret) {
- ret = -LTTNG_ERR_LOAD_INVALID_CONFIG;
- goto error;
- }
}
}
}
}
}
- if (rotation_timer_interval || rotation_size) {
- struct lttng_rotation_schedule_attr *rotation_attr = lttng_rotation_schedule_attr_create();
-
- if (!rotation_attr) {
- goto error;
- }
- ret = lttng_rotation_schedule_attr_set_session_name(rotation_attr, (const char *) name);
- if (ret) {
- lttng_rotation_schedule_attr_destroy(rotation_attr);
+ if (rotation_timer_interval) {
+ ret = add_periodic_rotation((const char *) name,
+ rotation_timer_interval);
+ if (ret < 0) {
goto error;
}
- lttng_rotation_schedule_attr_set_timer_period(rotation_attr,
- rotation_timer_interval);
- lttng_rotation_schedule_attr_set_size(rotation_attr, rotation_size);
- ret = lttng_rotation_set_schedule(rotation_attr);
- lttng_rotation_schedule_attr_destroy(rotation_attr);
- if (ret) {
+ }
+ if (rotation_size) {
+ ret = add_size_rotation((const char *) name,
+ rotation_size);
+ if (ret < 0) {
goto error;
}
}