]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 'master' into next
authorAndre Noll <maan@systemlinux.org>
Mon, 14 Sep 2009 08:09:38 +0000 (10:09 +0200)
committerAndre Noll <maan@systemlinux.org>
Mon, 14 Sep 2009 08:09:38 +0000 (10:09 +0200)
fd.c
signal.c
vss.c

diff --git a/fd.c b/fd.c
index 3dc490cde1056db92e94108cb7ad3c97131d32d5..0fb796025945b2c33e59c6c8508d370626ac0c02 100644 (file)
--- a/fd.c
+++ b/fd.c
@@ -421,7 +421,7 @@ out:
  * \param start The start address of the memory mapping.
  * \param length The size of the mapping.
  *
- * \return Positive on success, \p -E_MUNMAP on errors.
+ * \return Standard.
  *
  * \sa munmap(2), mmap_full_file().
  */
index da395157c29ae8aff0459a2731e10ae7a13e90e6..5d3e2c9d915c5bbc2c92b5197dcee5c4e06b1ba5 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -149,7 +149,7 @@ void para_install_sighandler(int sig)
 }
 
 /**
- * Return the number of next pending signal.
+ * Return the number of the next pending signal.
  *
  * This should be called if the fd for the signal pipe is ready for reading.
  *
diff --git a/vss.c b/vss.c
index 269c0e0c4ac2d8ff1ed4c329db168fa26f869671..85e7da85731a872b27bb91489a22f7796e7861be 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -234,6 +234,17 @@ static int num_slices(long unsigned bytes, struct fec_client *fc, uint8_t *resul
        return 1;
 }
 
+static void set_slice_duration(struct fec_client *fc, struct fec_group *g)
+{
+       struct timeval group_duration, *chunk_tv = vss_chunk_time();
+
+       tv_scale(g->num_chunks, chunk_tv, &group_duration);
+       tv_divide(fc->fcp->slices_per_group + fc->num_extra_slices,
+               &group_duration, &g->slice_duration);
+       PARA_DEBUG_LOG("durations (group/chunk/slice): %lu/%lu/%lu\n",
+               tv2ms(&group_duration), tv2ms(chunk_tv), tv2ms(&g->slice_duration));
+}
+
 static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
 {
        int ret, i, k, data_slices;
@@ -277,6 +288,8 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
                g->first_chunk = mmd->current_chunk;
                g->num = 0;
        } else {
+               /* use duration of the previous group for the timing of this group */
+               set_slice_duration(fc, g);
                g->first_chunk += g->num_chunks;
                g->num++;
        }
@@ -303,6 +316,8 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
        g->num_chunks = i - g->first_chunk;
        assert(g->num_chunks);
        fc->current_slice_num = 0;
+       if (g->num == 0)
+               set_slice_duration(fc, g);
 
        /* setup header slices */
        buf = vsst->header_buf;
@@ -334,21 +349,15 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
                for (; i < k; i++)
                        fc->src_data[i] = (const unsigned char *)buf;
        }
-
-       /* setup group timing */
-       tv_scale(g->first_chunk - fc->first_stream_chunk, chunk_tv, &tmp);
-       tv_add(&fc->stream_start, &tmp, &g->start);
-       tv_scale(g->num_chunks, chunk_tv, &tmp); /* group duration */
-       tv_divide(fc->fcp->slices_per_group + fc->num_extra_slices,
-               &tmp, &g->slice_duration);
-
-       PARA_DEBUG_LOG("FEC group %d: %d chunks (%d - %d), %d header slices, %d data slices\n",
+       PARA_DEBUG_LOG("FEC group %d: %d chunks (%d - %d), "
+               "%d header slices, %d data slices\n",
                g->num, g->num_chunks, g->first_chunk,
                g->first_chunk + g->num_chunks - 1,
                g->num_header_slices, data_slices
        );
-       PARA_DEBUG_LOG("durations (group/chunk/slice): %lu/%lu/%lu\n",
-               tv2ms(&tmp), tv2ms(chunk_tv), tv2ms(&g->slice_duration));
+       /* set group start */
+       tv_scale(g->first_chunk - fc->first_stream_chunk, chunk_tv, &tmp);
+       tv_add(&fc->stream_start, &tmp, &g->start);
        return 1;
 }
 
@@ -821,7 +830,7 @@ err:
  */
 static void vss_send(struct vss_task *vsst)
 {
-       int i, sent_something = 0;
+       int i, fec_active = 0;
        struct timeval due;
        struct fec_client *fc, *tmp_fc;
 
@@ -835,8 +844,10 @@ static void vss_send(struct vss_task *vsst)
        list_for_each_entry_safe(fc, tmp_fc, &fec_client_list, node) {
                if (fc->error < 0)
                        continue;
-               if (!next_slice_is_due(fc, NULL))
+               if (!next_slice_is_due(fc, NULL)) {
+                       fec_active = 1;
                        continue;
+               }
                if (compute_next_fec_slice(fc, vsst) <= 0)
                        continue;
                PARA_DEBUG_LOG("sending %d:%d (%u bytes)\n", fc->group.num,
@@ -845,10 +856,10 @@ static void vss_send(struct vss_task *vsst)
                        fc->fcp->max_slice_bytes,
                        fc->fcp->private_data);
                fc->current_slice_num++;
-               sent_something = 1;
+               fec_active = 1;
        }
        if (mmd->current_chunk >= mmd->afd.afhi.chunks_total) { /* eof */
-               if (!sent_something)
+               if (!fec_active)
                        mmd->new_vss_status_flags |= VSS_NEXT;
                return;
        }