From 259e4676dc5d40294d4d717c5ada43ad9e5ff07a Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Sun, 28 Oct 2018 13:40:41 +0800 Subject: [PATCH] fix sequencing of internal liveliness monitoring and rtps init/term liveliness monitoring requires rtps stack initialised if initially deaf, so starting the monitoring thread must happen after rtps_init Signed-off-by: Erik Boasson --- src/core/ddsc/src/dds_init.c | 25 +++++++++++++-------- src/core/ddsi/include/ddsi/q_servicelease.h | 1 + src/core/ddsi/src/ddsi_serdata_default.c | 2 +- src/core/ddsi/src/q_servicelease.c | 6 ++++- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/core/ddsc/src/dds_init.c b/src/core/ddsc/src/dds_init.c index 7517006..f4d057d 100644 --- a/src/core/ddsc/src/dds_init.c +++ b/src/core/ddsc/src/dds_init.c @@ -131,11 +131,6 @@ dds_init(dds_domainid_t domain) ret = DDS_ERRNO(DDS_RETCODE_OUT_OF_RESOURCES, "Failed to create a servicelease."); goto fail_servicelease_new; } - if (nn_servicelease_start_renewing(gv.servicelease) < 0) - { - ret = DDS_ERRNO(DDS_RETCODE_ERROR, "Failed to start the servicelease."); - goto fail_servicelease_start; - } } if (rtps_init() < 0) @@ -143,6 +138,13 @@ dds_init(dds_domainid_t domain) ret = DDS_ERRNO(DDS_RETCODE_ERROR, "Failed to initialize RTPS."); goto fail_rtps_init; } + + if (gv.servicelease && nn_servicelease_start_renewing(gv.servicelease) < 0) + { + ret = DDS_ERRNO(DDS_RETCODE_ERROR, "Failed to start the servicelease."); + goto fail_servicelease_start; + } + upgrade_main_thread(); /* Set additional default participant properties */ @@ -175,11 +177,16 @@ skip: DDS_REPORT_FLUSH(false); return DDS_RETCODE_OK; -fail_rtps_init: fail_servicelease_start: if (gv.servicelease) + nn_servicelease_stop_renewing (gv.servicelease); + rtps_term (); +fail_rtps_init: + if (gv.servicelease) + { nn_servicelease_free (gv.servicelease); - gv.servicelease = NULL; + gv.servicelease = NULL; + } fail_servicelease_new: thread_states_fini(); fail_rtps_config: @@ -200,8 +207,6 @@ fail_handleserver: return ret; } - - extern void dds_fini (void) { os_mutex *init_mutex; @@ -213,6 +218,8 @@ extern void dds_fini (void) { dds__builtin_fini(); + if (gv.servicelease) + nn_servicelease_stop_renewing (gv.servicelease); rtps_term (); if (gv.servicelease) nn_servicelease_free (gv.servicelease); diff --git a/src/core/ddsi/include/ddsi/q_servicelease.h b/src/core/ddsi/include/ddsi/q_servicelease.h index c4e8be3..bc9c15d 100644 --- a/src/core/ddsi/include/ddsi/q_servicelease.h +++ b/src/core/ddsi/include/ddsi/q_servicelease.h @@ -20,6 +20,7 @@ struct nn_servicelease; struct nn_servicelease *nn_servicelease_new (void (*renew_cb) (void *arg), void *renew_arg); int nn_servicelease_start_renewing (struct nn_servicelease *sl); +void nn_servicelease_stop_renewing (struct nn_servicelease *sl); void nn_servicelease_free (struct nn_servicelease *sl); void nn_servicelease_statechange_barrier (struct nn_servicelease *sl); diff --git a/src/core/ddsi/src/ddsi_serdata_default.c b/src/core/ddsi/src/ddsi_serdata_default.c index a933626..4f333b7 100644 --- a/src/core/ddsi/src/ddsi_serdata_default.c +++ b/src/core/ddsi/src/ddsi_serdata_default.c @@ -478,7 +478,7 @@ static bool serdata_default_topicless_to_sample_cdr (const struct ddsi_sertopic static bool serdata_default_topicless_to_sample_cdr_nokey (const struct ddsi_sertopic *topic, const struct ddsi_serdata *serdata_common, void *sample, void **bufptr, void *buflim) { - (void)topic; (void)sample; (void)bufptr; (void)buflim; + (void)topic; (void)sample; (void)bufptr; (void)buflim; (void)serdata_common; assert (serdata_common->topic == NULL); assert (serdata_common->kind == SDK_KEY); return true; diff --git a/src/core/ddsi/src/q_servicelease.c b/src/core/ddsi/src/q_servicelease.c index 72eae90..3dac20e 100644 --- a/src/core/ddsi/src/q_servicelease.c +++ b/src/core/ddsi/src/q_servicelease.c @@ -230,7 +230,7 @@ void nn_servicelease_statechange_barrier (struct nn_servicelease *sl) os_mutexUnlock (&sl->lock); } -void nn_servicelease_free (struct nn_servicelease *sl) +void nn_servicelease_stop_renewing (struct nn_servicelease *sl) { if (sl->keepgoing != -1) { @@ -240,6 +240,10 @@ void nn_servicelease_free (struct nn_servicelease *sl) os_mutexUnlock (&sl->lock); join_thread (sl->ts); } +} + +void nn_servicelease_free (struct nn_servicelease *sl) +{ os_condDestroy (&sl->cond); os_mutexDestroy (&sl->lock); os_free (sl->av_ary);