usess = session->ust_session;
ksess = session->kernel_session;
- /* Clean kernel session teardown */
+ /* Clean kernel session teardown, keeping data for destroy notifier. */
kernel_destroy_session(ksess);
- session->kernel_session = NULL;
- /* UST session teardown */
+ /* UST session teardown, keeping data for destroy notifier. */
if (usess) {
/* Close any relayd session */
consumer_output_send_destroy_relayd(usess->consumer);
ERR("Error in ust_app_destroy_trace_all");
}
- /* Clean up the rest. */
+ /* Clean up the rest, keeping destroy notifier data. */
trace_ust_destroy_session(usess);
- session->ust_session = NULL;
}
/*
del_session_ht(session);
}
session_notify_destruction(session);
+
+ kernel_free_session(ksess);
+ session->kernel_session = NULL;
+ if (usess) {
+ trace_ust_free_session(usess);
+ session->ust_session = NULL;
+ }
lttng_dynamic_array_reset(&session->destroy_notifiers);
free(session->last_archived_chunk_name);
+ free(session->base_path);
free(session);
if (session_published) {
/*
* Session list lock must be held by the caller.
*/
enum lttng_error_code session_create(const char *name, uid_t uid, gid_t gid,
- struct ltt_session **out_session)
+ const char *base_path, struct ltt_session **out_session)
{
int ret;
enum lttng_error_code ret_code;
DEFAULT_SESSION_NAME, i,
datetime);
}
+ new_session->name_contains_creation_time = true;
if (ret == -1 || ret >= sizeof(new_session->name)) {
/*
* Null-terminate in case the name is used
}
}
+ if (base_path) {
+ new_session->base_path = strdup(base_path);
+ if (!new_session->base_path) {
+ ERR("Failed to allocate base path of session \"%s\"",
+ name);
+ ret_code = LTTNG_ERR_SESSION_FAIL;
+ goto error;
+ }
+ }
+
new_session->uid = uid;
new_session->gid = gid;