/*
- * 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.
*/
*/
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. */
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);
}
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;
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 = task_context(t);
+ 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 command_pre_select(struct sched *s, struct task *t)
+static void command_pre_select(struct sched *s, void *context)
{
- struct command_task *ct = task_context(t);
+ 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 = task_context(t);
+ struct command_task *ct = context;
static struct timeval last_status_dump;
struct timeval tmp, delay;
bool force = true;
{
if (!stat_task->ct)
return;
- client_close(stat_task->ct);
task_reap(&stat_task->ct->task);
+ client_close(stat_task->ct);
stat_task->ct = NULL;
clear_and_dump_items();
stat_task->length_seconds = 0;
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;
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())
}
/* 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) {
+ if (task_status(st->ct->task) >= 0) {
task_notify(st->ct->task, E_AUDIOD_OFF);
goto out;
}
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)
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);
.context = sig_task,
}, &sched);
- register_task(&sched, &stat_task->task);
sched.default_timeout.tv_sec = 2;
sched.default_timeout.tv_usec = 999 * 1000;
ret = schedule(&sched);