Stop threads doing handshake processing earlier
In particular before the state they depend on gets torn down. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									fa0c6777d4
								
							
						
					
					
						commit
						c8d8d2f8e6
					
				
					 5 changed files with 38 additions and 26 deletions
				
			
		| 
						 | 
				
			
			@ -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.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue