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:
Erik Boasson 2019-06-04 10:51:17 +02:00 committed by eboasson
parent 4a4f092f7b
commit 11a1b9d6f9
6 changed files with 23 additions and 11 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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)