]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/daemon_cleanups'
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 17 Aug 2014 11:17:23 +0000 (13:17 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 17 Aug 2014 11:18:53 +0000 (13:18 +0200)
Cooking for two months.

* daemon: Rename public functions.
* Simplify set_server_start_time().

Conflicts:
server.c

1  2 
NEWS
audiod.c
audiod_command.c
server.c

diff --combined NEWS
index 40ab08a10cc59a8dd8849436feee4a669b5d972c,642c1fc422225141a1fa1a555113746a69b8a93e..e179240b9d480f5c7159c40bf7a9c92d779eb2cb
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,26 -1,15 +1,34 @@@
  NEWS
  ====
  
 --------------------------------------------------
 -0.5.3 (to be released) "symbolic synchronization"
 --------------------------------------------------
++-----------------------------------------------
++0.5.4 (to be announced) "exponential alignment"
++-----------------------------------------------
++      * Minor cleanups to daemon.c.
++
++Download: ./releases/paraslash-git.tar.bz2
++
 +---------------------------------------------
 +0.5.3 (2014-08-01) "symbolic synchronization"
 +---------------------------------------------
 +
 +Not many new features, but lots of fixes and usability improvements.
 +
 +      - para_gui has been converted to use the paraslash scheduler.
        - Various alsa-related fixes, mostly for the raspberry pi.
 +      - Many scheduler improvements and cleanups.
        - The test suite has been extended to include sanity checks
          for the generated man pages.
        - ao_writer fixes. This writer was in a quite bad shape. Many
          serious bugs have been fixed.
 +      - new audiod command: version.
 +      - Minor improvements to the bitstream API.
 +      - The cpsi command now prints a meaningful error message if
 +        none of the given patterns matched any audio file.
 +
 +Downloads: ./releases/paraslash-0.5.3.tar.bz2 (tarball),
 +./releases/paraslash-0.5.3.tar.bz2.asc (signature)
  
  ----------------------------------------
  0.5.2 (2014-04-11) "orthogonal interior"
diff --combined audiod.c
index 6fd101a093b2f7f94abe43cab0331781c8a57a3a,bd32ad387fd7ee2d6c9816a4a7603354a572fa1f..b536ea4a8fad6b1aa8b0465efd7c33ba069c4277
+++ b/audiod.c
@@@ -93,10 -93,14 +93,10 @@@ enum vss_status_flags 
   */
  struct sched sched = {.max_fileno = 0};
  
 -/**
 - * The task for obtaining para_server's status (para_client stat).
 - *
 - * \sa struct task, struct sched.
 - */
 +/* The task for obtaining para_server's status (para_client stat). */
  struct status_task {
        /** The associated task structure of audiod. */
 -      struct task task;
 +      struct task *task;
        /** Client data associated with the stat task. */
        struct client_task *ct;
        /** Do not restart client command until this time. */
@@@ -164,7 -168,7 +164,7 @@@ struct command_task 
        /** the local listening socket */
        int fd;
        /** the associated task structure */
 -      struct task task;
 +      struct task *task;
  };
  
  /** iterate over all supported audio formats */
@@@ -387,7 -391,6 +387,7 @@@ static void close_receiver(int slot_num
                audio_formats[s->format], slot_num);
        a->receiver->close(s->receiver_node);
        btr_remove_node(&s->receiver_node->btrn);
 +      task_reap(&s->receiver_node->task);
        free(s->receiver_node);
        s->receiver_node = NULL;
        tv_add(now, &(struct timeval)EMBRACE(0, 200 * 1000),
@@@ -404,7 -407,6 +404,7 @@@ static void writer_cleanup(struct write
        PARA_INFO_LOG("closing %s\n", writer_names[wn->writer_num]);
        w->close(wn);
        btr_remove_node(&wn->btrn);
 +      task_reap(&wn->task);
  }
  
  static void close_writers(struct slot_info *s)
@@@ -442,7 -444,6 +442,7 @@@ static void close_filters(struct slot_i
                if (f->close)
                        f->close(fn);
                btr_remove_node(&fn->btrn);
 +              task_reap(&fn->task);
        }
        free(s->fns);
        s->fns = NULL;
@@@ -458,7 -459,7 +458,7 @@@ static void notify_receivers(int error
                        continue;
                if (!s->receiver_node)
                        continue;
 -              task_notify(&s->receiver_node->task, error);
 +              task_notify(s->receiver_node->task, error);
        }
  }
  
@@@ -496,26 -497,22 +496,26 @@@ static void open_filters(struct slot_in
        s->fns = para_calloc(nf * sizeof(struct filter_node));
        parent = s->receiver_node->btrn;
        for (i = 0; i < nf; i++) {
 +              char buf[20];
                struct filter *f = filters + a->filter_nums[i];
                fn = s->fns + i;
                fn->filter_num = a->filter_nums[i];
                fn->conf = a->filter_conf[i];
 -              fn->task.pre_select = f->pre_select;
 -              fn->task.post_select = f->post_select;
                fn->btrn = btr_new_node(&(struct btr_node_description)
                        EMBRACE(.name = f->name, .parent = parent,
                                .handler = f->execute, .context = fn));
  
                f->open(fn);
 -              register_task(&sched, &fn->task);
 +              sprintf(buf, "%s (slot %d)", f->name, (int)(s - slot));
 +              fn->task = task_register(&(struct task_info) {
 +                      .name = buf,
 +                      .pre_select = f->pre_select,
 +                      .post_select = f->post_select,
 +                      .context = fn,
 +              }, &sched);
                parent = fn->btrn;
                PARA_NOTICE_LOG("%s filter %d/%d (%s) started in slot %d\n",
                        audio_formats[s->format], i,  nf, f->name, (int)(s - slot));
 -              sprintf(fn->task.status, "%s (slot %d)", f->name, (int)(s - slot));
        }
  }
  
@@@ -569,12 -566,10 +569,12 @@@ static int open_receiver(int format
        s->receiver_node = rn;
        PARA_NOTICE_LOG("started %s: %s receiver in slot %d\n",
                audio_formats[format], r->name, slot_num);
 -      rn->task.pre_select = r->pre_select;
 -      rn->task.post_select = r->post_select;
 -      sprintf(rn->task.status, "%s receiver node", r->name);
 -      register_task(&sched, &rn->task);
 +      rn->task = task_register(&(struct task_info) {
 +              .name = r->name,
 +              .pre_select = r->pre_select,
 +              .post_select = r->post_select,
 +              .context = rn,
 +      }, &sched);
        return slot_num;
  }
  
@@@ -589,7 -584,7 +589,7 @@@ static bool receiver_running(void
  
                if (!s->receiver_node)
                        continue;
 -              if (s->receiver_node->task.error >= 0)
 +              if (task_status(s->receiver_node->task) >= 0)
                        return true;
                if (ss1 == ss2)
                        return true;
@@@ -616,7 -611,7 +616,7 @@@ struct btr_node *audiod_get_btr_root(vo
                struct timeval rstime;
                if (!s->receiver_node)
                        continue;
 -              if (s->receiver_node->task.error < 0)
 +              if (task_status(s->receiver_node->task) < 0)
                        continue;
                btr_get_node_start(s->receiver_node->btrn, &rstime);
                if (newest_slot >= 0 && tv_diff(&rstime, &newest_rstime, NULL) < 0)
        exit(EXIT_FAILURE);
  }
  
 -static void signal_pre_select(struct sched *s, struct task *t)
 +static void signal_pre_select(struct sched *s, void *context)
  {
 -      struct signal_task *st = container_of(t, struct signal_task, task);
 +      struct signal_task *st = context;
        para_fd_set(st->fd, &s->rfds, &s->max_fileno);
  }
  
 -static int signal_post_select(struct sched *s, __a_unused struct task *t)
 +static int signal_post_select(struct sched *s, __a_unused void *context)
  {
        int signum;
 -
        signum = para_next_signal(&s->rfds);
        switch (signum) {
        case SIGINT:
        return 0;
  }
  
 -static void signal_setup_default(struct signal_task *st)
 +static void command_pre_select(struct sched *s, void *context)
  {
 -      st->task.pre_select = signal_pre_select;
 -      st->task.post_select = signal_post_select;
 -      sprintf(st->task.status, "signal task");
 -}
 -
 -static void command_pre_select(struct sched *s, struct task *t)
 -{
 -      struct command_task *ct = container_of(t, struct command_task, task);
 +      struct command_task *ct = context;
        para_fd_set(ct->fd, &s->rfds, &s->max_fileno);
  }
  
 -static int command_post_select(struct sched *s, struct task *t)
 +static int command_post_select(struct sched *s, void *context)
  {
        int ret;
 -      struct command_task *ct = container_of(t, struct command_task, task);
 +      struct command_task *ct = context;
        static struct timeval last_status_dump;
        struct timeval tmp, delay;
        bool force = true;
@@@ -1064,21 -1067,17 +1064,21 @@@ dump
  
  static void init_command_task(struct command_task *ct)
  {
 -      ct->task.pre_select = command_pre_select;
 -      ct->task.post_select = command_post_select;
 -      ct->task.error = 0;
        ct->fd = audiod_get_socket(); /* doesn't return on errors */
 -      sprintf(ct->task.status, "command task");
 +
 +      ct->task = task_register(&(struct task_info) {
 +              .name = "command",
 +              .pre_select = command_pre_select,
 +              .post_select = command_post_select,
 +              .context = ct,
 +      }, &sched);
  }
  
  static void close_stat_pipe(void)
  {
        if (!stat_task->ct)
                return;
 +      task_reap(&stat_task->ct->task);
        client_close(stat_task->ct);
        stat_task->ct = NULL;
        clear_and_dump_items();
@@@ -1104,17 -1103,17 +1104,17 @@@ static bool must_close_slot(int slot_nu
  
        if (s->format < 0)
                return false;
 -      if (s->receiver_node && s->receiver_node->task.error >= 0)
 +      if (s->receiver_node && task_status(s->receiver_node->task) >= 0)
                return false;
        for (i = 0; i < a->num_filters; i++)
 -              if (s->fns && s->fns[i].task.error >= 0)
 +              if (s->fns && task_status(s->fns[i].task) >= 0)
                        return false;
        if (a->num_writers > 0) {
                for (i = 0; i < a->num_writers; i++)
 -                      if (s->wns && s->wns[i].task.error >= 0)
 +                      if (s->wns && task_status(s->wns[i].task) >= 0)
                                return false;
        } else {
 -              if (s->wns && s->wns[0].task.error >= 0)
 +              if (s->wns && task_status(s->wns[0].task) >= 0)
                        return false;
        }
        return true;
@@@ -1172,6 -1171,7 +1172,6 @@@ static void start_stop_decoders(void
  {
        int ret;
        struct slot_info *sl;
 -      struct audio_format_info *a;
  
        close_unused_slots();
        if (audiod_status != AUDIOD_ON ||
                return;
        }
        sl = slot + ret;
 -      a = afi + sl->format;
 -      if (a->num_filters)
 -              open_filters(sl);
 +      open_filters(sl);
        open_writers(sl);
        activate_grab_clients(&sched);
        btr_log_tree(sl->receiver_node->btrn, LL_NOTICE);
  }
  
 -static void status_pre_select(struct sched *s, struct task *t)
 +static void status_pre_select(struct sched *s, void *context)
  {
 -      struct status_task *st = container_of(t, struct status_task, task);
 +      struct status_task *st = context;
        int i, ret, cafn = stat_task->current_audio_format_num;
  
        if (must_start_decoder())
@@@ -1223,15 -1225,15 +1223,15 @@@ min_delay
  }
  
  /* restart the client task if necessary */
 -static int status_post_select(struct sched *s, struct task *t)
 +static int status_post_select(struct sched *s, void *context)
  {
 -      struct status_task *st = container_of(t, struct status_task, task);
 +      struct status_task *st = context;
  
        if (audiod_status == AUDIOD_OFF) {
                if (!st->ct)
                        goto out;
 -              if (st->ct->task.error >= 0) {
 -                      task_notify(&st->ct->task, E_AUDIOD_OFF);
 +              if (task_status(st->ct->task) >= 0) {
 +                      task_notify(st->ct->task, E_AUDIOD_OFF);
                        goto out;
                }
                close_stat_pipe();
                        struct timeval diff;
                        tv_diff(now, &st->last_status_read, &diff);
                        if (diff.tv_sec > 61)
 -                              task_notify(&st->ct->task, E_STATUS_TIMEOUT);
 +                              task_notify(st->ct->task, E_STATUS_TIMEOUT);
                        goto out;
                }
                btr_merge(st->btrn, st->min_iqs);
                sz = btr_next_buffer(st->btrn, &buf);
                ret = for_each_stat_item(buf, sz, update_item);
                if (ret < 0) {
 -                      task_notify(&st->ct->task, -ret);
 +                      task_notify(st->ct->task, -ret);
                        goto out;
                }
                if (sz != ret) {
  static void init_status_task(struct status_task *st)
  {
        memset(st, 0, sizeof(struct status_task));
 -      st->task.pre_select = status_pre_select;
 -      st->task.post_select = status_post_select;
        st->sa_time_diff_sign = 1;
        st->clock_diff_count = conf.clock_diff_count_arg;
        st->current_audio_format_num = -1;
 -      sprintf(st->task.status, "stat");
        st->btrn = btr_new_node(&(struct btr_node_description)
                EMBRACE(.name = "stat"));
 +
 +      stat_task->task = task_register(&(struct task_info) {
 +              .name = "stat",
 +              .pre_select = status_pre_select,
 +              .post_select = status_post_select,
 +              .context = stat_task,
 +      }, &sched);
  }
  
  static void set_initial_status(void)
@@@ -1394,7 -1392,7 +1394,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);
        setup_signal_handling();
 -      signal_setup_default(sig_task);
  
        init_status_task(stat_task);
        init_command_task(cmd_task);
        if (conf.daemon_given)
                daemonize(false /* parent exits immediately */);
  
 -      register_task(&sched, &sig_task->task);
 -      register_task(&sched, &cmd_task->task);
 -      register_task(&sched, &stat_task->task);
 +      sig_task->task = task_register(&(struct task_info) {
 +              .name = "signal",
 +              .pre_select = signal_pre_select,
 +              .post_select = signal_post_select,
 +              .context = sig_task,
 +      }, &sched);
 +
        sched.default_timeout.tv_sec = 2;
        sched.default_timeout.tv_usec = 999 * 1000;
        ret = schedule(&sched);
 +      sched_shutdown(&sched);
  
        PARA_EMERG_LOG("%s\n", para_strerror(-ret));
        return EXIT_FAILURE;
diff --combined audiod_command.c
index 56d922e6681e66d0d9c4f65df86569806a38ca80,e65f747a50625b99fd3c06c69c62f30d475ddbac..7d284dc770eab6aef83a9e7d4fe5c74d241b7d47
@@@ -29,7 -29,6 +29,7 @@@
  #include "string.h"
  #include "write.h"
  #include "fd.h"
 +#include "version.h"
  #include "audiod_command_list.h"
  
  extern struct sched sched;
@@@ -420,22 -419,6 +420,22 @@@ static int com_cycle(int fd, int argc, 
        return 1;
  }
  
 +static int com_version(int fd, int argc, char **argv)
 +{
 +      int ret;
 +      char *msg;
 +
 +      if (argc > 1 && strcmp(argv[1], "-v") == 0)
 +              msg = make_message("%s", version_text("audiod"));
 +      else
 +              msg = make_message("%s\n", version_single_line("audiod"));
 +      ret = client_write(fd, msg);
 +      free(msg);
 +      if (ret >= 0)
 +              close(fd);
 +      return ret;
 +}
 +
  static int check_perms(uid_t uid)
  {
        int i;
@@@ -527,7 -510,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 server.c
index 908e039b1cf66be5909b102edfb20aa83ceb2b2a,88ee2425615a543394a88e7941b5b6d5dd3d6a5f..2c74e6138b04e402492b3fda566616e289dff968
+++ b/server.c
@@@ -110,7 -110,7 +110,7 @@@ struct server_command_task 
        /** Argument vector passed to para_server's main function. */
        char **argv;
        /** The command task structure for scheduling. */
 -      struct task task;
 +      struct task *task;
  };
  
  static int want_colors(void)
@@@ -235,9 -235,9 +235,9 @@@ out
        exit(EXIT_FAILURE);
  }
  
 -static void signal_pre_select(struct sched *s, struct task *t)
 +static void signal_pre_select(struct sched *s, void *context)
  {
 -      struct signal_task *st = container_of(t, struct signal_task, task);
 +      struct signal_task *st = context;
        para_fd_set(st->fd, &s->rfds, &s->max_fileno);
  }
  
@@@ -253,7 -253,7 +253,7 @@@ static void handle_sighup(void
                kill(mmd->afs_pid, SIGHUP);
  }
  
 -static int signal_post_select(struct sched *s, __a_unused struct task *t)
 +static int signal_post_select(struct sched *s, __a_unused void *context)
  {
        int signum = para_next_signal(&s->rfds);
  
@@@ -312,6 -312,10 +312,6 @@@ static void init_signal_task(void
        static struct signal_task signal_task_struct,
                *st = &signal_task_struct;
  
 -      st->task.pre_select = signal_pre_select;
 -      st->task.post_select = signal_post_select;
 -      sprintf(st->task.status, "signal task");
 -
        PARA_NOTICE_LOG("setting up signal handling\n");
        st->fd = para_signal_init(); /* always successful */
        para_install_sighandler(SIGINT);
        para_install_sighandler(SIGCHLD);
        para_sigaction(SIGPIPE, SIG_IGN);
        add_close_on_fork_list(st->fd);
 -      register_task(&sched, &st->task);
 +      st->task = task_register(&(struct task_info) {
 +              .name = "signal",
 +              .pre_select = signal_pre_select,
 +              .post_select = signal_post_select,
 +              .context = st,
 +
 +      }, &sched);
  }
  
 -static void command_pre_select(struct sched *s, struct task *t)
 +static void command_pre_select(struct sched *s, void *context)
  {
 -      struct server_command_task *sct = container_of(t, struct server_command_task, task);
 +      struct server_command_task *sct = context;
        para_fd_set(sct->listen_fd, &s->rfds, &s->max_fileno);
  }
  
 -static int command_post_select(struct sched *s, struct task *t)
 +static int command_post_select(struct sched *s, void *context)
  {
 -      struct server_command_task *sct = container_of(t, struct server_command_task, task);
 +      struct server_command_task *sct = context;
  
        int new_fd, ret, i;
        char *peer_name;
@@@ -401,6 -399,8 +401,6 @@@ static void init_server_command_task(in
                *sct = &server_command_task_struct;
  
        PARA_NOTICE_LOG("initializing tcp command socket\n");
 -      sct->task.pre_select = command_pre_select;
 -      sct->task.post_select = command_post_select;
        sct->argc = argc;
        sct->argv = argv;
        ret = para_listen_simple(IPPROTO_TCP, conf.port_arg);
        if (ret < 0)
                goto err;
        add_close_on_fork_list(sct->listen_fd); /* child doesn't need the listener */
 -      sprintf(sct->task.status, "server command task");
 -      register_task(&sched, &sct->task);
 +      sct->task = task_register(&(struct task_info) {
 +              .name = "server command",
 +              .pre_select = command_pre_select,
 +              .post_select = command_post_select,
 +              .context = sct,
 +      }, &sched);
        return;
  err:
        PARA_EMERG_LOG("%s\n", para_strerror(-ret));
@@@ -483,12 -479,12 +483,12 @@@ static void server_init(int argc, char 
        version_handle_flag("server", conf.version_given);
        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 file, open log and set defaults */
        parse_config_or_die(0);
-       log_welcome("para_server");
+       daemon_log_welcome("para_server");
        init_ipc_or_die(); /* init mmd struct and mmd->lock */
-       set_server_start_time(NULL);
+       daemon_set_start_time();
        init_user_list(user_list_file);
        /* become daemon */
        if (conf.daemon_given)
  static void status_refresh(void)
  {
        static int prev_uptime = -1, prev_events = -1;
-       int uptime = get_server_uptime(now);
+       int uptime = daemon_get_uptime(now);
  
        if (prev_events != mmd->events)
                goto out;
@@@ -575,7 -571,6 +575,7 @@@ int main(int argc, char *argv[]
        server_init(argc, argv);
        mutex_lock(mmd_mutex);
        ret = schedule(&sched);
 +      sched_shutdown(&sched);
        if (ret < 0) {
                PARA_EMERG_LOG("%s\n", para_strerror(-ret));
                exit(EXIT_FAILURE);