Don't perform discovery for subscriptions to built-in topics
These topics are generated internally and never sent over the wire. Performing full discovery for these is therefore a significant waste of effort. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									4a4f092f7b
								
							
						
					
					
						commit
						11a1b9d6f9
					
				
					 6 changed files with 23 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -34,7 +34,8 @@ struct ddsi_tkmap_instance;
 | 
			
		|||
 | 
			
		||||
void dds__builtin_init (void);
 | 
			
		||||
void dds__builtin_fini (void);
 | 
			
		||||
bool dds__builtin_is_visible (nn_entityid_t entityid, bool onlylocal, nn_vendorid_t vendorid);
 | 
			
		||||
bool dds__builtin_is_builtintopic (const struct ddsi_sertopic *tp);
 | 
			
		||||
bool dds__builtin_is_visible (const nn_guid_t *guid, nn_vendorid_t vendorid);
 | 
			
		||||
struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct nn_guid *guid);
 | 
			
		||||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -172,9 +172,16 @@ dds_entity_t dds__get_builtin_subscriber (dds_entity_t e)
 | 
			
		|||
  return sub;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dds__builtin_is_visible (nn_entityid_t entityid, bool onlylocal, nn_vendorid_t vendorid)
 | 
			
		||||
bool dds__builtin_is_builtintopic (const struct ddsi_sertopic *tp)
 | 
			
		||||
{
 | 
			
		||||
  return !(onlylocal || is_builtin_endpoint (entityid, vendorid));
 | 
			
		||||
  return tp->ops == &ddsi_sertopic_ops_builtintopic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dds__builtin_is_visible (const nn_guid_t *guid, nn_vendorid_t vendorid)
 | 
			
		||||
{
 | 
			
		||||
  if (is_builtin_endpoint (guid->entityid, vendorid))
 | 
			
		||||
    return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct nn_guid *guid)
 | 
			
		||||
| 
						 | 
				
			
			@ -221,7 +228,7 @@ struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn
 | 
			
		|||
 | 
			
		||||
void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, bool alive)
 | 
			
		||||
{
 | 
			
		||||
  if (ddsi_plugin.builtintopic_is_visible (e->guid.entityid, e->onlylocal, get_entity_vendorid (e)))
 | 
			
		||||
  if (dds__builtin_is_visible (&e->guid, get_entity_vendorid (e)))
 | 
			
		||||
  {
 | 
			
		||||
    /* initialize to avoid gcc warning ultimately caused by C's horrible type system */
 | 
			
		||||
    struct local_orphan_writer *bwr = NULL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -268,6 +268,7 @@ void ddsi_plugin_init (void)
 | 
			
		|||
  ddsi_plugin.init_fn = dds__init_plugin;
 | 
			
		||||
  ddsi_plugin.fini_fn = dds__fini_plugin;
 | 
			
		||||
 | 
			
		||||
  ddsi_plugin.builtintopic_is_builtintopic = dds__builtin_is_builtintopic;
 | 
			
		||||
  ddsi_plugin.builtintopic_is_visible = dds__builtin_is_visible;
 | 
			
		||||
  ddsi_plugin.builtintopic_get_tkmap_entry = dds__builtin_get_tkmap_entry;
 | 
			
		||||
  ddsi_plugin.builtintopic_write = dds__builtin_write;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,7 +62,7 @@ static void bwhc_sample_iter_init (const struct whc *whc_generic, struct whc_sam
 | 
			
		|||
static bool is_visible (const struct entity_common *e)
 | 
			
		||||
{
 | 
			
		||||
  const nn_vendorid_t vendorid = get_entity_vendorid (e);
 | 
			
		||||
  return ddsi_plugin.builtintopic_is_visible (e->guid.entityid, e->onlylocal, vendorid);
 | 
			
		||||
  return ddsi_plugin.builtintopic_is_visible (&e->guid, vendorid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool bwhc_sample_iter_borrow_next (struct whc_sample_iter *opaque_it, struct whc_borrowed_sample *sample)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -397,7 +397,8 @@ struct ddsi_plugin
 | 
			
		|||
  int (*init_fn) (void);
 | 
			
		||||
  void (*fini_fn) (void);
 | 
			
		||||
 | 
			
		||||
  bool (*builtintopic_is_visible) (nn_entityid_t entityid, bool onlylocal, nn_vendorid_t vendorid);
 | 
			
		||||
  bool (*builtintopic_is_builtintopic) (const struct ddsi_sertopic *topic);
 | 
			
		||||
  bool (*builtintopic_is_visible) (const nn_guid_t *guid, nn_vendorid_t vendorid);
 | 
			
		||||
  struct ddsi_tkmap_instance * (*builtintopic_get_tkmap_entry) (const struct nn_guid *guid);
 | 
			
		||||
  void (*builtintopic_write) (const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,7 +170,7 @@ static void entity_common_init (struct entity_common *e, const struct nn_guid *g
 | 
			
		|||
  e->name = ddsrt_strdup (name ? name : "");
 | 
			
		||||
  e->onlylocal = onlylocal;
 | 
			
		||||
  ddsrt_mutex_init (&e->lock);
 | 
			
		||||
  if (ddsi_plugin.builtintopic_is_visible (guid->entityid, onlylocal, vendorid))
 | 
			
		||||
  if (ddsi_plugin.builtintopic_is_visible (guid, vendorid))
 | 
			
		||||
  {
 | 
			
		||||
    e->tk = ddsi_plugin.builtintopic_get_tkmap_entry (guid);
 | 
			
		||||
    e->iid = e->tk->m_iid;
 | 
			
		||||
| 
						 | 
				
			
			@ -2428,9 +2428,9 @@ static void new_reader_writer_common (const struct nn_guid *guid, const struct d
 | 
			
		|||
          topic ? topic->type_name : "(null)");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void endpoint_common_init (struct entity_common *e, struct endpoint_common *c, enum entity_kind kind, const struct nn_guid *guid, const struct nn_guid *group_guid, struct participant *pp)
 | 
			
		||||
static void endpoint_common_init (struct entity_common *e, struct endpoint_common *c, enum entity_kind kind, const struct nn_guid *guid, const struct nn_guid *group_guid, struct participant *pp, bool onlylocal)
 | 
			
		||||
{
 | 
			
		||||
  entity_common_init (e, guid, NULL, kind, now (), NN_VENDORID_ECLIPSE, pp->e.onlylocal);
 | 
			
		||||
  entity_common_init (e, guid, NULL, kind, now (), NN_VENDORID_ECLIPSE, pp->e.onlylocal || onlylocal);
 | 
			
		||||
  c->pp = ref_participant (pp, &e->guid);
 | 
			
		||||
  if (group_guid)
 | 
			
		||||
    c->group_guid = *group_guid;
 | 
			
		||||
| 
						 | 
				
			
			@ -2834,7 +2834,8 @@ static dds_return_t new_writer_guid (struct writer **wr_out, const struct nn_gui
 | 
			
		|||
   delete_participant won't interfere with our ability to address
 | 
			
		||||
   the participant */
 | 
			
		||||
 | 
			
		||||
  endpoint_common_init (&wr->e, &wr->c, EK_WRITER, guid, group_guid, pp);
 | 
			
		||||
  const bool onlylocal = topic && ddsi_plugin.builtintopic_is_builtintopic (topic);
 | 
			
		||||
  endpoint_common_init (&wr->e, &wr->c, EK_WRITER, guid, group_guid, pp, onlylocal);
 | 
			
		||||
  new_writer_guid_common_init(wr, topic, xqos, whc, status_cb, status_entity);
 | 
			
		||||
 | 
			
		||||
  /* guid_hash needed for protocol handling, so add it before we send
 | 
			
		||||
| 
						 | 
				
			
			@ -3217,7 +3218,8 @@ static dds_return_t new_reader_guid
 | 
			
		|||
  if (rd_out)
 | 
			
		||||
    *rd_out = rd;
 | 
			
		||||
 | 
			
		||||
  endpoint_common_init (&rd->e, &rd->c, EK_READER, guid, group_guid, pp);
 | 
			
		||||
  const bool onlylocal = topic && ddsi_plugin.builtintopic_is_builtintopic (topic);
 | 
			
		||||
  endpoint_common_init (&rd->e, &rd->c, EK_READER, guid, group_guid, pp, onlylocal);
 | 
			
		||||
 | 
			
		||||
  /* Copy QoS, merging in defaults */
 | 
			
		||||
  rd->xqos = ddsrt_malloc (sizeof (*rd->xqos));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue