X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=7b36ae31c95a14ca24d87d7f3f9c27d29de6fa5c;hp=37a80759e17a09bb2bd21ab8c6678985e5e0da25;hb=89e28a4361bd120dfe4202a16d85d03fb1139de8;hpb=22e8cf4e458dd1b2b3c1ed58f62582e0630a35cd diff --git a/vss.c b/vss.c index 37a80759..7b36ae31 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. * @@ -569,12 +587,11 @@ static struct timeval *vss_compute_timeout(struct vss_task *vsst) static void vss_eof(struct vss_task *vsst) { - mmd->stream_start = *now; if (!vsst->map) 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; @@ -653,16 +670,18 @@ static void vss_pre_select(struct sched *s, struct task *t) senders[i].shutdown_clients(); list_for_each_entry_safe(fc, tmp, &fec_client_list, node) fc->first_stream_chunk = -1; + mmd->stream_start.tv_sec = 0; + mmd->stream_start.tv_usec = 0; } if (vss_next()) 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;