diff --git a/src/core/ddsc/src/dds__builtin.h b/src/core/ddsc/src/dds__builtin.h index fd191f9..767396e 100644 --- a/src/core/ddsc/src/dds__builtin.h +++ b/src/core/ddsc/src/dds__builtin.h @@ -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); diff --git a/src/core/ddsc/src/dds_builtin.c b/src/core/ddsc/src/dds_builtin.c index ba9c31d..f7cc781 100644 --- a/src/core/ddsc/src/dds_builtin.c +++ b/src/core/ddsc/src/dds_builtin.c @@ -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; diff --git a/src/core/ddsc/src/dds_init.c b/src/core/ddsc/src/dds_init.c index ce068eb..9f70a1d 100644 --- a/src/core/ddsc/src/dds_init.c +++ b/src/core/ddsc/src/dds_init.c @@ -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; diff --git a/src/core/ddsc/src/dds_whc_builtintopic.c b/src/core/ddsc/src/dds_whc_builtintopic.c index 58ac495..76926ed 100644 --- a/src/core/ddsc/src/dds_whc_builtintopic.c +++ b/src/core/ddsc/src/dds_whc_builtintopic.c @@ -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) diff --git a/src/core/ddsi/include/dds/ddsi/q_config.h b/src/core/ddsi/include/dds/ddsi/q_config.h index 095717c..0e3e2de 100644 --- a/src/core/ddsi/include/dds/ddsi/q_config.h +++ b/src/core/ddsi/include/dds/ddsi/q_config.h @@ -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); diff --git a/src/core/ddsi/src/q_entity.c b/src/core/ddsi/src/q_entity.c index 14f03ef..5870a41 100644 --- a/src/core/ddsi/src/q_entity.c +++ b/src/core/ddsi/src/q_entity.c @@ -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));