From c8d8d2f8e692037cb33e7c45291cc4c24dc5bd26 Mon Sep 17 00:00:00 2001 From: Erik Boasson Date: Thu, 26 Mar 2020 20:21:56 +0100 Subject: [PATCH] Stop threads doing handshake processing earlier In particular before the state they depend on gets torn down. Signed-off-by: Erik Boasson --- .../ddsi/include/dds/ddsi/ddsi_handshake.h | 7 ++++ .../ddsi/include/dds/ddsi/ddsi_security_omg.h | 6 ++-- src/core/ddsi/src/ddsi_handshake.c | 32 +++++++++---------- src/core/ddsi/src/ddsi_security_omg.c | 5 +++ src/core/ddsi/src/q_init.c | 14 +++++--- 5 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/core/ddsi/include/dds/ddsi/ddsi_handshake.h b/src/core/ddsi/include/dds/ddsi/ddsi_handshake.h index 307eb72..a76f009 100644 --- a/src/core/ddsi/include/dds/ddsi/ddsi_handshake.h +++ b/src/core/ddsi/include/dds/ddsi/ddsi_handshake.h @@ -168,6 +168,13 @@ struct ddsi_handshake * ddsi_handshake_find(struct participant *pp, struct proxy */ void ddsi_handshake_admin_init(struct ddsi_domaingv *gv); +/** +* @brief Stop handshake background processing. +* +* @param[in] gv The global parameters +*/ +void ddsi_handshake_admin_stop(struct ddsi_domaingv *gv); + /** * @brief Deinitialze the handshake administration. * diff --git a/src/core/ddsi/include/dds/ddsi/ddsi_security_omg.h b/src/core/ddsi/include/dds/ddsi/ddsi_security_omg.h index dc63d5a..32946ba 100644 --- a/src/core/ddsi/include/dds/ddsi/ddsi_security_omg.h +++ b/src/core/ddsi/include/dds/ddsi/ddsi_security_omg.h @@ -1102,6 +1102,8 @@ dds_return_t q_omg_security_load( struct dds_security_context *security_context, void q_omg_security_init( struct ddsi_domaingv *gv ); +void q_omg_security_stop (struct ddsi_domaingv *gv); + void q_omg_security_deinit( struct ddsi_domaingv *gv ); bool q_omg_is_security_loaded( struct dds_security_context *sc ); @@ -1395,10 +1397,6 @@ inline dds_return_t q_omg_security_load( UNUSED_ARG( struct dds_security_context return DDS_RETCODE_ERROR; } -inline void q_omg_security_init( UNUSED_ARG( struct dds_security_context *sc) ) {} - -inline void q_omg_security_deinit( UNUSED_ARG( struct dds_security_context *sc) ) {} - inline bool q_omg_is_security_loaded( UNUSED_ARG( struct dds_security_context *sc )) { return false; } inline void q_omg_security_deregister_remote_reader_match(UNUSED_ARG(const struct proxy_reader *prd), UNUSED_ARG(const struct writer *wr), UNUSED_ARG(struct wr_prd_match *match)) diff --git a/src/core/ddsi/src/ddsi_handshake.c b/src/core/ddsi/src/ddsi_handshake.c index 847c796..b23d214 100644 --- a/src/core/ddsi/src/ddsi_handshake.c +++ b/src/core/ddsi/src/ddsi_handshake.c @@ -1120,21 +1120,6 @@ static void release_handshake(void *arg) ddsi_handshake_release((struct ddsi_handshake *)arg); } -static void ddsi_handshake_admin_delete(struct ddsi_hsadmin *hsadmin) -{ - if (hsadmin) - { - ddsrt_mutex_destroy(&hsadmin->lock); - ddsrt_avl_free(&handshake_treedef, &hsadmin->handshakes, release_handshake); - if (hsadmin->fsm_control) - { - dds_security_fsm_control_stop(hsadmin->fsm_control); - dds_security_fsm_control_free(hsadmin->fsm_control); - } - ddsrt_free(hsadmin); - } -} - static struct ddsi_handshake * ddsi_handshake_find_locked( struct ddsi_hsadmin *hsadmin, struct participant *pp, @@ -1213,10 +1198,23 @@ void ddsi_handshake_admin_init(struct ddsi_domaingv *gv) void ddsi_handshake_admin_deinit(struct ddsi_domaingv *gv) { - assert(gv); - ddsi_handshake_admin_delete(gv->hsadmin); + struct ddsi_hsadmin *hsadmin = gv->hsadmin; + if (hsadmin) + { + ddsrt_mutex_destroy(&hsadmin->lock); + ddsrt_avl_free(&handshake_treedef, &hsadmin->handshakes, release_handshake); + if (hsadmin->fsm_control) + dds_security_fsm_control_free(hsadmin->fsm_control); + ddsrt_free(hsadmin); + } } +void ddsi_handshake_admin_stop(struct ddsi_domaingv *gv) +{ + struct ddsi_hsadmin *hsadmin = gv->hsadmin; + if (hsadmin && hsadmin->fsm_control) + dds_security_fsm_control_stop(hsadmin->fsm_control); +} #else diff --git a/src/core/ddsi/src/ddsi_security_omg.c b/src/core/ddsi/src/ddsi_security_omg.c index 70b2b93..46a0d0b 100644 --- a/src/core/ddsi/src/ddsi_security_omg.c +++ b/src/core/ddsi/src/ddsi_security_omg.c @@ -623,6 +623,11 @@ static void release_plugins (dds_security_context *sc) sc->crypto_context = NULL; } +void q_omg_security_stop (struct ddsi_domaingv *gv) +{ + ddsi_handshake_admin_stop(gv); +} + void q_omg_security_deinit (struct ddsi_domaingv *gv) { dds_security_context *sc = gv->security_context; diff --git a/src/core/ddsi/src/q_init.c b/src/core/ddsi/src/q_init.c index 6e756e0..859be30 100644 --- a/src/core/ddsi/src/q_init.c +++ b/src/core/ddsi/src/q_init.c @@ -1518,12 +1518,12 @@ err_unicast_sockets: ddsrt_hh_free (gv->sertopics); ddsrt_mutex_destroy (&gv->sertopics_lock); #ifdef DDSI_INCLUDE_SECURITY + q_omg_security_stop (gv); // should be a no-op as it starts lazily + q_omg_security_deinit (gv); ddsi_xqos_fini (&gv->builtin_stateless_xqos_wr); ddsi_xqos_fini (&gv->builtin_stateless_xqos_rd); ddsi_xqos_fini (&gv->builtin_volatile_xqos_wr); ddsi_xqos_fini (&gv->builtin_volatile_xqos_rd); - - q_omg_security_deinit (gv); #endif ddsi_xqos_fini (&gv->builtin_endpoint_xqos_wr); ddsi_xqos_fini (&gv->builtin_endpoint_xqos_rd); @@ -1749,6 +1749,12 @@ void rtps_stop (struct ddsi_domaingv *gv) thread_state_asleep (ts1); } + /* Stop background (handshake) processing in security implementation, + do this only once we know no new events will be coming in. */ +#if DDSI_INCLUDE_SECURITY + q_omg_security_stop (gv); +#endif + /* Wait until all participants are really gone => by then we can be certain that no new GC requests will be added, short of what we do here */ @@ -1854,7 +1860,6 @@ void rtps_fini (struct ddsi_domaingv *gv) } ddsi_tkmap_free (gv->m_tkmap); - entity_index_free (gv->entity_index); gv->entity_index = NULL; deleted_participants_admin_free (gv->deleted_participants); @@ -1873,12 +1878,11 @@ void rtps_fini (struct ddsi_domaingv *gv) ddsrt_mutex_destroy (&gv->sertopics_lock); #ifdef DDSI_INCLUDE_SECURITY + q_omg_security_deinit (gv); ddsi_xqos_fini (&gv->builtin_stateless_xqos_wr); ddsi_xqos_fini (&gv->builtin_stateless_xqos_rd); ddsi_xqos_fini (&gv->builtin_volatile_xqos_wr); ddsi_xqos_fini (&gv->builtin_volatile_xqos_rd); - - q_omg_security_deinit (gv); #endif ddsi_xqos_fini (&gv->builtin_endpoint_xqos_wr); ddsi_xqos_fini (&gv->builtin_endpoint_xqos_rd);