From 774dae135b5e73fbd6c8e7cb1ce70f7a6977d48d Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Thu, 18 Jul 2019 19:16:43 +0200 Subject: [PATCH] Assertion rsample_is_singleton fails Caused by the changes in a652ecb78e145fa936b8fef2f58f27ab0411245a; the sample that matters is the first in what may now be a chain of samples, which requires some overlooked adjustments. Signed-off-by: Erik Boasson --- src/core/ddsi/include/dds/ddsi/q_radmin.h | 2 +- src/core/ddsi/src/q_radmin.c | 7 ++++--- src/core/ddsi/src/q_receive.c | 4 +++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/core/ddsi/include/dds/ddsi/q_radmin.h b/src/core/ddsi/include/dds/ddsi/q_radmin.h index f05c512..69e2010 100644 --- a/src/core/ddsi/include/dds/ddsi/q_radmin.h +++ b/src/core/ddsi/include/dds/ddsi/q_radmin.h @@ -217,7 +217,7 @@ int nn_defrag_nackmap (struct nn_defrag *defrag, seqno_t seq, uint32_t maxfragnu struct nn_reorder *nn_reorder_new (enum nn_reorder_mode mode, uint32_t max_samples); void nn_reorder_free (struct nn_reorder *r); -struct nn_rsample *nn_reorder_rsample_dup (struct nn_rmsg *rmsg, struct nn_rsample *rsampleiv); +struct nn_rsample *nn_reorder_rsample_dup_first (struct nn_rmsg *rmsg, struct nn_rsample *rsampleiv); struct nn_rdata *nn_rsample_fragchain (struct nn_rsample *rsample); nn_reorder_result_t nn_reorder_rsample (struct nn_rsample_chain *sc, struct nn_reorder *reorder, struct nn_rsample *rsampleiv, int *refcount_adjust, int delivery_queue_full_p); nn_reorder_result_t nn_reorder_gap (struct nn_rsample_chain *sc, struct nn_reorder *reorder, struct nn_rdata *rdata, seqno_t min, seqno_t maxp1, int *refcount_adjust); diff --git a/src/core/ddsi/src/q_radmin.c b/src/core/ddsi/src/q_radmin.c index 039e591..738e714 100644 --- a/src/core/ddsi/src/q_radmin.c +++ b/src/core/ddsi/src/q_radmin.c @@ -1726,7 +1726,7 @@ static int reorder_try_append_and_discard (struct nn_reorder *reorder, struct nn } } -struct nn_rsample *nn_reorder_rsample_dup (struct nn_rmsg *rmsg, struct nn_rsample *rsampleiv) +struct nn_rsample *nn_reorder_rsample_dup_first (struct nn_rmsg *rmsg, struct nn_rsample *rsampleiv) { /* Duplicates the rsampleiv without updating any reference counts: that is left to the caller, as they do not need to be updated if @@ -1738,7 +1738,6 @@ struct nn_rsample *nn_reorder_rsample_dup (struct nn_rmsg *rmsg, struct nn_rsamp rsampleiv. */ struct nn_rsample *rsampleiv_new; struct nn_rsample_chain_elem *sce; - assert (rsample_is_singleton (&rsampleiv->u.reorder)); #ifndef NDEBUG { struct nn_rdata *d = rsampleiv->u.reorder.sc.first->fragchain; @@ -1754,7 +1753,9 @@ struct nn_rsample *nn_reorder_rsample_dup (struct nn_rmsg *rmsg, struct nn_rsamp sce->fragchain = rsampleiv->u.reorder.sc.first->fragchain; sce->next = NULL; sce->sampleinfo = rsampleiv->u.reorder.sc.first->sampleinfo; - *rsampleiv_new = *rsampleiv; + rsampleiv_new->u.reorder.min = rsampleiv->u.reorder.min; + rsampleiv_new->u.reorder.maxp1 = rsampleiv_new->u.reorder.min + 1; + rsampleiv_new->u.reorder.n_samples = 1; rsampleiv_new->u.reorder.sc.first = rsampleiv_new->u.reorder.sc.last = sce; return rsampleiv_new; } diff --git a/src/core/ddsi/src/q_receive.c b/src/core/ddsi/src/q_receive.c index 4d97333..a7d4036 100644 --- a/src/core/ddsi/src/q_receive.c +++ b/src/core/ddsi/src/q_receive.c @@ -2201,8 +2201,10 @@ static void handle_regular (struct receiver_state *rst, nn_etime_t tnow, struct nn_reorder_result_t rres2; if (wn->in_sync == PRMSS_SYNC) continue; + /* only need to get a copy of the first sample, because that's the one + that triggered delivery */ if (!reuse_rsample_dup) - rsample_dup = nn_reorder_rsample_dup (rmsg, rsample); + rsample_dup = nn_reorder_rsample_dup_first (rmsg, rsample); rres2 = nn_reorder_rsample (&sc, wn->u.not_in_sync.reorder, rsample_dup, &refc_adjust, nn_dqueue_is_full (pwr->dqueue)); switch (rres2) {