Change wfq usages for wfcq
[lttng-tools.git] / src / bin / lttng-sessiond / main.c
index 6a918ec56a73926621a20119eb3e3686d0f3d998..fdc53760330d6d12766dc9ed370b1a1b641f5290 100644 (file)
@@ -85,6 +85,7 @@ static char *opt_load_session_path;
 static pid_t ppid;          /* Parent PID for --sig-parent option */
 static pid_t child_ppid;    /* Internal parent PID use with daemonize. */
 static char *rundir;
+static int lockfile_fd = -1;
 
 /* Set to 1 when a SIGUSR1 signal is received. */
 static int recv_child_signal;
@@ -511,6 +512,27 @@ static void close_consumer_sockets(void)
        }
 }
 
+/*
+ * Generate the full lock file path using the rundir.
+ *
+ * Return the snprintf() return value thus a negative value is an error.
+ */
+static int generate_lock_file_path(char *path, size_t len)
+{
+       int ret;
+
+       assert(path);
+       assert(rundir);
+
+       /* Build lockfile path from rundir. */
+       ret = snprintf(path, len, "%s/" DEFAULT_LTTNG_SESSIOND_LOCKFILE, rundir);
+       if (ret < 0) {
+               PERROR("snprintf lockfile path");
+       }
+
+       return ret;
+}
+
 /*
  * Cleanup the daemon
  */
@@ -592,14 +614,6 @@ static void cleanup(void)
        DBG("Removing directory %s", path);
        (void) rmdir(path);
 
-       /*
-        * We do NOT rmdir rundir because there are other processes
-        * using it, for instance lttng-relayd, which can start in
-        * parallel with this teardown.
-        */
-
-       free(rundir);
-
        DBG("Cleaning up all sessions");
 
        /* Destroy session list mutex */
@@ -664,6 +678,34 @@ static void cleanup(void)
                free(load_info);
        }
 
+       /*
+        * Cleanup lock file by deleting it and finaly closing it which will
+        * release the file system lock.
+        */
+       if (lockfile_fd >= 0) {
+               char lockfile_path[PATH_MAX];
+
+               ret = generate_lock_file_path(lockfile_path, sizeof(lockfile_path));
+               if (ret > 0) {
+                       ret = remove(lockfile_path);
+                       if (ret < 0) {
+                               PERROR("remove lock file");
+                       }
+                       ret = close(lockfile_fd);
+                       if (ret < 0) {
+                               PERROR("close lock file");
+                       }
+               }
+       }
+
+       /*
+        * We do NOT rmdir rundir because there are other processes
+        * using it, for instance lttng-relayd, which can start in
+        * parallel with this teardown.
+        */
+
+       free(rundir);
+
        /* <fun> */
        DBG("%c[%d;%dm*** assert failed :-) *** ==> %c[%dm%c[%d;%dm"
                        "Matthew, BEET driven development works!%c[%dm",
@@ -1643,7 +1685,7 @@ error_create:
 static void *thread_dispatch_ust_registration(void *data)
 {
        int ret, err = -1;
-       struct cds_wfq_node *node;
+       struct cds_wfcq_node *node;
        struct ust_command *ust_cmd = NULL;
        struct ust_reg_wait_node *wait_node = NULL, *tmp_wait_node;
        struct ust_reg_wait_queue wait_queue = {
@@ -1681,7 +1723,7 @@ static void *thread_dispatch_ust_registration(void *data)
 
                        health_code_update();
                        /* Dequeue command for registration */
-                       node = cds_wfq_dequeue_blocking(&ust_cmd_queue.queue);
+                       node = cds_wfcq_dequeue_blocking(&ust_cmd_queue.head, &ust_cmd_queue.tail);
                        if (node == NULL) {
                                DBG("Woken up but nothing in the UST command queue");
                                /* Continue thread execution */
@@ -2035,11 +2077,11 @@ static void *thread_registration_apps(void *data)
                                         * Lock free enqueue the registration request. The red pill
                                         * has been taken! This apps will be part of the *system*.
                                         */
-                                       cds_wfq_enqueue(&ust_cmd_queue.queue, &ust_cmd->node);
+                                       cds_wfcq_enqueue(&ust_cmd_queue.head, &ust_cmd_queue.tail, &ust_cmd->node);
 
                                        /*
                                         * Wake the registration queue futex. Implicit memory
-                                        * barrier with the exchange in cds_wfq_enqueue.
+                                        * barrier with the exchange in cds_wfcq_enqueue.
                                         */
                                        futex_nto1_wake(&ust_cmd_queue.futex);
                                }
@@ -2974,6 +3016,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock,
                        }
 
                        /* 32-bit */
+                       pthread_mutex_lock(&ustconsumer32_data.pid_mutex);
                        if (consumerd32_bin[0] != '\0' &&
                                        ustconsumer32_data.pid == 0 &&
                                        cmd_ctx->lsm->cmd_type != LTTNG_REGISTER_CONSUMER) {
@@ -4198,11 +4241,20 @@ static int set_option(int opt, const char *arg, const char *optname)
                opt_background = 1;
                break;
        case 'g':
+               /*
+                * If the override option is set, the pointer points to a
+                * *non* const thus freeing it even though the variable type is
+                * set to const.
+                */
+               if (tracing_group_name_override) {
+                       free((void *) tracing_group_name);
+               }
                tracing_group_name = strdup(arg);
                if (!tracing_group_name) {
                        perror("strdup");
                        ret = -ENOMEM;
                }
+               tracing_group_name_override = 1;
                break;
        case 'h':
                usage();
@@ -4258,6 +4310,9 @@ static int set_option(int opt, const char *arg, const char *optname)
                }
                break;
        case 'u':
+               if (consumerd32_bin_override) {
+                       free((void *) consumerd32_bin);
+               }
                consumerd32_bin = strdup(arg);
                if (!consumerd32_bin) {
                        perror("strdup");
@@ -4266,6 +4321,9 @@ static int set_option(int opt, const char *arg, const char *optname)
                consumerd32_bin_override = 1;
                break;
        case 'U':
+               if (consumerd32_libdir_override) {
+                       free((void *) consumerd32_libdir);
+               }
                consumerd32_libdir = strdup(arg);
                if (!consumerd32_libdir) {
                        perror("strdup");
@@ -4274,6 +4332,9 @@ static int set_option(int opt, const char *arg, const char *optname)
                consumerd32_libdir_override = 1;
                break;
        case 't':
+               if (consumerd64_bin_override) {
+                       free((void *) consumerd64_bin);
+               }
                consumerd64_bin = strdup(arg);
                if (!consumerd64_bin) {
                        perror("strdup");
@@ -4282,6 +4343,9 @@ static int set_option(int opt, const char *arg, const char *optname)
                consumerd64_bin_override = 1;
                break;
        case 'T':
+               if (consumerd64_libdir_override) {
+                       free((void *) consumerd64_libdir);
+               }
                consumerd64_libdir = strdup(arg);
                if (!consumerd64_libdir) {
                        perror("strdup");
@@ -4290,6 +4354,7 @@ static int set_option(int opt, const char *arg, const char *optname)
                consumerd64_libdir_override = 1;
                break;
        case 'p':
+               free(opt_pidfile);
                opt_pidfile = strdup(arg);
                if (!opt_pidfile) {
                        perror("strdup");
@@ -4315,6 +4380,7 @@ static int set_option(int opt, const char *arg, const char *optname)
                break;
        }
        case 'l':
+               free(opt_load_session_path);
                opt_load_session_path = strdup(arg);
                if (!opt_load_session_path) {
                        perror("strdup");
@@ -4322,6 +4388,7 @@ static int set_option(int opt, const char *arg, const char *optname)
                }
                break;
        case 'P': /* probe modules list */
+               free(kmod_probes_list);
                kmod_probes_list = strdup(arg);
                if (!kmod_probes_list) {
                        perror("strdup");
@@ -4830,6 +4897,24 @@ error:
        return;
 }
 
+/*
+ * Create lockfile using the rundir and return its fd.
+ */
+static int create_lockfile(void)
+{
+       int ret;
+       char lockfile_path[PATH_MAX];
+
+       ret = generate_lock_file_path(lockfile_path, sizeof(lockfile_path));
+       if (ret < 0) {
+               goto error;
+       }
+
+       ret = utils_create_lock_file(lockfile_path);
+error:
+       return ret;
+}
+
 /*
  * Write JUL TCP port using the rundir.
  */
@@ -5035,6 +5120,11 @@ int main(int argc, char **argv)
                }
        }
 
+       lockfile_fd = create_lockfile();
+       if (lockfile_fd < 0) {
+               goto error;
+       }
+
        /* Set consumer initial state */
        kernel_consumerd_state = CONSUMER_STOPPED;
        ust_consumerd_state = CONSUMER_STOPPED;
@@ -5167,7 +5257,7 @@ int main(int argc, char **argv)
        buffer_reg_init_pid_registry();
 
        /* Init UST command queue. */
-       cds_wfq_init(&ust_cmd_queue.queue);
+       cds_wfcq_init(&ust_cmd_queue.head, &ust_cmd_queue.tail);
 
        /*
         * Get session list pointer. This pointer MUST NOT be free(). This list is
This page took 0.027364 seconds and 5 git commands to generate.