From ef65101ad7924679d3a30e2b441686be7ded0a8b Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Fri, 9 Nov 2018 15:29:40 +0100 Subject: [PATCH] pushing released serdata:s onto a freelist was dropped by accident in the rewriting of them Signed-off-by: Erik Boasson --- src/core/ddsi/src/ddsi_serdata_default.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/core/ddsi/src/ddsi_serdata_default.c b/src/core/ddsi/src/ddsi_serdata_default.c index 52552e7..1373474 100644 --- a/src/core/ddsi/src/ddsi_serdata_default.c +++ b/src/core/ddsi/src/ddsi_serdata_default.c @@ -53,9 +53,9 @@ static void serdata_free_wrap (void *elem) { #ifndef NDEBUG struct ddsi_serdata_default *d = elem; - assert(os_atomic_ld32(&d->c.refc) == 1); + assert(os_atomic_ld32(&d->c.refc) == 0); #endif - ddsi_serdata_unref(elem); + dds_free(elem); } void ddsi_serdatapool_free (struct serdatapool * pool) @@ -200,7 +200,9 @@ static bool serdata_default_eqkey_nokey (const struct ddsi_serdata *acmn, const static void serdata_default_free(struct ddsi_serdata *dcmn) { struct ddsi_serdata_default *d = (struct ddsi_serdata_default *)dcmn; - dds_free (d); + assert(os_atomic_ld32(&d->c.refc) == 0); + if (!nn_freelist_push (&gv.serpool->freelist, d)) + dds_free (d); } static void serdata_default_init(struct ddsi_serdata_default *d, const struct ddsi_sertopic_default *tp, enum ddsi_serdata_kind kind) @@ -231,6 +233,8 @@ static struct ddsi_serdata_default *serdata_default_new(const struct ddsi_sertop struct ddsi_serdata_default *d; if ((d = nn_freelist_pop (&gv.serpool->freelist)) == NULL) d = serdata_default_allocnew(gv.serpool); + else + os_atomic_st32(&d->c.refc, 1); serdata_default_init(d, tp, kind); return d; }