audiod.c: Fix stat task restarting.
authorAndre Noll <maan@systemlinux.org>
Mon, 31 Mar 2008 11:15:37 +0000 (13:15 +0200)
committerAndre Noll <maan@systemlinux.org>
Mon, 31 Mar 2008 11:15:37 +0000 (13:15 +0200)
audiod.c

index bde2b1e1299a51548b727c13c2d32df760067fda..e33f7383c83c8b088c5d17ee01c41ea83088f262 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -976,34 +976,18 @@ static void set_stat_task_restart_barrier(void)
        tv_add(now, &delay, &stat_task->restart_barrier);
 }
 
        tv_add(now, &delay, &stat_task->restart_barrier);
 }
 
-#if 0
-static void client_task_event_handler(__a_unused struct task *t)
-{
-       int i;
-
-       if (t->ret == -E_HANDSHAKE_COMPLETE)
-               return;
-       unregister_task(t);
-       close_stat_pipe();
-       if (t->ret != -E_SERVER_EOF)
-               stat_task->clock_diff_count = conf.clock_diff_count_arg;
-       set_stat_task_restart_barrier();
-       FOR_EACH_AUDIO_FORMAT(i)
-               afi[i].restart_barrier = stat_task->restart_barrier;
-}
-#endif
-
+/* restart the client task if necessary */
 static void status_pre_select(struct sched *s, struct task *t)
 {
        struct status_task *st = container_of(t, struct status_task, task);
        int ret;
 
 static void status_pre_select(struct sched *s, struct task *t)
 {
        struct status_task *st = container_of(t, struct status_task, task);
        int ret;
 
-       if (st->ct || audiod_status == AUDIOD_OFF)
+       if (st->ct || audiod_status == AUDIOD_OFF) /* no need to restart */
                return;
        if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL)
                        < 0)
                return;
                return;
        if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL)
                        < 0)
                return;
-       if (st->clock_diff_count) {
+       if (st->clock_diff_count) { /* get status only one time */
                char *argv[] = {"audiod", "stat", "1", NULL};
                int argc = 3;
                if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
                char *argv[] = {"audiod", "stat", "1", NULL};
                int argc = 3;
                if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
@@ -1030,10 +1014,12 @@ static void status_post_select(__a_unused struct sched *s, struct task *t)
 
        if (!st->ct || st->ct->status != CL_RECEIVING)
                return;
 
        if (!st->ct || st->ct->status != CL_RECEIVING)
                return;
-       if (st->ct && audiod_status == AUDIOD_OFF) {
-               unregister_task(&st->ct->task);
+       if (audiod_status == AUDIOD_OFF || st->ct->task.error < 0) {
+               if (st->ct->task.error >= 0)
+                       unregister_task(&st->ct->task);
+               if (audiod_status == AUDIOD_OFF)
+                       st->clock_diff_count = conf.clock_diff_count_arg;
                close_stat_pipe();
                close_stat_pipe();
-               st->clock_diff_count = conf.clock_diff_count_arg;
                return;
        }
        bytes_left = for_each_line(st->ct->buf, st->ct->loaded,
                return;
        }
        bytes_left = for_each_line(st->ct->buf, st->ct->loaded,