X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt-sessiond%2Fsession.c;h=b35157bae40c13a381f2b54dea44c825101075bb;hb=9674ce7a9c5218066b395d1f6d1f19f277849f95;hp=97ab098dca3c93c102cc7042619783ec9dec02ec;hpb=b5541356f517dba006af9f676df8131dcb68f132;p=lttng-tools.git diff --git a/ltt-sessiond/session.c b/ltt-sessiond/session.c index 97ab098dc..b35157bae 100644 --- a/ltt-sessiond/session.c +++ b/ltt-sessiond/session.c @@ -3,12 +3,12 @@ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * as published by the Free Software Foundation; only version 2 + * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -17,14 +17,14 @@ */ #define _GNU_SOURCE -#include +#include #include #include #include -#include -#include -#include "lttngerr.h" +#include +#include + #include "session.h" /* @@ -33,7 +33,7 @@ * No ltt_session.lock is taken here because those data structure are widely * spread across the lttng-tools code base so before caling functions below * that can read/write a session, the caller MUST acquire the session lock - * using lock_session() and unlock_session(). + * using session_lock() and session_unlock(). */ /* @@ -48,11 +48,9 @@ static struct ltt_session_list ltt_session_list = { }; /* - * add_session_list - * - * Add a ltt_session structure to the global list. + * Add a ltt_session structure to the global list. * - * The caller MUST acquire the session list lock before. + * The caller MUST acquire the session list lock before. */ static void add_session_list(struct ltt_session *ls) { @@ -61,11 +59,9 @@ static void add_session_list(struct ltt_session *ls) } /* - * del_session_list + * Delete a ltt_session structure to the global list. * - * Delete a ltt_session structure to the global list. - * - * The caller MUST acquire the session list lock before. + * The caller MUST acquire the session list lock before. */ static void del_session_list(struct ltt_session *ls) { @@ -77,120 +73,100 @@ static void del_session_list(struct ltt_session *ls) } /* - * get_session_list - * - * Return a pointer to the session list. + * Return a pointer to the session list. */ -struct ltt_session_list *get_session_list(void) +struct ltt_session_list *session_get_list(void) { return <t_session_list; } /* - * Acquire session lock + * Acquire session list lock */ -void lock_session(struct ltt_session *session) +void session_lock_list(void) { - pthread_mutex_lock(&session->lock); + pthread_mutex_lock(<t_session_list.lock); } /* - * Release session lock + * Release session list lock */ -void unlock_session(struct ltt_session *session) +void session_unlock_list(void) { - pthread_mutex_unlock(&session->lock); + pthread_mutex_unlock(<t_session_list.lock); } /* - * get_session_count - * - * Return session_count + * Acquire session lock */ -unsigned int get_session_count(void) +void session_lock(struct ltt_session *session) { - unsigned int count; - - pthread_mutex_lock(<t_session_list.lock); - count = ltt_session_list.count; - pthread_mutex_unlock(<t_session_list.lock); + pthread_mutex_lock(&session->lock); +} - return count; +/* + * Release session lock + */ +void session_unlock(struct ltt_session *session) +{ + pthread_mutex_unlock(&session->lock); } /* - * find_session_by_name - * - * Return a ltt_session structure ptr that matches name. - * If no session found, NULL is returned. + * Return a ltt_session structure ptr that matches name. If no session found, + * NULL is returned. This must be called with the session lock held using + * session_lock_list and session_unlock_list. */ -struct ltt_session *find_session_by_name(char *name) +struct ltt_session *session_find_by_name(char *name) { - int found = 0; struct ltt_session *iter; - pthread_mutex_lock(<t_session_list.lock); + DBG2("Trying to find session by name %s", name); + cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (strncmp(iter->name, name, strlen(name)) == 0) { - found = 1; - break; + if (strncmp(iter->name, name, NAME_MAX) == 0) { + goto found; } } - pthread_mutex_unlock(<t_session_list.lock); - if (!found) { - iter = NULL; - } + iter = NULL; +found: return iter; } /* - * destroy_session + * Delete session from the session list and free the memory. * - * Delete session from the session list and free the memory. - * - * Return -1 if no session is found. On success, return 1; + * Return -1 if no session is found. On success, return 1; */ -int destroy_session(char *name) +int session_destroy(struct ltt_session *session) { - int found = -1; - struct ltt_session *iter; - - pthread_mutex_lock(<t_session_list.lock); - cds_list_for_each_entry(iter, <t_session_list.head, list) { - if (strcmp(iter->name, name) == 0) { - DBG("Destroying session %s", iter->name); - del_session_list(iter); - free(iter->name); - free(iter->path); - pthread_mutex_destroy(&iter->lock); - free(iter); - found = 1; - break; - } + /* Safety check */ + if (session == NULL) { + ERR("Session pointer was null on session destroy"); + return LTTCOMM_OK; } - pthread_mutex_unlock(<t_session_list.lock); - return found; + DBG("Destroying session %s", session->name); + del_session_list(session); + pthread_mutex_destroy(&session->lock); + free(session); + + return LTTCOMM_OK; } /* - * create_session - * - * Create a brand new session and add it to the session list. + * Create a brand new session and add it to the session list. */ -int create_session(char *name, char *path) +int session_create(char *name, char *path) { int ret; - char date_time[NAME_MAX]; struct ltt_session *new_session; - time_t rawtime; - struct tm *timeinfo; - new_session = find_session_by_name(name); + new_session = session_find_by_name(name); if (new_session != NULL) { - ret = -EEXIST; + ret = LTTCOMM_EXIST_SESS; goto error_exist; } @@ -198,62 +174,51 @@ int create_session(char *name, char *path) new_session = malloc(sizeof(struct ltt_session)); if (new_session == NULL) { perror("malloc"); - ret = -ENOMEM; + ret = LTTCOMM_FATAL; goto error_malloc; } /* Define session name */ if (name != NULL) { - if (asprintf(&new_session->name, "%s", name) < 0) { - ret = -ENOMEM; + if (snprintf(new_session->name, NAME_MAX, "%s", name) < 0) { + ret = LTTCOMM_FATAL; goto error_asprintf; } } else { ERR("No session name given"); - ret = -1; + ret = LTTCOMM_FATAL; goto error; } /* Define session system path */ if (path != NULL) { - if (strstr(name, "auto-") == NULL) { - time(&rawtime); - timeinfo = localtime(&rawtime); - strftime(date_time, sizeof(date_time), "-%Y%m%d-%H%M%S", timeinfo); - } else { - date_time[0] = '\0'; - } - - if (asprintf(&new_session->path, "%s/%s%s", path, name, date_time) < 0) { - ret = -ENOMEM; + if (snprintf(new_session->path, PATH_MAX, "%s", path) < 0) { + ret = LTTCOMM_FATAL; goto error_asprintf; } } else { ERR("No session path given"); - ret = -1; + ret = LTTCOMM_FATAL; goto error; } /* Init kernel session */ new_session->kernel_session = NULL; - /* Init list */ - CDS_INIT_LIST_HEAD(&new_session->ust_traces); + /* Init UST session list */ + CDS_INIT_LIST_HEAD(&new_session->ust_session_list.head); - /* Set trace list counter */ - new_session->ust_trace_count = 0; + /* Init lock */ + pthread_mutex_init(&new_session->lock, NULL); /* Add new session to the session list */ - pthread_mutex_lock(<t_session_list.lock); + session_lock_list(); add_session_list(new_session); - pthread_mutex_unlock(<t_session_list.lock); - - /* Init lock */ - pthread_mutex_init(&new_session->lock, NULL); + session_unlock_list(); - DBG("Tracing session %s created in %s", new_session->name, new_session->path); + DBG("Tracing session %s created in %s", name, path); - return 0; + return LTTCOMM_OK; error: error_asprintf: @@ -265,35 +230,3 @@ error_exist: error_malloc: return ret; } - -/* - * get_lttng_session - * - * Iterate over the global session list and fill the lttng_session array. - */ -void get_lttng_session(struct lttng_session *sessions) -{ - int i = 0; - struct ltt_session *iter; - struct lttng_session lsess; - - DBG("Getting all available session"); - - /* - * Iterate over session list and append data after the control struct in - * the buffer. - */ - pthread_mutex_lock(<t_session_list.lock); - cds_list_for_each_entry(iter, <t_session_list.head, list) { - strncpy(lsess.path, iter->path, sizeof(lsess.path)); - lsess.path[sizeof(lsess.path) - 1] = '\0'; - strncpy(lsess.name, iter->name, sizeof(lsess.name)); - lsess.name[sizeof(lsess.name) - 1] = '\0'; - memcpy(&sessions[i], &lsess, sizeof(lsess)); - i++; - /* Reset struct for next pass */ - memset(&lsess, 0, sizeof(lsess)); - } - pthread_mutex_unlock(<t_session_list.lock); -} -