]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/audiod_exit_cleanup'
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 26 Oct 2014 12:11:41 +0000 (13:11 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 26 Oct 2014 12:14:05 +0000 (13:14 +0100)
Cooked for two months.

* t/audiod_exit_cleanup:
  audiod: Clean up by notifying tasks.

1  2 
NEWS
audiod.c
audiod_command.c
error.h

diff --combined NEWS
index 6ff788bf06107d4c2d18c54b543ce775840b3583,40ab08a10cc59a8dd8849436feee4a669b5d972c..305d9147b2f0be1a3f02697be4a769fed2024449
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,18 -1,6 +1,19 @@@
  NEWS
  ====
  
 +-----------------------------------------------
 +0.5.4 (to be announced) "exponential alignment"
 +-----------------------------------------------
 +
 +      - Minor cleanups to daemon.c.
 +      - New URLs for home page and git services.
 +      - Improved error diagnostics for the mvblob commands.
 +      - New sender subcommand: status.
 +      - Improved help text for server and afs commands.
++      - audiod memory leak fixes.
 +
 +Download: ./releases/paraslash-git.tar.bz2
 +
  ---------------------------------------------
  0.5.3 (2014-08-01) "symbolic synchronization"
  ---------------------------------------------
diff --combined audiod.c
index a072071c199d6fd3f90bb9448101ff62790c9db4,74298e3c5f3822cda0e7565beaaf39d7520231b6..d9df3847b61c1ff93f7fcf8389ccb90baadff17e
+++ b/audiod.c
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Copyright (C) 2005-2014 Andre Noll <maan@systemlinux.org>
 + * Copyright (C) 2005-2014 Andre Noll <maan@tuebingen.mpg.de>
   *
   * Licensed under the GPL v2. For licencing details see COPYING.
   */
@@@ -1006,16 -1006,22 +1006,22 @@@ static void signal_pre_select(struct sc
        para_fd_set(st->fd, &s->rfds, &s->max_fileno);
  }
  
- static int signal_post_select(struct sched *s, __a_unused void *context)
+ static int signal_post_select(struct sched *s, void *context)
  {
-       int signum;
+       struct signal_task *st = context;
+       int ret, signum;
+       ret = task_get_notification(st->task);
+       if (ret < 0)
+               return ret;
        signum = para_next_signal(&s->rfds);
        switch (signum) {
        case SIGINT:
        case SIGTERM:
        case SIGHUP:
                PARA_NOTICE_LOG("received signal %d\n", signum);
-               clean_exit(EXIT_FAILURE, "caught deadly signal");
+               task_notify_all(s, E_AUDIOD_SIGNAL);
+               return -E_AUDIOD_SIGNAL;
        }
        return 0;
  }
@@@ -1034,10 -1040,17 +1040,17 @@@ static int command_post_select(struct s
        struct timeval tmp, delay;
        bool force = true;
  
-       ret = handle_connect(ct->fd, &s->rfds);
+       ret = task_get_notification(ct->task);
        if (ret < 0)
+               return ret;
+       ret = handle_connect(ct->fd, &s->rfds);
+       if (ret < 0) {
                PARA_ERROR_LOG("%s\n", para_strerror(-ret));
-       else if (ret > 0)
+               if (ret == -E_AUDIOD_TERM) {
+                       task_notify_all(s, -ret);
+                       return ret;
+               }
+       } else if (ret > 0)
                goto dump;
  
        /* if last status dump was less than 500ms ago, do nothing */
@@@ -1140,19 -1153,13 +1153,13 @@@ static void close_unused_slots(void
                        close_slot(i);
  }
  
- /**
-  * Close the connection to para_server and exit.
-  *
-  * \param status The exit status which is passed to exit(3).
-  * \param msg The log message
-  *
-  * Log \a msg with loglevel \p EMERG, close the connection to para_server and
-  * all slots, and call \p exit(status). \a status should be either EXIT_SUCCESS
-  * or EXIT_FAILURE.
+ /*
+  * Cleanup all resources.
   *
-  * \sa exit(3).
+  * This performs various cleanups, removes the audiod socket and closes the
+  * connection to para_server.
   */
void __noreturn clean_exit(int status, const char *msg)
static void audiod_cleanup(void)
  {
        if (socket_name)
                unlink(socket_name);
        close_unused_slots();
        audiod_cmdline_parser_free(&conf);
        close_stat_clients();
-       PARA_EMERG_LOG("%s\n", msg);
-       exit(status);
  }
  
  /*
@@@ -1226,7 -1231,11 +1231,11 @@@ min_delay
  static int status_post_select(struct sched *s, void *context)
  {
        struct status_task *st = context;
+       int ret;
  
+       ret = task_get_notification(st->task);
+       if (ret < 0)
+               return ret;
        if (audiod_status == AUDIOD_OFF) {
                if (!st->ct)
                        goto out;
        if (st->ct) {
                char *buf;
                size_t sz;
-               int ret;
  
                ret = btr_node_status(st->btrn, st->min_iqs, BTR_NT_LEAF);
                if (ret < 0) {
@@@ -1394,7 -1402,7 +1402,7 @@@ int main(int argc, char *argv[]
        writer_init();
        if (conf.help_given || conf.detailed_help_given)
                print_help_and_die();
 -      drop_privileges_or_die(conf.user_arg, conf.group_arg);
 +      daemon_drop_privileges_or_die(conf.user_arg, conf.group_arg);
        parse_config_or_die();
        init_colors_or_die();
        init_random_seed_or_die();
                PARA_EMERG_LOG("%s\n", para_strerror(-ret));
                exit(EXIT_FAILURE);
        }
 -      log_welcome("para_audiod");
 -      set_server_start_time(NULL);
 +      daemon_log_welcome("para_audiod");
 +      daemon_set_start_time();
        set_initial_status();
        FOR_EACH_SLOT(i)
                clear_slot(i);
        sched.default_timeout.tv_sec = 2;
        sched.default_timeout.tv_usec = 999 * 1000;
        ret = schedule(&sched);
+       audiod_cleanup();
        sched_shutdown(&sched);
  
-       PARA_EMERG_LOG("%s\n", para_strerror(-ret));
-       return EXIT_FAILURE;
+       if (ret < 0)
+               PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+       return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;
  }
diff --combined audiod_command.c
index d5c53bf90059101cd345254e0a3c294c3df73307,2f2f3062146ba022b700137cb783c86794701515..2aae0d805e8286303a43df96b8a172b73e21e093
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Copyright (C) 2005-2014 Andre Noll <maan@systemlinux.org>
 + * Copyright (C) 2005-2014 Andre Noll <maan@tuebingen.mpg.de>
   *
   * Licensed under the GPL v2. For licencing details see COPYING.
   */
@@@ -376,10 -376,10 +376,10 @@@ static int com_grab(int fd, int argc, c
        return grab_client_new(fd, argc, argv, &sched);
  }
  
__noreturn static int com_term(int fd, __a_unused int argc, __a_unused char **argv)
+ static int com_term(int fd, __a_unused int argc, __a_unused char **argv)
  {
        close(fd);
-       clean_exit(EXIT_SUCCESS, "terminating on user request");
+       return -E_AUDIOD_TERM;
  }
  
  static int com_on(int fd, __a_unused int argc, __a_unused char **argv)
@@@ -527,7 -527,7 +527,7 @@@ void audiod_status_dump(bool force
                        free(new);
        }
  
 -      new = get_server_uptime_str(now);
 +      new = daemon_get_uptime_str(now);
        old = stat_item_values[SI_AUDIOD_UPTIME];
        if (force || !old || strcmp(old, new)) {
                free(old);
diff --combined error.h
index 05e7e57ead5478a26ebcfb7d5573ade5879ea607,8bc87335d7df56a13780fc51a65a7206d9db4619..c28a25a39bf7da44bfb20d330765912d8912ba6b
+++ b/error.h
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Copyright (C) 2006-2014 Andre Noll <maan@systemlinux.org>
 + * Copyright (C) 2006-2014 Andre Noll <maan@tuebingen.mpg.de>
   *
   * Licensed under the GPL v2. For licencing details see COPYING.
   */
@@@ -343,6 -343,8 +343,8 @@@ extern const char **para_errlist[]
        PARA_ERROR(NOT_PLAYING, "not playing"), \
        PARA_ERROR(AUDIOD_OFF, "audiod switched off"), \
        PARA_ERROR(STATUS_TIMEOUT, "status item timeout"), \
+       PARA_ERROR(AUDIOD_SIGNAL, "caught deadly signal"), \
+       PARA_ERROR(AUDIOD_TERM, "terminating on user request"), \
  
  
  #define AUDIOD_COMMAND_ERRORS \