Merge branch 't/sound_device_lock'
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 23 Nov 2014 16:06:04 +0000 (17:06 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 23 Nov 2014 16:07:21 +0000 (17:07 +0100)
Cooking since 2014-09-22.

* t/sound_device_lock:
  oss: Avoid sound artefacts on some setups.
  oss: Introduce sound device lock.
  audiod: Invalidate current audio format on close.

1  2 
NEWS
audiod.c

diff --combined NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -5,12 -5,9 +5,13 @@@ NEW
  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.
 +      - 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.
++      - oss_writer improvements.
  
  Download: ./releases/paraslash-git.tar.bz2
  
diff --combined audiod.c
+++ b/audiod.c
@@@ -390,6 -390,7 +390,7 @@@ static void close_receiver(int slot_num
        task_reap(&s->receiver_node->task);
        free(s->receiver_node);
        s->receiver_node = NULL;
+       stat_task->current_audio_format_num = -1;
        tv_add(now, &(struct timeval)EMBRACE(0, 200 * 1000),
                &a->restart_barrier);
  }
@@@ -1006,22 -1007,16 +1007,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;
  }
@@@ -1040,17 -1035,10 +1041,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 */
@@@ -1153,13 -1141,19 +1154,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);
  }
  
  /*
@@@ -1231,11 -1227,7 +1232,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) {
@@@ -1443,10 -1436,8 +1444,10 @@@ int main(int argc, char *argv[]
        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;
  }