Merge remote-tracking branch 'upstream/master' into master-to-security
This commit is contained in:
		
						commit
						67c49235db
					
				
					 110 changed files with 2714 additions and 4540 deletions
				
			
		| 
						 | 
				
			
			@ -998,25 +998,29 @@ dds_create_topic(
 | 
			
		|||
  const dds_qos_t *qos,
 | 
			
		||||
  const dds_listener_t *listener);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define DDS_HAS_CREATE_TOPIC_GENERIC 1
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Creates a new topic with arbitrary type handling.
 | 
			
		||||
 * @brief Creates a new topic with provided type handling.
 | 
			
		||||
 *
 | 
			
		||||
 * The type name for the topic is taken from the provided "sertopic" object. Topic
 | 
			
		||||
 * matching is done on a combination of topic name and type name. Each successful
 | 
			
		||||
 * call to dds_create_topic creates a new topic entity sharing the same QoS
 | 
			
		||||
 * settings with all other topics of the same name.
 | 
			
		||||
 *
 | 
			
		||||
 * If sertopic is not yet known in the domain, it is added and its refcount
 | 
			
		||||
 * incremented; if an equivalent sertopic object is already known, then the known
 | 
			
		||||
 * one is used instead.
 | 
			
		||||
 * In case this function returns a valid handle, the ownership of the provided
 | 
			
		||||
 * sertopic is handed over to Cyclone. On return, the caller gets in the sertopic parameter a
 | 
			
		||||
 * pointer to the sertopic that is actually used by the topic. This can be the provided sertopic
 | 
			
		||||
 * (if this sertopic was not yet known in the domain), or a sertopic thas was
 | 
			
		||||
 * already known in the domain.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  participant  Participant on which to create the topic.
 | 
			
		||||
 * @param[in]  sertopic     Internal description of the topic type (includes name).
 | 
			
		||||
 * @param[in]  qos          QoS to set on the new topic (can be NULL).
 | 
			
		||||
 * @param[in]  listener     Any listener functions associated with the new topic (can be NULL).
 | 
			
		||||
 * @param[in]  sedp_plist   Topic description to be published as part of discovery (if NULL, not published).
 | 
			
		||||
 * @param[in]     participant  Participant on which to create the topic.
 | 
			
		||||
 * @param[in,out] sertopic     Internal description of the topic type (includes name). On return, the sertopic parameter is set to the actual sertopic that is used by the topic.
 | 
			
		||||
 * @param[in]     qos          QoS to set on the new topic (can be NULL).
 | 
			
		||||
 * @param[in]     listener     Any listener functions associated with the new topic (can be NULL).
 | 
			
		||||
 * @param[in]     sedp_plist   Topic description to be published as part of discovery (if NULL, not published).
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A valid, unique topic handle or an error code.
 | 
			
		||||
 * @returns A valid, unique topic handle or an error code. Iff a valid handle, the domain takes ownership of provided serdata.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval >=0
 | 
			
		||||
 *             A valid unique topic handle.
 | 
			
		||||
| 
						 | 
				
			
			@ -1031,6 +1035,14 @@ dds_create_topic(
 | 
			
		|||
 *             topic's type name.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT dds_entity_t
 | 
			
		||||
dds_create_topic_generic (
 | 
			
		||||
  dds_entity_t participant,
 | 
			
		||||
  struct ddsi_sertopic **sertopic,
 | 
			
		||||
  const dds_qos_t *qos,
 | 
			
		||||
  const dds_listener_t *listener,
 | 
			
		||||
  const struct ddsi_plist *sedp_plist);
 | 
			
		||||
 | 
			
		||||
DDS_DEPRECATED_EXPORT dds_entity_t
 | 
			
		||||
dds_create_topic_arbitrary (
 | 
			
		||||
  dds_entity_t participant,
 | 
			
		||||
  struct ddsi_sertopic *sertopic,
 | 
			
		||||
| 
						 | 
				
			
			@ -3358,6 +3370,40 @@ DDS_EXPORT dds_return_t
 | 
			
		|||
dds_assert_liveliness (
 | 
			
		||||
  dds_entity_t entity);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief This operation allows making the domain's network stack
 | 
			
		||||
 * temporarily deaf and/or mute. It is a support function for testing and,
 | 
			
		||||
 * other special uses and is subject to change.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] entity  A domain entity or an entity bound to a domain, such
 | 
			
		||||
 *                    as a participant, reader or writer.
 | 
			
		||||
 * @param[in] deaf    Whether to network stack should pretend to be deaf and
 | 
			
		||||
 *                    ignore any incoming packets.
 | 
			
		||||
 * @param[in] mute    Whether to network stack should pretend to be mute and
 | 
			
		||||
 *                    discard any outgoing packets where it normally would.
 | 
			
		||||
 *                    pass them to the operating system kernel for transmission.
 | 
			
		||||
 * @param[in] reset_after  Any value less than INFINITY will cause it to
 | 
			
		||||
 *                    set deaf = mute = false after reset_after ns have passed.
 | 
			
		||||
 *                    This is done by an event scheduled for the appropriate
 | 
			
		||||
 *                    time and otherwise forgotten. These events are not
 | 
			
		||||
 *                    affected by subsequent calls to this function.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A dds_return_t indicating success or failure.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_OK
 | 
			
		||||
 *             The operation was successful.
 | 
			
		||||
 * @retval DDS_BAD_PARAMETER
 | 
			
		||||
 *             The entity parameter is not a valid parameter.
 | 
			
		||||
 * @retval DDS_RETCODE_ILLEGAL_OPERATION
 | 
			
		||||
 *             The operation is invoked on an inappropriate object.
 | 
			
		||||
*/
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_domain_set_deafmute (
 | 
			
		||||
  dds_entity_t entity,
 | 
			
		||||
  bool deaf,
 | 
			
		||||
  bool mute,
 | 
			
		||||
  dds_duration_t reset_after);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ void dds__builtin_init (struct dds_domain *dom);
 | 
			
		|||
void dds__builtin_fini (struct dds_domain *dom);
 | 
			
		||||
 | 
			
		||||
struct entity_common;
 | 
			
		||||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, ddsrt_wctime_t timestamp, bool alive);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,30 +25,29 @@ extern "C" {
 | 
			
		|||
   QP_DESTINATION_ORDER | QP_HISTORY | QP_RESOURCE_LIMITS)
 | 
			
		||||
 | 
			
		||||
#define DDS_PARTICIPANT_QOS_MASK                                        \
 | 
			
		||||
  (QP_USER_DATA | QP_PRISMTECH_ENTITY_FACTORY |                         \
 | 
			
		||||
   QP_CYCLONE_IGNORELOCAL | QP_PROPERTY_LIST)
 | 
			
		||||
  (QP_USER_DATA | QP_ADLINK_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL | QP_PROPERTY_LIST)
 | 
			
		||||
 | 
			
		||||
#define DDS_PUBLISHER_QOS_MASK                                          \
 | 
			
		||||
  (QP_PARTITION | QP_PRESENTATION | QP_GROUP_DATA |                     \
 | 
			
		||||
   QP_PRISMTECH_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
   QP_ADLINK_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#define DDS_READER_QOS_MASK                                             \
 | 
			
		||||
  (QP_USER_DATA | QP_DURABILITY | QP_DEADLINE | QP_LATENCY_BUDGET |     \
 | 
			
		||||
   QP_OWNERSHIP | QP_LIVELINESS | QP_TIME_BASED_FILTER |                \
 | 
			
		||||
   QP_RELIABILITY | QP_DESTINATION_ORDER | QP_HISTORY |                 \
 | 
			
		||||
   QP_RESOURCE_LIMITS | QP_PRISMTECH_READER_DATA_LIFECYCLE |            \
 | 
			
		||||
   QP_RESOURCE_LIMITS | QP_ADLINK_READER_DATA_LIFECYCLE |               \
 | 
			
		||||
   QP_CYCLONE_IGNORELOCAL | QP_PROPERTY_LIST)
 | 
			
		||||
 | 
			
		||||
#define DDS_SUBSCRIBER_QOS_MASK                                         \
 | 
			
		||||
  (QP_PARTITION | QP_PRESENTATION | QP_GROUP_DATA |                     \
 | 
			
		||||
   QP_PRISMTECH_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
   QP_ADLINK_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#define DDS_WRITER_QOS_MASK                                             \
 | 
			
		||||
  (QP_USER_DATA | QP_DURABILITY | QP_DURABILITY_SERVICE | QP_DEADLINE | \
 | 
			
		||||
   QP_LATENCY_BUDGET | QP_OWNERSHIP | QP_OWNERSHIP_STRENGTH |           \
 | 
			
		||||
   QP_LIVELINESS | QP_RELIABILITY | QP_TRANSPORT_PRIORITY |             \
 | 
			
		||||
   QP_LIFESPAN | QP_DESTINATION_ORDER | QP_HISTORY |                    \
 | 
			
		||||
   QP_RESOURCE_LIMITS | QP_PRISMTECH_WRITER_DATA_LIFECYCLE |            \
 | 
			
		||||
   QP_RESOURCE_LIMITS | QP_ADLINK_WRITER_DATA_LIFECYCLE |               \
 | 
			
		||||
   QP_CYCLONE_IGNORELOCAL | QP_PROPERTY_LIST)
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,10 +26,10 @@ struct rhc_sample;
 | 
			
		|||
DDS_EXPORT struct dds_rhc *dds_rhc_default_new_xchecks (dds_reader *reader, struct ddsi_domaingv *gv, const struct ddsi_sertopic *topic, bool xchecks);
 | 
			
		||||
DDS_EXPORT struct dds_rhc *dds_rhc_default_new (struct dds_reader *reader, const struct ddsi_sertopic *topic);
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
DDS_EXPORT nn_mtime_t dds_rhc_default_sample_expired_cb(void *hc, nn_mtime_t tnow);
 | 
			
		||||
DDS_EXPORT ddsrt_mtime_t dds_rhc_default_sample_expired_cb(void *hc, ddsrt_mtime_t tnow);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
DDS_EXPORT nn_mtime_t dds_rhc_default_deadline_missed_cb(void *hc, nn_mtime_t tnow);
 | 
			
		||||
DDS_EXPORT ddsrt_mtime_t dds_rhc_default_deadline_missed_cb(void *hc, ddsrt_mtime_t tnow);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,7 +39,7 @@ DDS_EXPORT void dds_topic_set_filter_with_ctx
 | 
			
		|||
DDS_EXPORT dds_topic_intern_filter_fn dds_topic_get_filter_with_ctx
 | 
			
		||||
  (dds_entity_t topic);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertopic *sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist);
 | 
			
		||||
DDS_EXPORT dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertopic **sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,7 +77,12 @@ dds_entity_t dds__get_builtin_topic (dds_entity_t entity, dds_entity_t topic)
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  dds_qos_t *qos = dds__create_builtin_qos ();
 | 
			
		||||
  tp = dds_create_topic_impl (par->m_entity.m_hdllink.hdl, sertopic, qos, NULL, NULL);
 | 
			
		||||
  if ((tp = dds_create_topic_impl (par->m_entity.m_hdllink.hdl, &sertopic, qos, NULL, NULL)) > 0)
 | 
			
		||||
  {
 | 
			
		||||
    /* keep ownership for built-in sertopics because there are re-used, lifetime for these
 | 
			
		||||
       sertopics is bound to domain */
 | 
			
		||||
    ddsi_sertopic_ref (sertopic);
 | 
			
		||||
  }
 | 
			
		||||
  dds_delete_qos (qos);
 | 
			
		||||
  dds_entity_unpin (e);
 | 
			
		||||
  return tp;
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +190,7 @@ static struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct dd
 | 
			
		|||
  return tk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn_wctime_t timestamp, bool alive)
 | 
			
		||||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, ddsrt_wctime_t timestamp, bool alive)
 | 
			
		||||
{
 | 
			
		||||
  /* initialize to avoid gcc warning ultimately caused by C's horrible type system */
 | 
			
		||||
  struct dds_domain *dom = e->gv->builtin_topic_interface->arg;
 | 
			
		||||
| 
						 | 
				
			
			@ -215,7 +220,7 @@ struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn
 | 
			
		|||
  return serdata;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, bool alive, void *vdomain)
 | 
			
		||||
static void dds__builtin_write (const struct entity_common *e, ddsrt_wctime_t timestamp, bool alive, void *vdomain)
 | 
			
		||||
{
 | 
			
		||||
  struct dds_domain *dom = vdomain;
 | 
			
		||||
  if (dds__builtin_is_visible (&e->guid, get_entity_vendorid (e), dom))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ static dds_entity_t dds_domain_init (dds_domain *domain, dds_domainid_t domain_i
 | 
			
		|||
  domain->m_entity.m_domain = domain;
 | 
			
		||||
  domain->m_entity.m_iid = ddsi_iid_gen ();
 | 
			
		||||
 | 
			
		||||
  domain->gv.tstart = now ();
 | 
			
		||||
  domain->gv.tstart = ddsrt_time_wallclock ();
 | 
			
		||||
 | 
			
		||||
  /* | domain_id | domain id in config | result
 | 
			
		||||
     +-----------+---------------------+----------
 | 
			
		||||
| 
						 | 
				
			
			@ -286,6 +286,23 @@ static dds_return_t dds_domain_free (dds_entity *vdomain)
 | 
			
		|||
  return DDS_RETCODE_NO_DATA;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_domain_set_deafmute (dds_entity_t entity, bool deaf, bool mute, dds_duration_t reset_after)
 | 
			
		||||
{
 | 
			
		||||
  struct dds_entity *e;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_entity_pin (entity, &e)) < 0)
 | 
			
		||||
    return rc;
 | 
			
		||||
  if (e->m_domain == NULL)
 | 
			
		||||
    rc = DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ddsi_set_deafmute (&e->m_domain->gv, deaf, mute, reset_after);
 | 
			
		||||
    rc = DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
  dds_entity_unpin (e);
 | 
			
		||||
  return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "dds__entity.h"
 | 
			
		||||
static void pushdown_set_batch (struct dds_entity *e, bool enable)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -677,8 +677,9 @@ dds_return_t dds_get_qos (dds_entity_t entity, dds_qos_t *qos)
 | 
			
		|||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_set_qos_locked_raw (dds_entity *e, dds_qos_t **e_qos_ptr, bool e_enabled, const dds_qos_t *qos, uint64_t mask, const struct ddsrt_log_cfg *logcfg, dds_return_t (*set_qos) (struct dds_entity *e, const dds_qos_t *qos, bool enabled) ddsrt_nonnull_all)
 | 
			
		||||
static dds_return_t dds_set_qos_locked_raw (dds_entity *e, dds_qos_t **e_qos_ptr, const dds_qos_t *qos, uint64_t mask, const struct ddsrt_log_cfg *logcfg)
 | 
			
		||||
{
 | 
			
		||||
  const bool enabled = ((e->m_flags & DDS_ENTITY_ENABLED) != 0);
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
  /* Any attempt to do this on a topic ends up doing it on the ktopic instead, so that there is
 | 
			
		||||
| 
						 | 
				
			
			@ -692,7 +693,7 @@ static dds_return_t dds_set_qos_locked_raw (dds_entity *e, dds_qos_t **e_qos_ptr
 | 
			
		|||
    /* invalid or inconsistent QoS settings */
 | 
			
		||||
    goto error_or_nochange;
 | 
			
		||||
  }
 | 
			
		||||
  else if (!e_enabled)
 | 
			
		||||
  else if (!enabled)
 | 
			
		||||
  {
 | 
			
		||||
    /* do as you please while the entity is not enabled */
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -728,7 +729,7 @@ static dds_return_t dds_set_qos_locked_raw (dds_entity *e, dds_qos_t **e_qos_ptr
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  assert (ret == DDS_RETCODE_OK);
 | 
			
		||||
  if ((ret = set_qos (e, newqos, e_enabled)) != DDS_RETCODE_OK)
 | 
			
		||||
  if ((ret = dds_entity_deriver_set_qos (e, newqos, enabled)) != DDS_RETCODE_OK)
 | 
			
		||||
    goto error_or_nochange;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -748,7 +749,7 @@ static dds_return_t dds_set_qos_locked_impl (dds_entity *e, const dds_qos_t *qos
 | 
			
		|||
  dds_entity_kind_t kind = dds_entity_kind (e);
 | 
			
		||||
  if (kind != DDS_KIND_TOPIC)
 | 
			
		||||
  {
 | 
			
		||||
    return dds_set_qos_locked_raw (e, &e->m_qos, (e->m_flags & DDS_ENTITY_ENABLED) != 0, qos, mask, logcfg, dds_entity_deriver_table[kind]->set_qos);
 | 
			
		||||
    return dds_set_qos_locked_raw (e, &e->m_qos, qos, mask, logcfg);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -767,9 +768,7 @@ static dds_return_t dds_set_qos_locked_impl (dds_entity *e, const dds_qos_t *qos
 | 
			
		|||
    while (ktp->defer_set_qos != 0)
 | 
			
		||||
      ddsrt_cond_wait (&pp->m_entity.m_cond, &pp->m_entity.m_mutex);
 | 
			
		||||
 | 
			
		||||
    /* dds_entity_deriver_table[kind]->set_qos had better avoid looking at the entity! */
 | 
			
		||||
    rc = dds_set_qos_locked_raw (NULL, &ktp->qos, (e->m_flags & DDS_ENTITY_ENABLED) != 0, qos, mask, logcfg, dds_entity_deriver_table[kind]->set_qos);
 | 
			
		||||
 | 
			
		||||
    rc = dds_set_qos_locked_raw (e, &ktp->qos, qos, mask, logcfg);
 | 
			
		||||
    ddsrt_mutex_unlock (&pp->m_entity.m_mutex);
 | 
			
		||||
    return rc;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -302,7 +302,7 @@ void dds_qset_writer_data_lifecycle (dds_qos_t * __restrict qos, bool autodispos
 | 
			
		|||
  if (qos == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
  qos->writer_data_lifecycle.autodispose_unregistered_instances = autodispose;
 | 
			
		||||
  qos->present |= QP_PRISMTECH_WRITER_DATA_LIFECYCLE;
 | 
			
		||||
  qos->present |= QP_ADLINK_WRITER_DATA_LIFECYCLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_qset_reader_data_lifecycle (dds_qos_t * __restrict qos, dds_duration_t autopurge_nowriter_samples_delay, dds_duration_t autopurge_disposed_samples_delay)
 | 
			
		||||
| 
						 | 
				
			
			@ -311,7 +311,7 @@ void dds_qset_reader_data_lifecycle (dds_qos_t * __restrict qos, dds_duration_t
 | 
			
		|||
    return;
 | 
			
		||||
  qos->reader_data_lifecycle.autopurge_nowriter_samples_delay = autopurge_nowriter_samples_delay;
 | 
			
		||||
  qos->reader_data_lifecycle.autopurge_disposed_samples_delay = autopurge_disposed_samples_delay;
 | 
			
		||||
  qos->present |= QP_PRISMTECH_READER_DATA_LIFECYCLE;
 | 
			
		||||
  qos->present |= QP_ADLINK_READER_DATA_LIFECYCLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_qset_durability_service (dds_qos_t * __restrict qos, dds_duration_t service_cleanup_delay, dds_history_kind_t history_kind, int32_t history_depth, int32_t max_samples, int32_t max_instances, int32_t max_samples_per_instance)
 | 
			
		||||
| 
						 | 
				
			
			@ -626,7 +626,7 @@ bool dds_qget_destination_order (const dds_qos_t * __restrict qos, dds_destinati
 | 
			
		|||
 | 
			
		||||
bool dds_qget_writer_data_lifecycle (const dds_qos_t * __restrict qos, bool *autodispose)
 | 
			
		||||
{
 | 
			
		||||
  if (qos == NULL || !(qos->present & QP_PRISMTECH_WRITER_DATA_LIFECYCLE))
 | 
			
		||||
  if (qos == NULL || !(qos->present & QP_ADLINK_WRITER_DATA_LIFECYCLE))
 | 
			
		||||
    return false;
 | 
			
		||||
  if (autodispose)
 | 
			
		||||
    *autodispose = qos->writer_data_lifecycle.autodispose_unregistered_instances;
 | 
			
		||||
| 
						 | 
				
			
			@ -635,7 +635,7 @@ bool dds_qget_writer_data_lifecycle (const dds_qos_t * __restrict qos, bool *aut
 | 
			
		|||
 | 
			
		||||
bool dds_qget_reader_data_lifecycle (const dds_qos_t * __restrict qos, dds_duration_t *autopurge_nowriter_samples_delay, dds_duration_t *autopurge_disposed_samples_delay)
 | 
			
		||||
{
 | 
			
		||||
  if (qos == NULL || !(qos->present & QP_PRISMTECH_READER_DATA_LIFECYCLE))
 | 
			
		||||
  if (qos == NULL || !(qos->present & QP_ADLINK_READER_DATA_LIFECYCLE))
 | 
			
		||||
    return false;
 | 
			
		||||
  if (autopurge_nowriter_samples_delay)
 | 
			
		||||
    *autopurge_nowriter_samples_delay = qos->reader_data_lifecycle.autopurge_nowriter_samples_delay;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -274,7 +274,7 @@ struct rhc_instance {
 | 
			
		|||
  uint32_t no_writers_gen;     /* __/ */
 | 
			
		||||
  int32_t strength;            /* "current" ownership strength */
 | 
			
		||||
  ddsi_guid_t wr_guid;         /* guid of last writer (if wr_iid != 0 then wr_guid is the corresponding guid, else undef) */
 | 
			
		||||
  nn_wctime_t tstamp;          /* source time stamp of last update */
 | 
			
		||||
  ddsrt_wctime_t tstamp;          /* source time stamp of last update */
 | 
			
		||||
  struct ddsrt_circlist_elem nonempty_list; /* links non-empty instances in arbitrary ordering */
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
  struct deadline_elem deadline; /* element in deadline missed administration */
 | 
			
		||||
| 
						 | 
				
			
			@ -594,11 +594,11 @@ static void drop_expired_samples (struct dds_rhc_default *rhc, struct rhc_sample
 | 
			
		|||
  TRACE (")\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_mtime_t dds_rhc_default_sample_expired_cb(void *hc, nn_mtime_t tnow)
 | 
			
		||||
ddsrt_mtime_t dds_rhc_default_sample_expired_cb(void *hc, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct dds_rhc_default *rhc = hc;
 | 
			
		||||
  struct rhc_sample *sample;
 | 
			
		||||
  nn_mtime_t tnext;
 | 
			
		||||
  ddsrt_mtime_t tnext;
 | 
			
		||||
  ddsrt_mutex_lock (&rhc->lock);
 | 
			
		||||
  while ((tnext = lifespan_next_expired_locked (&rhc->lifespan, tnow, (void **)&sample)).v == 0)
 | 
			
		||||
    drop_expired_samples (rhc, sample);
 | 
			
		||||
| 
						 | 
				
			
			@ -608,11 +608,11 @@ nn_mtime_t dds_rhc_default_sample_expired_cb(void *hc, nn_mtime_t tnow)
 | 
			
		|||
#endif /* DDSI_INCLUDE_LIFESPAN */
 | 
			
		||||
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
nn_mtime_t dds_rhc_default_deadline_missed_cb(void *hc, nn_mtime_t tnow)
 | 
			
		||||
ddsrt_mtime_t dds_rhc_default_deadline_missed_cb(void *hc, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct dds_rhc_default *rhc = hc;
 | 
			
		||||
  void *vinst;
 | 
			
		||||
  nn_mtime_t tnext;
 | 
			
		||||
  ddsrt_mtime_t tnext;
 | 
			
		||||
  ddsrt_mutex_lock (&rhc->lock);
 | 
			
		||||
  while ((tnext = deadline_next_missed_locked (&rhc->deadline, tnow, &vinst)).v == 0)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -630,7 +630,7 @@ nn_mtime_t dds_rhc_default_deadline_missed_cb(void *hc, nn_mtime_t tnow)
 | 
			
		|||
    dds_reader_status_cb (&rhc->reader->m_entity, &cb_data);
 | 
			
		||||
    ddsrt_mutex_lock (&rhc->lock);
 | 
			
		||||
 | 
			
		||||
    tnow = now_mt ();
 | 
			
		||||
    tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&rhc->lock);
 | 
			
		||||
  return tnext;
 | 
			
		||||
| 
						 | 
				
			
			@ -837,7 +837,7 @@ static void free_instance_rhc_free_wrap (void *vnode, void *varg)
 | 
			
		|||
static void dds_rhc_default_free (struct dds_rhc_default *rhc)
 | 
			
		||||
{
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
  dds_rhc_default_sample_expired_cb (rhc, NN_MTIME_NEVER);
 | 
			
		||||
  dds_rhc_default_sample_expired_cb (rhc, DDSRT_MTIME_NEVER);
 | 
			
		||||
  lifespan_fini (&rhc->lifespan);
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
| 
						 | 
				
			
			@ -1067,7 +1067,7 @@ static int inst_accepts_sample (const struct dds_rhc_default *rhc, const struct
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void update_inst (struct rhc_instance *inst, const struct ddsi_writer_info * __restrict wrinfo, bool wr_iid_valid, nn_wctime_t tstamp)
 | 
			
		||||
static void update_inst (struct rhc_instance *inst, const struct ddsi_writer_info * __restrict wrinfo, bool wr_iid_valid, ddsrt_wctime_t tstamp)
 | 
			
		||||
{
 | 
			
		||||
  inst->tstamp = tstamp;
 | 
			
		||||
  inst->wr_iid_islive = wr_iid_valid;
 | 
			
		||||
| 
						 | 
				
			
			@ -1264,7 +1264,7 @@ static int rhc_unregister_isreg_w_sideeffects (struct dds_rhc_default *rhc, cons
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int rhc_unregister_updateinst (struct dds_rhc_default *rhc, struct rhc_instance *inst, const struct ddsi_writer_info * __restrict wrinfo, nn_wctime_t tstamp, struct trigger_info_qcond *trig_qc, bool *nda)
 | 
			
		||||
static int rhc_unregister_updateinst (struct dds_rhc_default *rhc, struct rhc_instance *inst, const struct ddsi_writer_info * __restrict wrinfo, ddsrt_wctime_t tstamp, struct trigger_info_qcond *trig_qc, bool *nda)
 | 
			
		||||
{
 | 
			
		||||
  assert (inst->wrcount > 0);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1327,7 +1327,7 @@ static int rhc_unregister_updateinst (struct dds_rhc_default *rhc, struct rhc_in
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool dds_rhc_unregister (struct dds_rhc_default *rhc, struct rhc_instance *inst, const struct ddsi_writer_info * __restrict wrinfo, nn_wctime_t tstamp, struct trigger_info_post *post, struct trigger_info_qcond *trig_qc)
 | 
			
		||||
static bool dds_rhc_unregister (struct dds_rhc_default *rhc, struct rhc_instance *inst, const struct ddsi_writer_info * __restrict wrinfo, ddsrt_wctime_t tstamp, struct trigger_info_post *post, struct trigger_info_qcond *trig_qc)
 | 
			
		||||
{
 | 
			
		||||
  bool notify_data_available = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1384,7 +1384,7 @@ static struct rhc_instance *alloc_new_instance (struct dds_rhc_default *rhc, con
 | 
			
		|||
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
  if (!inst->isdisposed)
 | 
			
		||||
    deadline_register_instance_locked (&rhc->deadline, &inst->deadline, now_mt ());
 | 
			
		||||
    deadline_register_instance_locked (&rhc->deadline, &inst->deadline, ddsrt_time_monotonic ());
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  return inst;
 | 
			
		||||
| 
						 | 
				
			
			@ -1598,7 +1598,7 @@ static bool dds_rhc_default_store (struct dds_rhc_default * __restrict rhc, cons
 | 
			
		|||
        inst->disposed_gen++;
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
        if (!is_dispose)
 | 
			
		||||
          deadline_register_instance_locked (&rhc->deadline, &inst->deadline, now_mt ());
 | 
			
		||||
          deadline_register_instance_locked (&rhc->deadline, &inst->deadline, ddsrt_time_monotonic ());
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
      if (is_dispose)
 | 
			
		||||
| 
						 | 
				
			
			@ -1639,7 +1639,7 @@ static bool dds_rhc_default_store (struct dds_rhc_default * __restrict rhc, cons
 | 
			
		|||
          {
 | 
			
		||||
            inst->isdisposed = 0;
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
            deadline_register_instance_locked (&rhc->deadline, &inst->deadline, now_mt ());
 | 
			
		||||
            deadline_register_instance_locked (&rhc->deadline, &inst->deadline, ddsrt_time_monotonic ());
 | 
			
		||||
#endif
 | 
			
		||||
          }
 | 
			
		||||
          goto error_or_nochange;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -171,10 +171,8 @@ static dds_return_t dds_topic_qos_set (dds_entity *e, const dds_qos_t *qos, bool
 | 
			
		|||
{
 | 
			
		||||
  /* We never actually set the qos of a struct dds_topic and really shouldn't be here,
 | 
			
		||||
     but the code to check whether set_qos is supported uses the entity's qos_set
 | 
			
		||||
     function as a proxy.  One of the weird things about the topic's set_qos is that
 | 
			
		||||
     this is called with e == NULL.  */
 | 
			
		||||
     function as a proxy.  */
 | 
			
		||||
  (void) e; (void) qos; (void) enabled;
 | 
			
		||||
  assert (e == NULL);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -279,7 +277,7 @@ static dds_entity_t create_topic_pp_locked (struct dds_participant *pp, struct d
 | 
			
		|||
  return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertopic *sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist)
 | 
			
		||||
dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertopic **sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  dds_participant *pp;
 | 
			
		||||
| 
						 | 
				
			
			@ -287,7 +285,7 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
  dds_entity_t hdl;
 | 
			
		||||
  struct ddsi_sertopic *sertopic_registered;
 | 
			
		||||
 | 
			
		||||
  if (sertopic == NULL)
 | 
			
		||||
  if (sertopic == NULL || *sertopic == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +318,7 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
  if ((rc = ddsi_xqos_valid (&gv->logconfig, new_qos)) != DDS_RETCODE_OK)
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  if (!q_omg_security_check_create_topic (&pp->m_entity.m_domain->gv, &pp->m_entity.m_guid, sertopic->name, new_qos))
 | 
			
		||||
  if (!q_omg_security_check_create_topic (&pp->m_entity.m_domain->gv, &pp->m_entity.m_guid, (*sertopic)->name, new_qos))
 | 
			
		||||
  {
 | 
			
		||||
    rc = DDS_RETCODE_NOT_ALLOWED_BY_SECURITY;
 | 
			
		||||
    goto error;
 | 
			
		||||
| 
						 | 
				
			
			@ -328,14 +326,14 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
 | 
			
		||||
  /* See if we're allowed to create the topic; ktp is returned pinned & locked
 | 
			
		||||
     so we can be sure it doesn't disappear and its QoS can't change */
 | 
			
		||||
  GVTRACE ("dds_create_topic_arbitrary (pp %p "PGUIDFMT" sertopic %p reg?%s refc %"PRIu32" %s/%s)\n",
 | 
			
		||||
           (void *) pp, PGUID (pp->m_entity.m_guid), (void *) sertopic, sertopic->gv ? "yes" : "no",
 | 
			
		||||
           ddsrt_atomic_ld32 (&sertopic->refc), sertopic->name, sertopic->type_name);
 | 
			
		||||
  GVTRACE ("dds_create_topic_generic (pp %p "PGUIDFMT" sertopic %p reg?%s refc %"PRIu32" %s/%s)\n",
 | 
			
		||||
           (void *) pp, PGUID (pp->m_entity.m_guid), (void *) (*sertopic), (*sertopic)->gv ? "yes" : "no",
 | 
			
		||||
           ddsrt_atomic_ld32 (&(*sertopic)->refc), (*sertopic)->name, (*sertopic)->type_name);
 | 
			
		||||
  ddsrt_mutex_lock (&pp->m_entity.m_mutex);
 | 
			
		||||
  struct dds_ktopic *ktp;
 | 
			
		||||
  if ((rc = lookup_and_check_ktopic (&ktp, pp, sertopic->name, sertopic->type_name, new_qos)) != DDS_RETCODE_OK)
 | 
			
		||||
  if ((rc = lookup_and_check_ktopic (&ktp, pp, (*sertopic)->name, (*sertopic)->type_name, new_qos)) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    GVTRACE ("dds_create_topic_arbitrary: failed after compatibility check: %s\n", dds_strretcode (rc));
 | 
			
		||||
    GVTRACE ("dds_create_topic_generic: failed after compatibility check: %s\n", dds_strretcode (rc));
 | 
			
		||||
    ddsrt_mutex_unlock (&pp->m_entity.m_mutex);
 | 
			
		||||
    goto error;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -349,8 +347,8 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
    ktp->defer_set_qos = 0;
 | 
			
		||||
    ktp->qos = new_qos;
 | 
			
		||||
    /* have to copy these because the ktopic can outlast any specific sertopic */
 | 
			
		||||
    ktp->name = ddsrt_strdup (sertopic->name);
 | 
			
		||||
    ktp->type_name = ddsrt_strdup (sertopic->type_name);
 | 
			
		||||
    ktp->name = ddsrt_strdup ((*sertopic)->name);
 | 
			
		||||
    ktp->type_name = ddsrt_strdup ((*sertopic)->type_name);
 | 
			
		||||
    ddsrt_avl_insert (&participant_ktopics_treedef, &pp->m_ktopics, ktp);
 | 
			
		||||
    GVTRACE ("create_and_lock_ktopic: ktp %p\n", (void *) ktp);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -363,13 +361,13 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
  /* Sertopic: re-use a previously registered one if possible, else register this one */
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_lock (&gv->sertopics_lock);
 | 
			
		||||
    if ((sertopic_registered = ddsi_sertopic_lookup_locked (gv, sertopic)) != NULL)
 | 
			
		||||
      GVTRACE ("dds_create_topic_arbitrary: reuse sertopic %p\n", (void *) sertopic_registered);
 | 
			
		||||
    if ((sertopic_registered = ddsi_sertopic_lookup_locked (gv, *sertopic)) != NULL)
 | 
			
		||||
      GVTRACE ("dds_create_topic_generic: reuse sertopic %p\n", (void *) sertopic_registered);
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      GVTRACE ("dds_create_topic_arbitrary: register new sertopic %p\n", (void *) sertopic);
 | 
			
		||||
      ddsi_sertopic_register_locked (gv, sertopic);
 | 
			
		||||
      sertopic_registered = sertopic;
 | 
			
		||||
      GVTRACE ("dds_create_topic_generic: register new sertopic %p\n", (void *) (*sertopic));
 | 
			
		||||
      ddsi_sertopic_register_locked (gv, *sertopic);
 | 
			
		||||
      sertopic_registered = *sertopic;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&gv->sertopics_lock);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -377,8 +375,10 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
  /* Create topic referencing ktopic & sertopic_registered */
 | 
			
		||||
  /* FIXME: setting "implicit" based on sertopic->ops is a hack */
 | 
			
		||||
  hdl = create_topic_pp_locked (pp, ktp, (sertopic_registered->ops == &ddsi_sertopic_ops_builtintopic), sertopic_registered, listener, sedp_plist);
 | 
			
		||||
  ddsi_sertopic_unref (*sertopic);
 | 
			
		||||
  *sertopic = sertopic_registered;
 | 
			
		||||
  dds_participant_unlock (pp);
 | 
			
		||||
  GVTRACE ("dds_create_topic_arbitrary: new topic %"PRId32"\n", hdl);
 | 
			
		||||
  GVTRACE ("dds_create_topic_generic: new topic %"PRId32"\n", hdl);
 | 
			
		||||
  return hdl;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
| 
						 | 
				
			
			@ -387,18 +387,32 @@ dds_entity_t dds_create_topic_impl (dds_entity_t participant, struct ddsi_sertop
 | 
			
		|||
  return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_topic_arbitrary (dds_entity_t participant, struct ddsi_sertopic *sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist)
 | 
			
		||||
dds_entity_t dds_create_topic_generic (dds_entity_t participant, struct ddsi_sertopic **sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist)
 | 
			
		||||
{
 | 
			
		||||
  assert(sertopic);
 | 
			
		||||
  assert(sertopic->name);
 | 
			
		||||
  if (!strncmp(sertopic->name, "DCPS", 4))
 | 
			
		||||
  if (sertopic == NULL || *sertopic == NULL || (*sertopic)->name == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  if (!strncmp((*sertopic)->name, "DCPS", 4))
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  return dds_create_topic_impl (participant, sertopic, qos, listener, sedp_plist);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_topic_arbitrary (dds_entity_t participant, struct ddsi_sertopic *sertopic, const dds_qos_t *qos, const dds_listener_t *listener, const ddsi_plist_t *sedp_plist)
 | 
			
		||||
{
 | 
			
		||||
  if (sertopic == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  dds_entity_t ret;
 | 
			
		||||
  struct ddsi_sertopic *st = sertopic;
 | 
			
		||||
  ddsi_sertopic_ref (st);
 | 
			
		||||
  if ((ret = dds_create_topic_generic (participant, &st, qos, listener, sedp_plist)) < 0)
 | 
			
		||||
    ddsi_sertopic_unref (st);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_topic (dds_entity_t participant, const dds_topic_descriptor_t *desc, const char *name, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_sertopic_default *st;
 | 
			
		||||
  struct ddsi_sertopic *st_tmp;
 | 
			
		||||
  ddsi_plist_t plist;
 | 
			
		||||
  dds_entity_t hdl;
 | 
			
		||||
  struct dds_entity *ppent;
 | 
			
		||||
| 
						 | 
				
			
			@ -439,11 +453,11 @@ dds_entity_t dds_create_topic (dds_entity_t participant, const dds_topic_descrip
 | 
			
		|||
  if (desc->m_meta)
 | 
			
		||||
  {
 | 
			
		||||
    plist.type_description = dds_string_dup (desc->m_meta);
 | 
			
		||||
    plist.present |= PP_PRISMTECH_TYPE_DESCRIPTION;
 | 
			
		||||
    plist.present |= PP_ADLINK_TYPE_DESCRIPTION;
 | 
			
		||||
  }
 | 
			
		||||
  if (desc->m_nkeys)
 | 
			
		||||
  {
 | 
			
		||||
    plist.qos.present |= QP_PRISMTECH_SUBSCRIPTION_KEYS;
 | 
			
		||||
    plist.qos.present |= QP_ADLINK_SUBSCRIPTION_KEYS;
 | 
			
		||||
    plist.qos.subscription_keys.use_key_list = 1;
 | 
			
		||||
    plist.qos.subscription_keys.key_list.n = desc->m_nkeys;
 | 
			
		||||
    plist.qos.subscription_keys.key_list.strs = dds_alloc (desc->m_nkeys * sizeof (char*));
 | 
			
		||||
| 
						 | 
				
			
			@ -451,8 +465,10 @@ dds_entity_t dds_create_topic (dds_entity_t participant, const dds_topic_descrip
 | 
			
		|||
      plist.qos.subscription_keys.key_list.strs[index] = dds_string_dup (desc->m_keys[index].m_name);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  hdl = dds_create_topic_arbitrary (participant, &st->c, qos, listener, &plist);
 | 
			
		||||
  ddsi_sertopic_unref (&st->c);
 | 
			
		||||
  st_tmp = &st->c;
 | 
			
		||||
  hdl = dds_create_topic_generic (participant, &st_tmp, qos, listener, &plist);
 | 
			
		||||
  if (hdl < 0)
 | 
			
		||||
    ddsi_sertopic_unref (st_tmp);
 | 
			
		||||
  dds_entity_unpin (ppent);
 | 
			
		||||
  ddsi_plist_fini (&plist);
 | 
			
		||||
  return hdl;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,6 @@
 | 
			
		|||
#include "dds/ddsi/q_unused.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_rtps.h"
 | 
			
		||||
#include "dds/ddsi/q_freelist.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_domaingv.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +50,7 @@ struct whc_node {
 | 
			
		|||
  struct ddsi_plist *plist; /* 0 if nothing special */
 | 
			
		||||
  unsigned unacked: 1; /* counted in whc::unacked_bytes iff 1 */
 | 
			
		||||
  unsigned borrowed: 1; /* at most one can borrow it at any time */
 | 
			
		||||
  nn_mtime_t last_rexmit_ts;
 | 
			
		||||
  ddsrt_mtime_t last_rexmit_ts;
 | 
			
		||||
  uint32_t rexmit_count;
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
  struct lifespan_fhnode lifespan; /* fibheap node for lifespan */
 | 
			
		||||
| 
						 | 
				
			
			@ -155,7 +154,7 @@ static uint32_t whc_default_remove_acked_messages_full (struct whc_impl *whc, se
 | 
			
		|||
static uint32_t whc_default_remove_acked_messages (struct whc *whc, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list);
 | 
			
		||||
static void whc_default_free_deferred_free_list (struct whc *whc, struct whc_node *deferred_free_list);
 | 
			
		||||
static void whc_default_get_state (const struct whc *whc, struct whc_state *st);
 | 
			
		||||
static int whc_default_insert (struct whc *whc, seqno_t max_drop_seq, seqno_t seq, nn_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk);
 | 
			
		||||
static int whc_default_insert (struct whc *whc, seqno_t max_drop_seq, seqno_t seq, ddsrt_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk);
 | 
			
		||||
static seqno_t whc_default_next_seq (const struct whc *whc, seqno_t seq);
 | 
			
		||||
static bool whc_default_borrow_sample (const struct whc *whc, seqno_t seq, struct whc_borrowed_sample *sample);
 | 
			
		||||
static bool whc_default_borrow_sample_key (const struct whc *whc, const struct ddsi_serdata *serdata_key, struct whc_borrowed_sample *sample);
 | 
			
		||||
| 
						 | 
				
			
			@ -377,11 +376,11 @@ static struct whc_node *whc_findkey (const struct whc_impl *whc, const struct dd
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
static nn_mtime_t whc_sample_expired_cb(void *hc, nn_mtime_t tnow)
 | 
			
		||||
static ddsrt_mtime_t whc_sample_expired_cb(void *hc, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_impl *whc = hc;
 | 
			
		||||
  void *sample;
 | 
			
		||||
  nn_mtime_t tnext;
 | 
			
		||||
  ddsrt_mtime_t tnext;
 | 
			
		||||
  ddsrt_mutex_lock (&whc->lock);
 | 
			
		||||
  while ((tnext = lifespan_next_expired_locked (&whc->lifespan, tnow, &sample)).v == 0)
 | 
			
		||||
    whc_delete_one (whc, sample);
 | 
			
		||||
| 
						 | 
				
			
			@ -392,11 +391,11 @@ static nn_mtime_t whc_sample_expired_cb(void *hc, nn_mtime_t tnow)
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
static nn_mtime_t whc_deadline_missed_cb(void *hc, nn_mtime_t tnow)
 | 
			
		||||
static ddsrt_mtime_t whc_deadline_missed_cb(void *hc, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_impl *whc = hc;
 | 
			
		||||
  void *vidxnode;
 | 
			
		||||
  nn_mtime_t tnext;
 | 
			
		||||
  ddsrt_mtime_t tnext;
 | 
			
		||||
  ddsrt_mutex_lock (&whc->lock);
 | 
			
		||||
  while ((tnext = deadline_next_missed_locked (&whc->deadline, tnow, &vidxnode)).v == 0)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -412,7 +411,7 @@ static nn_mtime_t whc_deadline_missed_cb(void *hc, nn_mtime_t tnow)
 | 
			
		|||
    dds_writer_status_cb (&whc->wrinfo.writer->m_entity, &cb_data);
 | 
			
		||||
    ddsrt_mutex_lock (&whc->lock);
 | 
			
		||||
 | 
			
		||||
    tnow = now_mt ();
 | 
			
		||||
    tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
  return tnext;
 | 
			
		||||
| 
						 | 
				
			
			@ -510,7 +509,7 @@ void whc_default_free (struct whc *whc_generic)
 | 
			
		|||
  check_whc (whc);
 | 
			
		||||
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
  whc_sample_expired_cb (whc, NN_MTIME_NEVER);
 | 
			
		||||
  whc_sample_expired_cb (whc, DDSRT_MTIME_NEVER);
 | 
			
		||||
  lifespan_fini (&whc->lifespan);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1156,7 +1155,7 @@ static uint32_t whc_default_remove_acked_messages (struct whc *whc_generic, seqn
 | 
			
		|||
  return cnt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct whc_node *whc_default_insert_seq (struct whc_impl *whc, seqno_t max_drop_seq, seqno_t seq, nn_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata)
 | 
			
		||||
static struct whc_node *whc_default_insert_seq (struct whc_impl *whc, seqno_t max_drop_seq, seqno_t seq, ddsrt_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_node *newn = NULL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,7 +1227,7 @@ static struct whc_node *whc_default_insert_seq (struct whc_impl *whc, seqno_t ma
 | 
			
		|||
  return newn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, seqno_t seq, nn_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk)
 | 
			
		||||
static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, seqno_t seq, ddsrt_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_impl * const whc = (struct whc_impl *)whc_generic;
 | 
			
		||||
  struct whc_node *newn = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1364,7 +1363,7 @@ static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, se
 | 
			
		|||
      if (!ddsrt_hh_add (whc->idx_hash, idxn))
 | 
			
		||||
        assert (0);
 | 
			
		||||
#ifdef DDSI_INCLUDE_DEADLINE_MISSED
 | 
			
		||||
      deadline_register_instance_locked (&whc->deadline, &idxn->deadline, now_mt ());
 | 
			
		||||
      deadline_register_instance_locked (&whc->deadline, &idxn->deadline, ddsrt_time_monotonic ());
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,7 +143,7 @@ static void bwhc_get_state (const struct whc *whc, struct whc_state *st)
 | 
			
		|||
  st->unacked_bytes = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int bwhc_insert (struct whc *whc, seqno_t max_drop_seq, seqno_t seq, nn_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk)
 | 
			
		||||
static int bwhc_insert (struct whc *whc, seqno_t max_drop_seq, seqno_t seq, ddsrt_mtime_t exp, struct ddsi_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk)
 | 
			
		||||
{
 | 
			
		||||
  (void)whc;
 | 
			
		||||
  (void)max_drop_seq;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,7 +90,7 @@ struct local_sourceinfo {
 | 
			
		|||
  const struct ddsi_sertopic *src_topic;
 | 
			
		||||
  struct ddsi_serdata *src_payload;
 | 
			
		||||
  struct ddsi_tkmap_instance *src_tk;
 | 
			
		||||
  nn_mtime_t timeout;
 | 
			
		||||
  ddsrt_mtime_t timeout;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ddsi_serdata *local_make_sample (struct ddsi_tkmap_instance **tk, struct ddsi_domaingv *gv, struct ddsi_sertopic const * const topic, void *vsourceinfo)
 | 
			
		||||
| 
						 | 
				
			
			@ -136,9 +136,9 @@ static dds_return_t local_on_delivery_failure_fastpath (struct entity_common *so
 | 
			
		|||
  assert (source_entity->kind == EK_WRITER);
 | 
			
		||||
  struct writer *wr = (struct writer *) source_entity;
 | 
			
		||||
  struct local_sourceinfo *si = vsourceinfo;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  if (si->timeout.v == 0)
 | 
			
		||||
    si->timeout = add_duration_to_mtime (tnow, wr->xqos->reliability.max_blocking_time);
 | 
			
		||||
    si->timeout = ddsrt_mtime_add_duration (tnow, wr->xqos->reliability.max_blocking_time);
 | 
			
		||||
  if (tnow.v >= si->timeout.v)
 | 
			
		||||
    return DDS_RETCODE_TIMEOUT;
 | 
			
		||||
  else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -292,8 +292,6 @@ dds_entity_t dds_create_writer (dds_entity_t participant_or_publisher, dds_entit
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ddsi_tran_conn_t conn = pub->m_entity.m_domain->gv.data_conn_uc;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_topic_pin (topic, &tp)) != DDS_RETCODE_OK)
 | 
			
		||||
    goto err_pin_topic;
 | 
			
		||||
  assert (tp->m_stopic);
 | 
			
		||||
| 
						 | 
				
			
			@ -331,6 +329,7 @@ dds_entity_t dds_create_writer (dds_entity_t participant_or_publisher, dds_entit
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* Create writer */
 | 
			
		||||
  ddsi_tran_conn_t conn = pub->m_entity.m_domain->gv.xmit_conn;
 | 
			
		||||
  struct dds_writer * const wr = dds_alloc (sizeof (*wr));
 | 
			
		||||
  const dds_entity_t writer = dds_entity_init (&wr->m_entity, &pub->m_entity, DDS_KIND_WRITER, false, wqos, listener, DDS_WRITER_STATUS_MASK);
 | 
			
		||||
  wr->m_topic = tp;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -597,7 +597,7 @@ static void test_create_delete_writer_stress(bool remote_reader)
 | 
			
		|||
  {
 | 
			
		||||
    dds_qset_liveliness(wqos, n % 2 ? DDS_LIVELINESS_AUTOMATIC : DDS_LIVELINESS_MANUAL_BY_PARTICIPANT, DDS_MSECS(n % 3 ? ldur + n : ldur - n) + ((n % 3) == 2 ? 1 : 0));
 | 
			
		||||
    CU_ASSERT_FATAL((writers[n] = dds_create_writer(g_pub_participant, pub_topic, wqos, NULL)) > 0);
 | 
			
		||||
    dds_write(writers[n], &sample);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_write(writers[n], &sample), DDS_RETCODE_OK);
 | 
			
		||||
    if (n % 3 == 2)
 | 
			
		||||
      dds_delete(writers[n]);
 | 
			
		||||
    else if (n % 2)
 | 
			
		||||
| 
						 | 
				
			
			@ -717,7 +717,7 @@ static void test_status_counts(bool remote_reader)
 | 
			
		|||
  CU_ASSERT_EQUAL_FATAL(llstatus.total_count_change, 1);
 | 
			
		||||
 | 
			
		||||
  /* write sample and re-check status counts */
 | 
			
		||||
  dds_write(writer, &sample);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_write(writer, &sample), DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_waitset_wait(waitset, &triggered, 1, DDS_SECS(5)), 1);
 | 
			
		||||
 | 
			
		||||
  dds_get_liveliness_changed_status(reader, &lcstatus);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue