X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=vss.c;h=e1a3c3742a76b66c614e6aaf65f04c7a31277309;hb=027e2ddb3ca6e8b29ec826f529cd66bc4447f32f;hp=37a80759e17a09bb2bd21ab8c6678985e5e0da25;hpb=597d812fe8e82c888cf713420aa17d751da40dac;p=paraslash.git diff --git a/vss.c b/vss.c index 37a80759..e1a3c374 100644 --- a/vss.c +++ b/vss.c @@ -458,6 +458,24 @@ static void compute_slice_timeout(struct timeval *timeout) } } +static void set_eof_barrier(struct vss_task *vsst) +{ + struct fec_client *fc; + struct timeval timeout = mmd->afd.afhi.eof_tv, + *chunk_tv = vss_chunk_time(); + + if (!chunk_tv) + goto out; + list_for_each_entry(fc, &fec_client_list, node) { + struct timeval group_duration; + tv_scale(fc->group.num_chunks, chunk_tv, &group_duration); + if (tv_diff(&timeout, &group_duration, NULL) < 0) + timeout = group_duration; + } +out: + tv_add(now, &timeout, &vsst->eof_barrier); +} + /** * Check if vss status flag \a P (playing) is set. * @@ -574,7 +592,7 @@ static void vss_eof(struct vss_task *vsst) return; if (mmd->new_vss_status_flags & VSS_NOMORE) mmd->new_vss_status_flags = VSS_NEXT; - tv_add(&mmd->afd.afhi.eof_tv, now, &vsst->eof_barrier); + set_eof_barrier(vsst); para_munmap(vsst->map, mmd->size); vsst->map = NULL; mmd->chunks_sent = 0; @@ -658,11 +676,11 @@ static void vss_pre_select(struct sched *s, struct task *t) vss_eof(vsst); else if (vss_paused()) { if (mmd->chunks_sent) - tv_add(&mmd->afd.afhi.eof_tv, now, &vsst->eof_barrier); + set_eof_barrier(vsst); mmd->chunks_sent = 0; } else if (vss_repos()) { tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier); - tv_add(&mmd->afd.afhi.eof_tv, now, &vsst->eof_barrier); + set_eof_barrier(vsst); mmd->chunks_sent = 0; mmd->current_chunk = mmd->repos_request; mmd->new_vss_status_flags &= ~VSS_REPOS;