From 74babd95d68f4d871d66f3988b84e04c963d0162 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Tue, 4 Oct 2011 16:24:10 -0400 Subject: [PATCH] Remove session list lock acquisition of the search The lock/unlock of the session list in the find session by name function is removed thus the caller must held the lock before calling that search function. Also, the path and name are now static size on the stack and not allocated strings at session creation. Signed-off-by: David Goulet --- ltt-sessiond/main.c | 2 ++ ltt-sessiond/session.c | 22 ++++++++-------------- ltt-sessiond/session.h | 4 ++-- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 46c98a561..d9c9d7b9a 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -2525,7 +2525,9 @@ static int process_client_msg(struct command_ctx *cmd_ctx) break; default: DBG("Getting session %s by name", cmd_ctx->lsm->session.name); + session_lock_list(); cmd_ctx->session = session_find_by_name(cmd_ctx->lsm->session.name); + session_unlock_list(); if (cmd_ctx->session == NULL) { if (cmd_ctx->lsm->session.name != NULL) { ret = LTTCOMM_SESS_NOT_FOUND; diff --git a/ltt-sessiond/session.c b/ltt-sessiond/session.c index ae83e45ae..b35157bae 100644 --- a/ltt-sessiond/session.c +++ b/ltt-sessiond/session.c @@ -113,29 +113,25 @@ void session_unlock(struct ltt_session *session) } /* - * 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 *session_find_by_name(char *name) { - int found = 0; struct ltt_session *iter; DBG2("Trying to find session by name %s", name); - session_lock_list(); cds_list_for_each_entry(iter, <t_session_list.head, list) { if (strncmp(iter->name, name, NAME_MAX) == 0) { - found = 1; - break; + goto found; } } - session_unlock_list(); - if (!found) { - iter = NULL; - } + iter = NULL; +found: return iter; } @@ -154,8 +150,6 @@ int session_destroy(struct ltt_session *session) DBG("Destroying session %s", session->name); del_session_list(session); - free(session->name); - free(session->path); pthread_mutex_destroy(&session->lock); free(session); @@ -186,7 +180,7 @@ int session_create(char *name, char *path) /* Define session name */ if (name != NULL) { - if (asprintf(&new_session->name, "%s", name) < 0) { + if (snprintf(new_session->name, NAME_MAX, "%s", name) < 0) { ret = LTTCOMM_FATAL; goto error_asprintf; } @@ -198,7 +192,7 @@ int session_create(char *name, char *path) /* Define session system path */ if (path != NULL) { - if (asprintf(&new_session->path, "%s", path) < 0) { + if (snprintf(new_session->path, PATH_MAX, "%s", path) < 0) { ret = LTTCOMM_FATAL; goto error_asprintf; } diff --git a/ltt-sessiond/session.h b/ltt-sessiond/session.h index 2f40f585d..7db95ed1d 100644 --- a/ltt-sessiond/session.h +++ b/ltt-sessiond/session.h @@ -56,8 +56,8 @@ struct ltt_session_list { * session for both LTTng and UST. */ struct ltt_session { - char *name; - char *path; + char name[NAME_MAX]; + char path[PATH_MAX]; struct ltt_kernel_session *kernel_session; struct ltt_ust_session_list ust_session_list; /* -- 2.34.1