This was quite buggy all the time, but wasn't noticed due to the typo bug
which was fixed in
1b46ae4193cddb7d589b0f2f7d8158b84f7e9f6d.
Now, the status task no longer has an event handler as both its pre_select
and its post_select functions always succeed and the status task is supposed
to never terminate. Unlike the client task whose event handler now does all
the cleanup if the connection to para_server breaks down for whatever reason.
static void client_task_event_handler(__a_unused struct task *t)
{
struct private_client_data *pcd = t->private_data;
static void client_task_event_handler(__a_unused struct task *t)
{
struct private_client_data *pcd = t->private_data;
+ int i;
+ struct timeval delay = {1, 0};
+
if (t->ret == -E_HANDSHAKE_COMPLETE)
return;
unregister_task(t);
if (t->ret == -E_HANDSHAKE_COMPLETE)
return;
unregister_task(t);
- pcd->eof = 1;
-}
-
-static void status_event_handler(__a_unused struct task *t)
-{
- struct timeval delay = {1, 0};
- int i;
- struct status_task *st = t->private_data;
-
- PARA_ERROR_LOG("%s\n", PARA_STRERROR(-t->ret));
+ if (t->ret != -E_SERVER_EOF)
+ stat_task->clock_diff_count = conf.clock_diff_count_arg;
/* avoid busy loop if server is down */
/* avoid busy loop if server is down */
- tv_add(now, &delay, &st->restart_barrier);
+ tv_add(now, &delay, &stat_task->restart_barrier);
- afi[i].restart_barrier = st->restart_barrier;
+ afi[i].restart_barrier = stat_task->restart_barrier;
}
static void status_pre_select(struct sched *s, struct task *t)
{
struct status_task *st = t->private_data;
}
static void status_pre_select(struct sched *s, struct task *t)
{
struct status_task *st = t->private_data;
- t->ret = 1;
- if (st->pcd && (audiod_status == AUDIOD_OFF || st->pcd->eof))
- close_stat_pipe();
+ t->ret = 1; /* always successful */
if (st->pcd || audiod_status == AUDIOD_OFF)
return;
if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL)
if (st->pcd || audiod_status == AUDIOD_OFF)
return;
if (!st->clock_diff_count && tv_diff(now, &st->restart_barrier, NULL)
if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
return;
PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count);
if (tv_diff(now, &st->clock_diff_barrier, NULL) < 0)
return;
PARA_INFO_LOG("clock diff count: %d\n", st->clock_diff_count);
- t->ret = client_open(argc, argv, &st->pcd);
+ ret = client_open(argc, argv, &st->pcd);
} else {
char *argv[] = {"audiod", "stat", NULL};
int argc = 2;
} else {
char *argv[] = {"audiod", "stat", NULL};
int argc = 2;
- t->ret = client_open(argc, argv, &st->pcd);
+ ret = client_open(argc, argv, &st->pcd);
return;
st->pcd->task.event_handler = client_task_event_handler;
s->timeout.tv_sec = 0;
return;
st->pcd->task.event_handler = client_task_event_handler;
s->timeout.tv_sec = 0;
t->ret = 1;
if (!st->pcd || st->pcd->status != CL_RECEIVING)
return;
t->ret = 1;
if (!st->pcd || st->pcd->status != CL_RECEIVING)
return;
+ if (st->pcd && audiod_status == AUDIOD_OFF) {
+ unregister_task(&st->pcd->task);
+ close_stat_pipe();
+ st->clock_diff_count = conf.clock_diff_count_arg;
+ return;
+ }
bytes_left = for_each_line(st->pcd->buf, st->pcd->loaded,
&check_stat_line);
if (st->pcd->loaded != bytes_left) {
bytes_left = for_each_line(st->pcd->buf, st->pcd->loaded,
&check_stat_line);
if (st->pcd->loaded != bytes_left) {
memset(st, 0, sizeof(struct status_task));
st->task.pre_select = status_pre_select;
st->task.post_select = status_post_select;
memset(st, 0, sizeof(struct status_task));
st->task.pre_select = status_pre_select;
st->task.post_select = status_post_select;
- st->task.event_handler = status_event_handler;
st->task.private_data = st;
st->sa_time_diff_sign = 1;
st->clock_diff_count = conf.clock_diff_count_arg;
st->task.private_data = st;
st->sa_time_diff_sign = 1;
st->clock_diff_count = conf.clock_diff_count_arg;