/** the local listening socket */
int fd;
/** the associated task structure */
- struct task task;
+ struct task *task;
};
/** iterate over all supported audio formats */
static void signal_pre_select(struct sched *s, struct task *t)
{
- struct signal_task *st = container_of(t, struct signal_task, task);
+ struct signal_task *st = task_context(t);
para_fd_set(st->fd, &s->rfds, &s->max_fileno);
}
return 0;
}
-static void signal_setup_default(struct signal_task *st)
-{
- 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 = task_context(t);
para_fd_set(ct->fd, &s->rfds, &s->max_fileno);
}
static int command_post_select(struct sched *s, struct task *t)
{
int ret;
- struct command_task *ct = container_of(t, struct command_task, task);
+ struct command_task *ct = task_context(t);
static struct timeval last_status_dump;
struct timeval tmp, delay;
bool force = true;
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;
client_close(stat_task->ct);
+ task_reap(&stat_task->ct->task);
stat_task->ct = NULL;
clear_and_dump_items();
stat_task->length_seconds = 0;
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 (st->ct->task->error >= 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) {
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);
+ sig_task->task = task_register(&(struct task_info) {
+ .name = "signal",
+ .pre_select = signal_pre_select,
+ .post_select = signal_post_select,
+ .context = sig_task,
+ }, &sched);
+
register_task(&sched, &stat_task->task);
sched.default_timeout.tv_sec = 2;
sched.default_timeout.tv_usec = 999 * 1000;