From 91d76f53238ce994e91e1213e46c138b1b5529c6 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Fri, 29 Apr 2011 13:00:39 -0400 Subject: [PATCH] Move traceable app. data to a seperate C file All traceable application data structure and functions are now in traceable-app.c/.h. To remove traceable app data struct dependency from main.c, register_traceable_app, unregister_traceable_app and get_app_count is added. Also, main.c is now using these function. Also, the find_app_by_pid returns the struct pointer. Minor spaces fix in the code for session.c/.h and main.c Signed-off-by: David Goulet --- ltt-sessiond/Makefile.am | 2 +- ltt-sessiond/ltt-sessiond.h | 16 ---- ltt-sessiond/main.c | 135 +++++---------------------- ltt-sessiond/session.c | 2 +- ltt-sessiond/session.h | 2 +- ltt-sessiond/traceable-app.c | 173 +++++++++++++++++++++++++++++++++++ ltt-sessiond/traceable-app.h | 43 +++++++++ 7 files changed, 241 insertions(+), 132 deletions(-) create mode 100644 ltt-sessiond/traceable-app.c create mode 100644 ltt-sessiond/traceable-app.h diff --git a/ltt-sessiond/Makefile.am b/ltt-sessiond/Makefile.am index 00c0e8958..4f4669da5 100644 --- a/ltt-sessiond/Makefile.am +++ b/ltt-sessiond/Makefile.am @@ -3,7 +3,7 @@ AM_CFLAGS = -fno-strict-aliasing bin_PROGRAMS = ltt-sessiond -ltt_sessiond_SOURCES = session.c main.c +ltt_sessiond_SOURCES = session.c traceable-app.c main.c ltt_sessiond_LDADD = \ $(top_builddir)/liblttsessiondcomm/liblttsessiondcomm.la diff --git a/ltt-sessiond/ltt-sessiond.h b/ltt-sessiond/ltt-sessiond.h index f01fa2e16..491656e85 100644 --- a/ltt-sessiond/ltt-sessiond.h +++ b/ltt-sessiond/ltt-sessiond.h @@ -48,20 +48,4 @@ struct ltt_ust_marker { char *channel; }; -/* Traceable application list */ -struct ltt_traceable_app_list { - struct cds_list_head head; -}; - -/* - * Registered traceable applications. Libust registers - * to the session daemon and a linked list is kept - * of all running traceable app. - */ -struct ltt_traceable_app { - struct cds_list_head list; - pid_t pid; - uid_t uid; /* User ID that owns the apps */ -}; - #endif /* _LTT_SESSIOND_H */ diff --git a/ltt-sessiond/main.c b/ltt-sessiond/main.c index 418875a2a..8c58a3432 100644 --- a/ltt-sessiond/main.c +++ b/ltt-sessiond/main.c @@ -5,12 +5,12 @@ * 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. - * + * * 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 * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -41,6 +41,7 @@ #include "ltt-sessiond.h" #include "lttngerr.h" #include "session.h" +#include "traceable-app.h" /* Const values */ const char default_home_dir[] = DEFAULT_HOME_DIR; @@ -57,16 +58,12 @@ static void copy_common_data(struct lttcomm_lttng_msg *llm, struct lttcomm_sessi static int check_existing_daemon(void); static int notify_apps(const char* name); static int connect_app(pid_t pid); -static int find_app_by_pid(pid_t pid); static int init_daemon_socket(void); static int process_client_msg(int sock, struct lttcomm_session_msg*); static int send_unix_sock(int sock, void *buf, size_t len); static int setup_data_buffer(char **buf, size_t size, struct lttcomm_lttng_msg *llm); -static void add_traceable_app(struct ltt_traceable_app *lta); -static void del_traceable_app(struct ltt_traceable_app *lta); /* Command function */ -static void get_list_apps(pid_t *pids); static void *thread_manage_clients(void *data); static void *thread_manage_apps(void *data); @@ -89,17 +86,6 @@ static int apps_socket; static struct ltt_session *current_session; -/* Number of element for the list below. */ -static unsigned int traceable_app_count; - -/* Init ust traceabl application's list */ -static struct ltt_traceable_app_list ltt_traceable_app_list = { - .head = CDS_LIST_HEAD_INIT(ltt_traceable_app_list.head), -}; - -/* List mutex */ -pthread_mutex_t ltt_traceable_app_list_mutex; - /* * thread_manage_apps * @@ -108,7 +94,6 @@ pthread_mutex_t ltt_traceable_app_list_mutex; static void *thread_manage_apps(void *data) { int sock, ret; - struct ltt_traceable_app *lta; /* TODO: Something more elegant is needed but fine for now */ struct { @@ -144,19 +129,16 @@ static void *thread_manage_apps(void *data) /* Add application to the global traceable list */ if (reg_msg.reg == 1) { /* Registering */ - lta = malloc(sizeof(struct ltt_traceable_app)); - lta->pid = reg_msg.pid; - lta->uid = reg_msg.uid; - add_traceable_app(lta); + ret = register_traceable_app(reg_msg.pid, reg_msg.uid); + if (ret < 0) { + /* register_traceable_app only return an error with + * ENOMEM. At this point, we better stop everything. + */ + goto error; + } } else { /* Unregistering */ - cds_list_for_each_entry(lta, <t_traceable_app_list.head, list) { - if (lta->pid == reg_msg.pid && lta->uid == reg_msg.uid) { - del_traceable_app(lta); - free(lta); - break; - } - } + unregister_traceable_app(reg_msg.pid); } } @@ -221,37 +203,6 @@ error: return NULL; } -/* - * add_traceable_app - * - * Add a traceable application structure to the global - * list protected by a mutex. - */ -static void add_traceable_app(struct ltt_traceable_app *lta) -{ - pthread_mutex_lock(<t_traceable_app_list_mutex); - cds_list_add(<a->list, <t_traceable_app_list.head); - traceable_app_count++; - pthread_mutex_unlock(<t_traceable_app_list_mutex); -} - -/* - * del_traceable_app - * - * Delete a traceable application structure from the - * global list protected by a mutex. - */ -static void del_traceable_app(struct ltt_traceable_app *lta) -{ - pthread_mutex_lock(<t_traceable_app_list_mutex); - cds_list_del(<a->list); - /* Sanity check */ - if (traceable_app_count != 0) { - traceable_app_count--; - } - pthread_mutex_unlock(<t_traceable_app_list_mutex); -} - /* * send_unix_sock * @@ -280,14 +231,16 @@ static int send_unix_sock(int sock, void *buf, size_t len) */ static int connect_app(pid_t pid) { - int sock, ret; + int sock; + struct ltt_traceable_app *lta; - ret = find_app_by_pid(pid); - if (ret == 0) { + lta = find_app_by_pid(pid); + if (lta == NULL) { + /* App not found */ return -1; } - sock = ustctl_connect_pid(pid); + sock = ustctl_connect_pid(lta->pid); if (sock < 0) { ERR("Fail connecting to the PID %d\n", pid); } @@ -325,29 +278,6 @@ error: return ret; } -/* - * find_app_by_pid - * - * Iterate over the traceable apps list. - * On success, return 1, else return 0 - */ -static int find_app_by_pid(pid_t pid) -{ - struct ltt_traceable_app *iter; - - pthread_mutex_lock(<t_traceable_app_list_mutex); - cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { - if (iter->pid == pid) { - pthread_mutex_unlock(<t_traceable_app_list_mutex); - /* Found */ - return 1; - } - } - pthread_mutex_unlock(<t_traceable_app_list_mutex); - - return 0; -} - /* * ust_create_trace * @@ -393,28 +323,6 @@ error: return ret; } -/* - * get_list_apps - * - * List traceable user-space application and fill an - * array of pids. - */ -static void get_list_apps(pid_t *pids) -{ - int i = 0; - struct ltt_traceable_app *iter; - - /* Protected by a mutex here because the threads manage_client - * and manage_apps can access this list. - */ - pthread_mutex_lock(<t_traceable_app_list_mutex); - cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { - pids[i] = iter->pid; - i++; - } - pthread_mutex_unlock(<t_traceable_app_list_mutex); -} - /* * copy_common_data * @@ -555,21 +463,22 @@ static int process_client_msg(int sock, struct lttcomm_session_msg *lsm) } case UST_LIST_APPS: { + unsigned int app_count = get_app_count(); /* Stop right now if no apps */ - if (traceable_app_count == 0) { + if (app_count == 0) { ret = LTTCOMM_NO_APPS; goto end; } /* Setup data buffer and details for transmission */ buf_size = setup_data_buffer(&send_buf, - sizeof(pid_t) * traceable_app_count, &llm); + sizeof(pid_t) * app_count, &llm); if (buf_size < 0) { ret = LTTCOMM_FATAL; goto end; } - get_list_apps((pid_t *)(send_buf + header_size)); + get_app_list_pids((pid_t *)(send_buf + header_size)); break; } @@ -876,7 +785,7 @@ static void sighandler(int sig) } /* - * cleanup + * cleanup * * Cleanup the daemon on exit */ diff --git a/ltt-sessiond/session.c b/ltt-sessiond/session.c index c6bc285cd..9e93d89ce 100644 --- a/ltt-sessiond/session.c +++ b/ltt-sessiond/session.c @@ -5,7 +5,7 @@ * 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. - * + * * 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 diff --git a/ltt-sessiond/session.h b/ltt-sessiond/session.h index 5bfe16ac0..72183ef4b 100644 --- a/ltt-sessiond/session.h +++ b/ltt-sessiond/session.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2011 - David Goulet * * This program is free software; you can redistribute it and/or diff --git a/ltt-sessiond/traceable-app.c b/ltt-sessiond/traceable-app.c new file mode 100644 index 000000000..bbb1b539f --- /dev/null +++ b/ltt-sessiond/traceable-app.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2011 - David Goulet + * + * 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. + * + * 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#include "lttngerr.h" +#include "traceable-app.h" + +/* Number of element for the list below. */ +static unsigned int traceable_app_count; + +/* Init ust traceabl application's list */ +struct ltt_traceable_app_list ltt_traceable_app_list = { + .head = CDS_LIST_HEAD_INIT(ltt_traceable_app_list.head), +}; + +/* List mutex */ +pthread_mutex_t ltt_traceable_app_list_mutex; + +/* Internal function */ +static void add_traceable_app(struct ltt_traceable_app *lta); +static void del_traceable_app(struct ltt_traceable_app *lta); + +/* + * add_traceable_app + * + * Add a traceable application structure to the global + * list protected by a mutex. + */ +static void add_traceable_app(struct ltt_traceable_app *lta) +{ + pthread_mutex_lock(<t_traceable_app_list_mutex); + cds_list_add(<a->list, <t_traceable_app_list.head); + traceable_app_count++; + pthread_mutex_unlock(<t_traceable_app_list_mutex); +} + +/* + * del_traceable_app + * + * Delete a traceable application structure from the + * global list protected by a mutex. + */ +static void del_traceable_app(struct ltt_traceable_app *lta) +{ + pthread_mutex_lock(<t_traceable_app_list_mutex); + cds_list_del(<a->list); + /* Sanity check */ + if (traceable_app_count != 0) { + traceable_app_count--; + } + pthread_mutex_unlock(<t_traceable_app_list_mutex); +} + +/* + * register_traceable_app + * + * Using pid and uid (of the app), allocate + * a new ltt_traceable_app struct and add it + * to the global traceable app list. + * + * On success, return 0, else return malloc ENOMEM. + */ +int register_traceable_app(pid_t pid, uid_t uid) +{ + struct ltt_traceable_app *lta; + + lta = malloc(sizeof(struct ltt_traceable_app)); + if (lta == NULL) { + perror("malloc"); + return -ENOMEM; + } + + lta->uid = uid; + lta->pid = pid; + add_traceable_app(lta); + DBG("PID %d registered", pid); + + return 0; +} + +/* + * unregister_traceable_app + * + * Unregister app by removing it from the global + * traceable app list and freeing the data struct. + */ +void unregister_traceable_app(pid_t pid) +{ + struct ltt_traceable_app *lta; + + lta = find_app_by_pid(pid); + if (lta != NULL) { + del_traceable_app(lta); + free(lta); + DBG("PID %d unregistered", pid); + } +} + +/* + * get_app_count + * + * Return traceable_app_count + */ +unsigned int get_app_count(void) +{ + return traceable_app_count; +} + +/* + * find_app_by_pid + * + * Iterate over the traceable apps list and + * return a pointer or NULL if not found. + */ +struct ltt_traceable_app *find_app_by_pid(pid_t pid) +{ + struct ltt_traceable_app *iter; + + pthread_mutex_lock(<t_traceable_app_list_mutex); + cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { + if (iter->pid == pid) { + pthread_mutex_unlock(<t_traceable_app_list_mutex); + /* Found */ + return iter; + } + } + pthread_mutex_unlock(<t_traceable_app_list_mutex); + + return NULL; +} + +/* + * get_app_list_pids + * + * List traceable user-space application and fill an + * array of pids. + */ +void get_app_list_pids(pid_t *pids) +{ + int i = 0; + struct ltt_traceable_app *iter; + + /* Protected by a mutex here because the threads manage_client + * and manage_apps can access this list. + */ + pthread_mutex_lock(<t_traceable_app_list_mutex); + cds_list_for_each_entry(iter, <t_traceable_app_list.head, list) { + pids[i] = iter->pid; + i++; + } + pthread_mutex_unlock(<t_traceable_app_list_mutex); +} diff --git a/ltt-sessiond/traceable-app.h b/ltt-sessiond/traceable-app.h new file mode 100644 index 000000000..a0666d582 --- /dev/null +++ b/ltt-sessiond/traceable-app.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2011 - David Goulet + * + * 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. + * + * 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _TRACEABLE_APP_H +#define _TRACEABLE_APP_H + +/* Traceable application list */ +struct ltt_traceable_app_list { + struct cds_list_head head; +}; + +/* Registered traceable applications. Libust registers + * to the session daemon and a linked list is kept + * of all running traceable app. + */ +struct ltt_traceable_app { + struct cds_list_head list; + pid_t pid; + uid_t uid; /* User ID that owns the apps */ +}; + +struct ltt_traceable_app *find_app_by_pid(pid_t pid); +int register_traceable_app(pid_t pid, uid_t uid); +void unregister_traceable_app(pid_t pid); +void get_app_list_pids(pid_t *pids); +unsigned int get_app_count(void); + +#endif /* _TRACEABLE_APP_H */ -- 2.34.1