From: Andre Noll Date: Mon, 9 Mar 2009 20:55:50 +0000 (+0100) Subject: vss: Improve EOF handling. X-Git-Tag: v0.3.4~44 X-Git-Url: http://git.tuebingen.mpg.de/?a=commitdiff_plain;h=95fe1cebd7a254296312e7c0e6fcdecd0613cfc5;p=paraslash.git vss: Improve EOF handling. Set the "next" flag only if no more writes to fec clients happen. --- diff --git a/vss.c b/vss.c index aa76ca2e..79c09ba7 100644 --- a/vss.c +++ b/vss.c @@ -781,7 +781,7 @@ err: */ static void vss_send(struct vss_task *vsst) { - int i; + int i, sent_something = 0; struct timeval due; struct fec_client *fc, *tmp_fc; @@ -792,8 +792,22 @@ static void vss_send(struct vss_task *vsst) if (chk_barrier("data send", &vsst->data_send_barrier, &due, 1) < 0) return; + list_for_each_entry_safe(fc, tmp_fc, &fec_client_list, node) { + if (!next_slice_is_due(fc, NULL)) + continue; + if (compute_next_fec_slice(fc, vsst) <= 0) + continue; + PARA_DEBUG_LOG("sending %d:%d (%u bytes)\n", fc->group.num, + fc->current_slice_num, fc->fcp->max_slice_bytes); + fc->fcp->send((char *)fc->enc_buf, + fc->fcp->max_slice_bytes, + fc->fcp->private_data); + fc->current_slice_num++; + sent_something = 1; + } if (mmd->current_chunk >= mmd->afd.afhi.chunks_total) { /* eof */ - mmd->new_vss_status_flags |= VSS_NEXT; + if (!sent_something) + mmd->new_vss_status_flags |= VSS_NEXT; return; } compute_chunk_time(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv, @@ -825,18 +839,6 @@ static void vss_send(struct vss_task *vsst) mmd->chunks_sent++; mmd->current_chunk++; } - list_for_each_entry_safe(fc, tmp_fc, &fec_client_list, node) { - if (!next_slice_is_due(fc, NULL)) - continue; - if (compute_next_fec_slice(fc, vsst) <= 0) - continue; - PARA_DEBUG_LOG("sending %d:%d (%u bytes)\n", fc->group.num, - fc->current_slice_num, fc->fcp->max_slice_bytes); - fc->fcp->send((char *)fc->enc_buf, - fc->fcp->max_slice_bytes, - fc->fcp->private_data); - fc->current_slice_num++; - } } static void vss_post_select(struct sched *s, struct task *t)