Move all time support to ddsrt
* Move wctime, mtime, etime types to ddsrt * Add ddsrt_time_wallclock * Change ddsrt_time_monontic, elapsed to use mtime, etime types * Remove now, now_mt, now_et * Rename X_to_sec_usec to ddsrt_X_to_sec_usec * add_duration_to_X to ddsrt_X_add_duration (to be in line with the existing ddsrt_time_add_duration) * elimination of ddsrt/timeconv.h, it added more in the way of complications than it did in making things more elegant * rename of q_time.[ch] to ddsi_time.[ch]: that now only deals with DDSI timestamps and durations on the wire Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									1611adc20a
								
							
						
					
					
						commit
						77c3545f5e
					
				
					 65 changed files with 757 additions and 746 deletions
				
			
		| 
						 | 
				
			
			@ -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)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -189,7 +189,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;
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +219,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
 | 
			
		||||
     +-----------+---------------------+----------
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ PREPEND(srcs_ddsi "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    ddsi_deliver_locally.c
 | 
			
		||||
    ddsi_plist.c
 | 
			
		||||
    ddsi_cdrstream.c
 | 
			
		||||
    ddsi_time.c
 | 
			
		||||
    q_addrset.c
 | 
			
		||||
    q_bitset_inlines.c
 | 
			
		||||
    q_bswap.c
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +54,6 @@ PREPEND(srcs_ddsi "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    q_receive.c
 | 
			
		||||
    q_sockwaitset.c
 | 
			
		||||
    q_thread.c
 | 
			
		||||
    q_time.c
 | 
			
		||||
    q_transmit.c
 | 
			
		||||
    q_inverse_uint32_set.c
 | 
			
		||||
    q_whc.c
 | 
			
		||||
| 
						 | 
				
			
			@ -99,6 +99,7 @@ PREPEND(hdrs_private_ddsi "${CMAKE_CURRENT_LIST_DIR}/include/dds/ddsi"
 | 
			
		|||
    ddsi_plist.h
 | 
			
		||||
    ddsi_xqos.h
 | 
			
		||||
    ddsi_cdrstream.h
 | 
			
		||||
    ddsi_time.h
 | 
			
		||||
    q_addrset.h
 | 
			
		||||
    q_bitset.h
 | 
			
		||||
    q_bswap.h
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +124,6 @@ PREPEND(hdrs_private_ddsi "${CMAKE_CURRENT_LIST_DIR}/include/dds/ddsi"
 | 
			
		|||
    q_rtps.h
 | 
			
		||||
    q_sockwaitset.h
 | 
			
		||||
    q_thread.h
 | 
			
		||||
    q_time.h
 | 
			
		||||
    q_transmit.h
 | 
			
		||||
    q_inverse_uint32_set.h
 | 
			
		||||
    q_unused.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,6 @@
 | 
			
		|||
#define _DDSI_BUILTIN_TOPIC_IF_H_
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/ddsi_vendor.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +29,7 @@ struct ddsi_builtin_topic_interface {
 | 
			
		|||
  bool (*builtintopic_is_builtintopic) (const struct ddsi_sertopic *topic, void *arg);
 | 
			
		||||
  bool (*builtintopic_is_visible) (const struct ddsi_guid *guid, nn_vendorid_t vendorid, void *arg);
 | 
			
		||||
  struct ddsi_tkmap_instance * (*builtintopic_get_tkmap_entry) (const struct ddsi_guid *guid, void *arg);
 | 
			
		||||
  void (*builtintopic_write) (const struct entity_common *e, nn_wctime_t timestamp, bool alive, void *arg);
 | 
			
		||||
  void (*builtintopic_write) (const struct entity_common *e, ddsrt_wctime_t timestamp, bool alive, void *arg);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline bool builtintopic_is_visible (const struct ddsi_builtin_topic_interface *btif, const struct ddsi_guid *guid, nn_vendorid_t vendorid) {
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +41,7 @@ inline bool builtintopic_is_builtintopic (const struct ddsi_builtin_topic_interf
 | 
			
		|||
inline struct ddsi_tkmap_instance *builtintopic_get_tkmap_entry (const struct ddsi_builtin_topic_interface *btif, const struct ddsi_guid *guid) {
 | 
			
		||||
  return btif ? btif->builtintopic_get_tkmap_entry (guid, btif->arg) : NULL;
 | 
			
		||||
}
 | 
			
		||||
inline void builtintopic_write (const struct ddsi_builtin_topic_interface *btif, const struct entity_common *e, nn_wctime_t timestamp, bool alive) {
 | 
			
		||||
inline void builtintopic_write (const struct ddsi_builtin_topic_interface *btif, const struct entity_common *e, ddsrt_wctime_t timestamp, bool alive) {
 | 
			
		||||
  if (btif) btif->builtintopic_write (e, timestamp, alive, btif->arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
#define DDSI_DEADLINE_H
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/circlist.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_domaingv.h"
 | 
			
		||||
#include "dds/ddsi/q_xevent.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,7 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef nn_mtime_t (*deadline_missed_cb_t)(void *hc, nn_mtime_t tnow);
 | 
			
		||||
typedef ddsrt_mtime_t (*deadline_missed_cb_t)(void *hc, ddsrt_mtime_t tnow);
 | 
			
		||||
 | 
			
		||||
struct deadline_adm {
 | 
			
		||||
  struct ddsrt_circlist list;               /* linked list for deadline missed */
 | 
			
		||||
| 
						 | 
				
			
			@ -34,25 +34,25 @@ struct deadline_adm {
 | 
			
		|||
 | 
			
		||||
struct deadline_elem {
 | 
			
		||||
  struct ddsrt_circlist_elem e;
 | 
			
		||||
  nn_mtime_t t_deadline;
 | 
			
		||||
  ddsrt_mtime_t t_deadline;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void deadline_init (const struct ddsi_domaingv *gv, struct deadline_adm *deadline_adm, size_t list_offset, size_t elem_offset, deadline_missed_cb_t deadline_missed_cb);
 | 
			
		||||
DDS_EXPORT void deadline_stop (const struct deadline_adm *deadline_adm);
 | 
			
		||||
DDS_EXPORT void deadline_clear (struct deadline_adm *deadline_adm);
 | 
			
		||||
DDS_EXPORT void deadline_fini (const struct deadline_adm *deadline_adm);
 | 
			
		||||
DDS_EXPORT nn_mtime_t deadline_next_missed_locked (struct deadline_adm *deadline_adm, nn_mtime_t tnow, void **instance);
 | 
			
		||||
DDS_EXPORT void deadline_register_instance_real (struct deadline_adm *deadline_adm, struct deadline_elem *elem, nn_mtime_t tprev, nn_mtime_t tnow);
 | 
			
		||||
DDS_EXPORT ddsrt_mtime_t deadline_next_missed_locked (struct deadline_adm *deadline_adm, ddsrt_mtime_t tnow, void **instance);
 | 
			
		||||
DDS_EXPORT void deadline_register_instance_real (struct deadline_adm *deadline_adm, struct deadline_elem *elem, ddsrt_mtime_t tprev, ddsrt_mtime_t tnow);
 | 
			
		||||
DDS_EXPORT void deadline_unregister_instance_real (struct deadline_adm *deadline_adm, struct deadline_elem *elem);
 | 
			
		||||
DDS_EXPORT void deadline_renew_instance_real (struct deadline_adm *deadline_adm, struct deadline_elem *elem);
 | 
			
		||||
 | 
			
		||||
inline void deadline_register_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, nn_mtime_t tnow)
 | 
			
		||||
inline void deadline_register_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  if (deadline_adm->dur != DDS_INFINITY)
 | 
			
		||||
    deadline_register_instance_real (deadline_adm, elem, tnow, tnow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void deadline_reregister_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, nn_mtime_t tnow)
 | 
			
		||||
inline void deadline_reregister_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  if (deadline_adm->dur != DDS_INFINITY)
 | 
			
		||||
    deadline_register_instance_real (deadline_adm, elem, elem->t_deadline, tnow);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -240,7 +240,7 @@ struct ddsi_domaingv {
 | 
			
		|||
 | 
			
		||||
  /* Start time of the DDSI2 service, for logging relative time stamps,
 | 
			
		||||
     should I ever so desire. */
 | 
			
		||||
  nn_wctime_t tstart;
 | 
			
		||||
  ddsrt_wctime_t tstart;
 | 
			
		||||
 | 
			
		||||
  /* Default QoSs for participant, readers and writers (needed for
 | 
			
		||||
     eliminating default values in outgoing discovery packets, and for
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,14 +13,14 @@
 | 
			
		|||
#define DDSI_LIFESPAN_H
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/fibheap.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_domaingv.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef nn_mtime_t (*sample_expired_cb_t)(void *hc, nn_mtime_t tnow);
 | 
			
		||||
typedef ddsrt_mtime_t (*sample_expired_cb_t)(void *hc, ddsrt_mtime_t tnow);
 | 
			
		||||
 | 
			
		||||
struct lifespan_adm {
 | 
			
		||||
  ddsrt_fibheap_t ls_exp_heap;              /* heap for sample expiration (lifespan) */
 | 
			
		||||
| 
						 | 
				
			
			@ -32,12 +32,12 @@ struct lifespan_adm {
 | 
			
		|||
 | 
			
		||||
struct lifespan_fhnode {
 | 
			
		||||
  ddsrt_fibheap_node_t heapnode;
 | 
			
		||||
  nn_mtime_t t_expire;
 | 
			
		||||
  ddsrt_mtime_t t_expire;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void lifespan_init (const struct ddsi_domaingv *gv, struct lifespan_adm *lifespan_adm, size_t fh_offset, size_t fh_node_offset, sample_expired_cb_t sample_expired_cb);
 | 
			
		||||
DDS_EXPORT void lifespan_fini (const struct lifespan_adm *lifespan_adm);
 | 
			
		||||
DDS_EXPORT nn_mtime_t lifespan_next_expired_locked (const struct lifespan_adm *lifespan_adm, nn_mtime_t tnow, void **sample);
 | 
			
		||||
DDS_EXPORT ddsrt_mtime_t lifespan_next_expired_locked (const struct lifespan_adm *lifespan_adm, ddsrt_mtime_t tnow, void **sample);
 | 
			
		||||
DDS_EXPORT void lifespan_register_sample_real (struct lifespan_adm *lifespan_adm, struct lifespan_fhnode *node);
 | 
			
		||||
DDS_EXPORT void lifespan_unregister_sample_real (struct lifespan_adm *lifespan_adm, struct lifespan_fhnode *node);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@
 | 
			
		|||
#ifndef DDSI_PMD_H
 | 
			
		||||
#define DDSI_PMD_H
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ struct receiver_state;
 | 
			
		|||
 | 
			
		||||
void write_pmd_message_guid (struct ddsi_domaingv * const gv, struct ddsi_guid *pp_guid, unsigned pmd_kind);
 | 
			
		||||
void write_pmd_message (struct thread_state1 * const ts1, struct nn_xpack *xp, struct participant *pp, unsigned pmd_kind);
 | 
			
		||||
void handle_pmd_message (const struct receiver_state *rst, nn_wctime_t timestamp, uint32_t statusinfo, const void *vdata, uint32_t len);
 | 
			
		||||
void handle_pmd_message (const struct receiver_state *rst, ddsrt_wctime_t timestamp, uint32_t statusinfo, const void *vdata, uint32_t len);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,8 +20,8 @@
 | 
			
		|||
 | 
			
		||||
/* DDS_EXPORT inline i.c.w. __attributes__((visibility...)) and some compilers: */
 | 
			
		||||
#include "dds/ddsrt/attributes.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_guid.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ struct ddsi_writer_info
 | 
			
		|||
  int32_t ownership_strength;
 | 
			
		||||
  uint64_t iid;
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
  nn_mtime_t lifespan_exp;
 | 
			
		||||
  ddsrt_mtime_t lifespan_exp;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,6 @@
 | 
			
		|||
#define DDSI_SERDATA_H
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/sockets.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_sertopic.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			@ -37,11 +36,11 @@ struct ddsi_serdata {
 | 
			
		|||
  const struct ddsi_sertopic *topic;
 | 
			
		||||
 | 
			
		||||
  /* these get set by generic code after creating the serdata */
 | 
			
		||||
  nn_wctime_t timestamp;
 | 
			
		||||
  ddsrt_wctime_t timestamp;
 | 
			
		||||
  uint32_t statusinfo;
 | 
			
		||||
 | 
			
		||||
  /* FIXME: can I get rid of this one? */
 | 
			
		||||
  nn_mtime_t twrite; /* write time, not source timestamp, set post-throttling */
 | 
			
		||||
  ddsrt_mtime_t twrite; /* write time, not source timestamp, set post-throttling */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Serialised size of sample inclusive of DDSI encoding header
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										44
									
								
								src/core/ddsi/include/dds/ddsi/ddsi_time.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/core/ddsi/include/dds/ddsi/ddsi_time.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DDSI_TIME_H
 | 
			
		||||
#define DDSI_TIME_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/export.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int32_t seconds;
 | 
			
		||||
  uint32_t fraction;
 | 
			
		||||
} ddsi_time_t;
 | 
			
		||||
#define DDSI_TIME_INFINITE ((ddsi_time_t) { INT32_MAX, UINT32_MAX })
 | 
			
		||||
#define DDSI_TIME_INVALID ((ddsi_time_t) { -1, UINT32_MAX })
 | 
			
		||||
 | 
			
		||||
typedef ddsi_time_t ddsi_duration_t;
 | 
			
		||||
 | 
			
		||||
bool ddsi_is_valid_timestamp (ddsi_time_t t);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT ddsi_time_t ddsi_wctime_to_ddsi_time (ddsrt_wctime_t t);
 | 
			
		||||
DDS_EXPORT ddsrt_wctime_t ddsi_wctime_from_ddsi_time (ddsi_time_t x);
 | 
			
		||||
DDS_EXPORT ddsi_duration_t ddsi_to_ddsi_duration (dds_duration_t t);
 | 
			
		||||
DDS_EXPORT dds_duration_t ddsi_from_ddsi_duration (ddsi_duration_t x);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* DDSI_TIME_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -119,9 +119,9 @@ struct wr_prd_match {
 | 
			
		|||
  ddsi_guid_t arbitrary_unacked_reader;
 | 
			
		||||
  nn_count_t next_acknack; /* next acceptable acknack sequence number */
 | 
			
		||||
  nn_count_t next_nackfrag; /* next acceptable nackfrag sequence number */
 | 
			
		||||
  nn_etime_t t_acknack_accepted; /* (local) time an acknack was last accepted */
 | 
			
		||||
  ddsrt_etime_t t_acknack_accepted; /* (local) time an acknack was last accepted */
 | 
			
		||||
  struct nn_lat_estim hb_to_ack_latency;
 | 
			
		||||
  nn_wctime_t hb_to_ack_latency_tlastlog;
 | 
			
		||||
  ddsrt_wctime_t hb_to_ack_latency_tlastlog;
 | 
			
		||||
  uint32_t non_responsive_count;
 | 
			
		||||
  uint32_t rexmit_requests;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -135,12 +135,12 @@ enum pwr_rd_match_syncstate {
 | 
			
		|||
struct pwr_rd_match {
 | 
			
		||||
  ddsrt_avl_node_t avlnode;
 | 
			
		||||
  ddsi_guid_t rd_guid;
 | 
			
		||||
  nn_mtime_t tcreate;
 | 
			
		||||
  ddsrt_mtime_t tcreate;
 | 
			
		||||
  nn_count_t count; /* most recent acknack sequence number */
 | 
			
		||||
  nn_count_t next_heartbeat; /* next acceptable heartbeat (see also add_proxy_writer_to_reader) */
 | 
			
		||||
  nn_wctime_t hb_timestamp; /* time of most recent heartbeat that rescheduled the ack event */
 | 
			
		||||
  nn_etime_t t_heartbeat_accepted; /* (local) time a heartbeat was last accepted */
 | 
			
		||||
  nn_mtime_t t_last_nack; /* (local) time we last sent a NACK */  /* FIXME: probably elapsed time is better */
 | 
			
		||||
  ddsrt_wctime_t hb_timestamp; /* time of most recent heartbeat that rescheduled the ack event */
 | 
			
		||||
  ddsrt_etime_t t_heartbeat_accepted; /* (local) time a heartbeat was last accepted */
 | 
			
		||||
  ddsrt_mtime_t t_last_nack; /* (local) time we last sent a NACK */  /* FIXME: probably elapsed time is better */
 | 
			
		||||
  seqno_t seq_last_nack; /* last seq for which we requested a retransmit */
 | 
			
		||||
  struct xevent *acknack_xevent; /* entry in xevent queue for sending acknacks */
 | 
			
		||||
  enum pwr_rd_match_syncstate in_sync; /* whether in sync with the proxy writer */
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ struct ddsi_tkmap_instance;
 | 
			
		|||
struct entity_common {
 | 
			
		||||
  enum entity_kind kind;
 | 
			
		||||
  ddsi_guid_t guid;
 | 
			
		||||
  nn_wctime_t tupdate; /* timestamp of last update */
 | 
			
		||||
  ddsrt_wctime_t tupdate; /* timestamp of last update */
 | 
			
		||||
  char *name;
 | 
			
		||||
  uint64_t iid;
 | 
			
		||||
  struct ddsi_tkmap_instance *tk;
 | 
			
		||||
| 
						 | 
				
			
			@ -271,8 +271,8 @@ struct writer
 | 
			
		|||
  struct ldur_fhnode *lease_duration; /* fibheap node to keep lease duration for this writer, NULL in case of automatic liveliness with inifite duration  */
 | 
			
		||||
  struct whc *whc; /* WHC tracking history, T-L durability service history + samples by sequence number for retransmit */
 | 
			
		||||
  uint32_t whc_low, whc_high; /* watermarks for WHC in bytes (counting only unack'd data) */
 | 
			
		||||
  nn_etime_t t_rexmit_end; /* time of last 1->0 transition of "retransmitting" */
 | 
			
		||||
  nn_etime_t t_whc_high_upd; /* time "whc_high" was last updated for controlled ramp-up of throughput */
 | 
			
		||||
  ddsrt_etime_t t_rexmit_end; /* time of last 1->0 transition of "retransmitting" */
 | 
			
		||||
  ddsrt_etime_t t_whc_high_upd; /* time "whc_high" was last updated for controlled ramp-up of throughput */
 | 
			
		||||
  int32_t num_reliable_readers; /* number of matching reliable PROXY readers */
 | 
			
		||||
  ddsrt_avl_tree_t readers; /* all matching PROXY readers, see struct wr_prd_match */
 | 
			
		||||
  ddsrt_avl_tree_t local_readers; /* all matching LOCAL readers, see struct wr_rd_match */
 | 
			
		||||
| 
						 | 
				
			
			@ -653,11 +653,11 @@ int writer_set_notalive (struct writer *wr, bool notify);
 | 
			
		|||
/* Set when this proxy participant is not to be announced on the built-in topics yet */
 | 
			
		||||
#define CF_PROXYPP_NO_SPDP                     (1 << 3)
 | 
			
		||||
 | 
			
		||||
void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, uint32_t bes, const struct ddsi_guid *privileged_pp_guid, struct addrset *as_default, struct addrset *as_meta, const struct ddsi_plist *plist, dds_duration_t tlease_dur, nn_vendorid_t vendor, unsigned custom_flags, nn_wctime_t timestamp, seqno_t seq);
 | 
			
		||||
int delete_proxy_participant_by_guid (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit);
 | 
			
		||||
void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, uint32_t bes, const struct ddsi_guid *privileged_pp_guid, struct addrset *as_default, struct addrset *as_meta, const struct ddsi_plist *plist, dds_duration_t tlease_dur, nn_vendorid_t vendor, unsigned custom_flags, ddsrt_wctime_t timestamp, seqno_t seq);
 | 
			
		||||
int delete_proxy_participant_by_guid (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit);
 | 
			
		||||
 | 
			
		||||
int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, nn_wctime_t timestamp);
 | 
			
		||||
int update_proxy_participant_plist (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, nn_wctime_t timestamp);
 | 
			
		||||
int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, ddsrt_wctime_t timestamp);
 | 
			
		||||
int update_proxy_participant_plist (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, ddsrt_wctime_t timestamp);
 | 
			
		||||
void proxy_participant_reassign_lease (struct proxy_participant *proxypp, struct lease *newlease);
 | 
			
		||||
 | 
			
		||||
void purge_proxy_participants (struct ddsi_domaingv *gv, const nn_locator_t *loc, bool delete_from_as_disc);
 | 
			
		||||
| 
						 | 
				
			
			@ -665,8 +665,8 @@ void purge_proxy_participants (struct ddsi_domaingv *gv, const nn_locator_t *loc
 | 
			
		|||
 | 
			
		||||
/* To create a new proxy writer or reader; the proxy participant is
 | 
			
		||||
   determined from the GUID and must exist. */
 | 
			
		||||
  int new_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const struct ddsi_plist *plist, struct nn_dqueue *dqueue, struct xeventq *evq, nn_wctime_t timestamp, seqno_t seq);
 | 
			
		||||
int new_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const struct ddsi_plist *plist, nn_wctime_t timestamp, seqno_t seq
 | 
			
		||||
  int new_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const struct ddsi_plist *plist, struct nn_dqueue *dqueue, struct xeventq *evq, ddsrt_wctime_t timestamp, seqno_t seq);
 | 
			
		||||
int new_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const struct ddsi_plist *plist, ddsrt_wctime_t timestamp, seqno_t seq
 | 
			
		||||
#ifdef DDSI_INCLUDE_SSM
 | 
			
		||||
                      , int favours_ssm
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -677,19 +677,19 @@ int new_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid,
 | 
			
		|||
   reader or writer. Actual deletion is scheduled in the future, when
 | 
			
		||||
   no outstanding references may still exist (determined by checking
 | 
			
		||||
   thread progress, &c.). */
 | 
			
		||||
int delete_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit);
 | 
			
		||||
int delete_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit);
 | 
			
		||||
int delete_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit);
 | 
			
		||||
int delete_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit);
 | 
			
		||||
 | 
			
		||||
void update_proxy_reader (struct proxy_reader *prd, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, nn_wctime_t timestamp);
 | 
			
		||||
void update_proxy_writer (struct proxy_writer *pwr, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, nn_wctime_t timestamp);
 | 
			
		||||
void update_proxy_reader (struct proxy_reader *prd, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, ddsrt_wctime_t timestamp);
 | 
			
		||||
void update_proxy_writer (struct proxy_writer *pwr, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, ddsrt_wctime_t timestamp);
 | 
			
		||||
 | 
			
		||||
void proxy_writer_set_alive_may_unlock (struct proxy_writer *pwr, bool notify);
 | 
			
		||||
int proxy_writer_set_notalive (struct proxy_writer *pwr, bool notify);
 | 
			
		||||
 | 
			
		||||
int new_proxy_group (const struct ddsi_guid *guid, const char *name, const struct dds_qos *xqos, nn_wctime_t timestamp);
 | 
			
		||||
int new_proxy_group (const struct ddsi_guid *guid, const char *name, const struct dds_qos *xqos, ddsrt_wctime_t timestamp);
 | 
			
		||||
 | 
			
		||||
struct entity_index;
 | 
			
		||||
void delete_proxy_group (struct entity_index *entidx, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit);
 | 
			
		||||
void delete_proxy_group (struct entity_index *entidx, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit);
 | 
			
		||||
 | 
			
		||||
/* Call this to empty all address sets of all writers to stop all outgoing traffic, or to
 | 
			
		||||
   rebuild them all (which only makes sense after previously having emptied them all). */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,21 +20,21 @@ struct writer;
 | 
			
		|||
struct whc_state;
 | 
			
		||||
 | 
			
		||||
struct hbcontrol {
 | 
			
		||||
  nn_mtime_t t_of_last_write;
 | 
			
		||||
  nn_mtime_t t_of_last_hb;
 | 
			
		||||
  nn_mtime_t t_of_last_ackhb;
 | 
			
		||||
  nn_mtime_t tsched;
 | 
			
		||||
  ddsrt_mtime_t t_of_last_write;
 | 
			
		||||
  ddsrt_mtime_t t_of_last_hb;
 | 
			
		||||
  ddsrt_mtime_t t_of_last_ackhb;
 | 
			
		||||
  ddsrt_mtime_t tsched;
 | 
			
		||||
  uint32_t hbs_since_last_write;
 | 
			
		||||
  uint32_t last_packetid;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void writer_hbcontrol_init (struct hbcontrol *hbc);
 | 
			
		||||
int64_t writer_hbcontrol_intv (const struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow);
 | 
			
		||||
void writer_hbcontrol_note_asyncwrite (struct writer *wr, nn_mtime_t tnow);
 | 
			
		||||
int writer_hbcontrol_ack_required (const struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow);
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_piggyback (struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow, uint32_t packetid, int *hbansreq);
 | 
			
		||||
int writer_hbcontrol_must_send (const struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow);
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_create_heartbeat (struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow, int hbansreq, int issync);
 | 
			
		||||
int64_t writer_hbcontrol_intv (const struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow);
 | 
			
		||||
void writer_hbcontrol_note_asyncwrite (struct writer *wr, ddsrt_mtime_t tnow);
 | 
			
		||||
int writer_hbcontrol_ack_required (const struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow);
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_piggyback (struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow, uint32_t packetid, int *hbansreq);
 | 
			
		||||
int writer_hbcontrol_must_send (const struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow);
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_create_heartbeat (struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow, int hbansreq, int issync);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,6 @@
 | 
			
		|||
#include "dds/ddsrt/atomics.h"
 | 
			
		||||
#include "dds/ddsrt/fibheap.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +28,7 @@ struct ddsi_domaingv; /* FIXME: make a special for the lease admin */
 | 
			
		|||
struct lease {
 | 
			
		||||
  ddsrt_fibheap_node_t heapnode;
 | 
			
		||||
  ddsrt_fibheap_node_t pp_heapnode;
 | 
			
		||||
  nn_etime_t tsched;            /* access guarded by leaseheap_lock */
 | 
			
		||||
  ddsrt_etime_t tsched;            /* access guarded by leaseheap_lock */
 | 
			
		||||
  ddsrt_atomic_uint64_t tend;   /* really an nn_etime_t */
 | 
			
		||||
  dds_duration_t tdur;          /* constant (renew depends on it) */
 | 
			
		||||
  struct entity_common *entity; /* constant */
 | 
			
		||||
| 
						 | 
				
			
			@ -39,14 +38,14 @@ int compare_lease_tsched (const void *va, const void *vb);
 | 
			
		|||
int compare_lease_tdur (const void *va, const void *vb);
 | 
			
		||||
void lease_management_init (struct ddsi_domaingv *gv);
 | 
			
		||||
void lease_management_term (struct ddsi_domaingv *gv);
 | 
			
		||||
struct lease *lease_new (nn_etime_t texpire, int64_t tdur, struct entity_common *e);
 | 
			
		||||
struct lease *lease_new (ddsrt_etime_t texpire, int64_t tdur, struct entity_common *e);
 | 
			
		||||
struct lease *lease_clone (const struct lease *l);
 | 
			
		||||
void lease_register (struct lease *l);
 | 
			
		||||
void lease_unregister (struct lease *l);
 | 
			
		||||
void lease_free (struct lease *l);
 | 
			
		||||
void lease_renew (struct lease *l, nn_etime_t tnow);
 | 
			
		||||
void lease_set_expiry (struct lease *l, nn_etime_t when);
 | 
			
		||||
int64_t check_and_handle_lease_expiration (struct ddsi_domaingv *gv, nn_etime_t tnow);
 | 
			
		||||
void lease_renew (struct lease *l, ddsrt_etime_t tnow);
 | 
			
		||||
void lease_set_expiry (struct lease *l, ddsrt_etime_t when);
 | 
			
		||||
int64_t check_and_handle_lease_expiration (struct ddsi_domaingv *gv, ddsrt_etime_t tnow);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@
 | 
			
		|||
#include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/log.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_time.h"
 | 
			
		||||
#include "dds/ddsrt/rusage.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ extern "C" {
 | 
			
		|||
#define LOG_THREAD_CPUTIME(logcfg, guard)                                \
 | 
			
		||||
    do {                                                                 \
 | 
			
		||||
        if ((logcfg)->c.mask & DDS_LC_TIMING) {                          \
 | 
			
		||||
            nn_mtime_t tnowlt = now_mt();                                \
 | 
			
		||||
            ddsrt_mtime_t tnowlt = ddsrt_time_monotonic ();              \
 | 
			
		||||
            if (tnowlt.v >= (guard).v) {                                 \
 | 
			
		||||
                ddsrt_rusage_t usage;                                    \
 | 
			
		||||
                if (ddsrt_getrusage(DDSRT_RUSAGE_THREAD, &usage) == 0) { \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
#define Q_PCAP_H
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -23,8 +23,8 @@ struct msghdr;
 | 
			
		|||
 | 
			
		||||
FILE * new_pcap_file (const struct ddsrt_log_cfg *logcfg, const char *name);
 | 
			
		||||
 | 
			
		||||
void write_pcap_received (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const struct sockaddr_storage *src, const struct sockaddr_storage *dst, unsigned char *buf, size_t sz);
 | 
			
		||||
void write_pcap_sent (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const struct sockaddr_storage *src,
 | 
			
		||||
void write_pcap_received (struct ddsi_domaingv *gv, ddsrt_wctime_t tstamp, const struct sockaddr_storage *src, const struct sockaddr_storage *dst, unsigned char *buf, size_t sz);
 | 
			
		||||
void write_pcap_sent (struct ddsi_domaingv *gv, ddsrt_wctime_t tstamp, const struct sockaddr_storage *src,
 | 
			
		||||
  const ddsrt_msghdr_t *hdr, size_t sz);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@
 | 
			
		|||
#include "dds/ddsi/q_feature_check.h"
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/q_rtps.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -120,8 +120,8 @@ struct nn_rsample_info {
 | 
			
		|||
  struct proxy_writer *pwr;
 | 
			
		||||
  uint32_t size;
 | 
			
		||||
  uint32_t fragsize;
 | 
			
		||||
  nn_wctime_t timestamp;
 | 
			
		||||
  nn_wctime_t reception_timestamp; /* OpenSplice extension -- but we get it essentially for free, so why not? */
 | 
			
		||||
  ddsrt_wctime_t timestamp;
 | 
			
		||||
  ddsrt_wctime_t reception_timestamp; /* OpenSplice extension -- but we get it essentially for free, so why not? */
 | 
			
		||||
  unsigned statusinfo: 2;       /* just the two defined bits from the status info */
 | 
			
		||||
  unsigned pt_wr_info_zoff: 16; /* PrismTech writer info offset */
 | 
			
		||||
  unsigned bswap: 1;            /* so we can extract well formatted writer info quicker */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,71 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#ifndef NN_TIME_H
 | 
			
		||||
#define NN_TIME_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/export.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int32_t seconds;
 | 
			
		||||
  uint32_t fraction;
 | 
			
		||||
} ddsi_time_t;
 | 
			
		||||
#define DDSI_TIME_INFINITE ((ddsi_time_t) { INT32_MAX, UINT32_MAX })
 | 
			
		||||
#define DDSI_TIME_INVALID ((ddsi_time_t) { -1, UINT32_MAX })
 | 
			
		||||
 | 
			
		||||
typedef ddsi_time_t ddsi_duration_t;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int64_t v;
 | 
			
		||||
} nn_mtime_t;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int64_t v;
 | 
			
		||||
} nn_wctime_t;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  int64_t v;
 | 
			
		||||
} nn_etime_t;
 | 
			
		||||
 | 
			
		||||
#define NN_MTIME_NEVER ((nn_mtime_t) { DDS_NEVER })
 | 
			
		||||
#define NN_WCTIME_NEVER ((nn_wctime_t) { DDS_NEVER })
 | 
			
		||||
#define NN_ETIME_NEVER ((nn_etime_t) { DDS_NEVER })
 | 
			
		||||
#define NN_WCTIME_INVALID ((nn_wctime_t) { INT64_MIN })
 | 
			
		||||
 | 
			
		||||
int valid_ddsi_timestamp (ddsi_time_t t);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT nn_wctime_t now (void);       /* wall clock time */
 | 
			
		||||
DDS_EXPORT nn_mtime_t now_mt (void);     /* monotonic time */
 | 
			
		||||
DDS_EXPORT nn_etime_t now_et (void);     /* elapsed time */
 | 
			
		||||
DDS_EXPORT void mtime_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, nn_mtime_t t);
 | 
			
		||||
DDS_EXPORT void wctime_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, nn_wctime_t t);
 | 
			
		||||
DDS_EXPORT void etime_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, nn_etime_t t);
 | 
			
		||||
DDS_EXPORT nn_mtime_t mtime_round_up (nn_mtime_t t, int64_t round);
 | 
			
		||||
DDS_EXPORT nn_mtime_t add_duration_to_mtime (nn_mtime_t t, int64_t d);
 | 
			
		||||
DDS_EXPORT nn_wctime_t add_duration_to_wctime (nn_wctime_t t, int64_t d);
 | 
			
		||||
DDS_EXPORT nn_etime_t add_duration_to_etime (nn_etime_t t, int64_t d);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT ddsi_time_t nn_wctime_to_ddsi_time (nn_wctime_t t);
 | 
			
		||||
DDS_EXPORT nn_wctime_t nn_wctime_from_ddsi_time (ddsi_time_t x);
 | 
			
		||||
DDS_EXPORT ddsi_duration_t nn_to_ddsi_duration (int64_t t);
 | 
			
		||||
DDS_EXPORT int64_t nn_from_ddsi_duration (ddsi_duration_t x);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* NN_TIME_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
#define Q_WHC_H
 | 
			
		||||
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +30,7 @@ struct whc_borrowed_sample {
 | 
			
		|||
  struct ddsi_serdata *serdata;
 | 
			
		||||
  struct ddsi_plist *plist;
 | 
			
		||||
  bool unacked;
 | 
			
		||||
  nn_mtime_t last_rexmit_ts;
 | 
			
		||||
  ddsrt_mtime_t last_rexmit_ts;
 | 
			
		||||
  unsigned rexmit_count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +73,7 @@ typedef void (*whc_free_t)(struct whc *whc);
 | 
			
		|||
   reliable readers that have not acknowledged all data */
 | 
			
		||||
/* max_drop_seq must go soon, it's way too ugly. */
 | 
			
		||||
/* plist may be NULL or ddsrt_malloc'd, WHC takes ownership of plist */
 | 
			
		||||
typedef int (*whc_insert_t)(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);
 | 
			
		||||
typedef int (*whc_insert_t)(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);
 | 
			
		||||
typedef uint32_t (*whc_downgrade_to_volatile_t)(struct whc *whc, struct whc_state *st);
 | 
			
		||||
typedef uint32_t (*whc_remove_acked_messages_t)(struct whc *whc, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list);
 | 
			
		||||
typedef void (*whc_free_deferred_free_list_t)(struct whc *whc, struct whc_node *deferred_free_list);
 | 
			
		||||
| 
						 | 
				
			
			@ -121,7 +121,7 @@ inline bool whc_sample_iter_borrow_next (struct whc_sample_iter *it, struct whc_
 | 
			
		|||
inline void whc_free (struct whc *whc) {
 | 
			
		||||
  whc->ops->free (whc);
 | 
			
		||||
}
 | 
			
		||||
inline int whc_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) {
 | 
			
		||||
inline int whc_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) {
 | 
			
		||||
  return whc->ops->insert (whc, max_drop_seq, seq, exp, plist, serdata, tk);
 | 
			
		||||
}
 | 
			
		||||
inline unsigned whc_downgrade_to_volatile (struct whc *whc, struct whc_state *st) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,16 +60,16 @@ DDS_EXPORT int qxev_msg_rexmit_wrlock_held (struct xeventq *evq, struct nn_xmsg
 | 
			
		|||
/* All of the following lock EVQ for the duration of the operation */
 | 
			
		||||
DDS_EXPORT void delete_xevent (struct xevent *ev);
 | 
			
		||||
DDS_EXPORT void delete_xevent_callback (struct xevent *ev);
 | 
			
		||||
DDS_EXPORT int resched_xevent_if_earlier (struct xevent *ev, nn_mtime_t tsched);
 | 
			
		||||
DDS_EXPORT int resched_xevent_if_earlier (struct xevent *ev, ddsrt_mtime_t tsched);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_heartbeat (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *wr_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_acknack (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *pwr_guid, const ddsi_guid_t *rd_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_spdp (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *pp_guid, const ddsi_guid_t *proxypp_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_pmd_update (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *pp_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_delete_writer (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_heartbeat (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *wr_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_acknack (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *pwr_guid, const ddsi_guid_t *rd_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_spdp (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *pp_guid, const ddsi_guid_t *proxypp_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_pmd_update (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *pp_guid);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_delete_writer (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *guid);
 | 
			
		||||
 | 
			
		||||
/* cb will be called with now = NEVER if the event is still enqueued when when xeventq_free starts cleaning up */
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_callback (struct xeventq *evq, nn_mtime_t tsched, void (*cb) (struct xevent *xev, void *arg, nn_mtime_t now), void *arg);
 | 
			
		||||
DDS_EXPORT struct xevent *qxev_callback (struct xeventq *evq, ddsrt_mtime_t tsched, void (*cb) (struct xevent *xev, void *arg, ddsrt_mtime_t now), void *arg);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ void nn_xmsg_shrink (struct nn_xmsg *m, struct nn_xmsg_marker marker, size_t sz)
 | 
			
		|||
void nn_xmsg_serdata (struct nn_xmsg *m, struct ddsi_serdata *serdata, size_t off, size_t len);
 | 
			
		||||
void nn_xmsg_submsg_setnext (struct nn_xmsg *msg, struct nn_xmsg_marker marker);
 | 
			
		||||
void nn_xmsg_submsg_init (struct nn_xmsg *msg, struct nn_xmsg_marker marker, SubmessageKind_t smkind);
 | 
			
		||||
void nn_xmsg_add_timestamp (struct nn_xmsg *m, nn_wctime_t t);
 | 
			
		||||
void nn_xmsg_add_timestamp (struct nn_xmsg *m, ddsrt_wctime_t t);
 | 
			
		||||
void nn_xmsg_add_entityid (struct nn_xmsg * m);
 | 
			
		||||
void *nn_xmsg_addpar (struct nn_xmsg *m, nn_parameterid_t pid, size_t len);
 | 
			
		||||
void nn_xmsg_addpar_keyhash (struct nn_xmsg *m, const struct ddsi_serdata *serdata);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,22 +12,22 @@
 | 
			
		|||
#include <stddef.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include "dds/ddsrt/circlist.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_deadline.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_xevent.h"
 | 
			
		||||
 | 
			
		||||
static void instance_deadline_missed_cb (struct xevent *xev, void *varg, nn_mtime_t tnow)
 | 
			
		||||
static void instance_deadline_missed_cb (struct xevent *xev, void *varg, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct deadline_adm * const deadline_adm = varg;
 | 
			
		||||
  nn_mtime_t next_valid = deadline_adm->deadline_missed_cb((char *)deadline_adm - deadline_adm->list_offset, tnow);
 | 
			
		||||
  ddsrt_mtime_t next_valid = deadline_adm->deadline_missed_cb((char *)deadline_adm - deadline_adm->list_offset, tnow);
 | 
			
		||||
  resched_xevent_if_earlier (xev, next_valid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Gets the instance from the list in deadline admin that has the earliest missed deadline and
 | 
			
		||||
 * removes the instance element from the list. If no more instances with missed deadline exist
 | 
			
		||||
 * in the list, the deadline (nn_mtime_t) for the first instance to 'expire' is returned. If the
 | 
			
		||||
 * list is empty, NN_MTIME_NEVER is returned */
 | 
			
		||||
nn_mtime_t deadline_next_missed_locked (struct deadline_adm *deadline_adm, nn_mtime_t tnow, void **instance)
 | 
			
		||||
 * list is empty, DDSRT_MTIME_NEVER is returned */
 | 
			
		||||
ddsrt_mtime_t deadline_next_missed_locked (struct deadline_adm *deadline_adm, ddsrt_mtime_t tnow, void **instance)
 | 
			
		||||
{
 | 
			
		||||
  struct deadline_elem *elem = NULL;
 | 
			
		||||
  if (!ddsrt_circlist_isempty (&deadline_adm->list))
 | 
			
		||||
| 
						 | 
				
			
			@ -39,18 +39,18 @@ nn_mtime_t deadline_next_missed_locked (struct deadline_adm *deadline_adm, nn_mt
 | 
			
		|||
      ddsrt_circlist_remove (&deadline_adm->list, &elem->e);
 | 
			
		||||
      if (instance != NULL)
 | 
			
		||||
        *instance = (char *)elem - deadline_adm->elem_offset;
 | 
			
		||||
      return (nn_mtime_t) { 0 };
 | 
			
		||||
      return (ddsrt_mtime_t) { 0 };
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (instance != NULL)
 | 
			
		||||
    *instance = NULL;
 | 
			
		||||
  return (elem != NULL) ? elem->t_deadline : NN_MTIME_NEVER;
 | 
			
		||||
  return (elem != NULL) ? elem->t_deadline : DDSRT_MTIME_NEVER;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void deadline_init (const struct ddsi_domaingv *gv, struct deadline_adm *deadline_adm, size_t list_offset, size_t elem_offset, deadline_missed_cb_t deadline_missed_cb)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_circlist_init (&deadline_adm->list);
 | 
			
		||||
  deadline_adm->evt = qxev_callback (gv->xevents, NN_MTIME_NEVER, instance_deadline_missed_cb, deadline_adm);
 | 
			
		||||
  deadline_adm->evt = qxev_callback (gv->xevents, DDSRT_MTIME_NEVER, instance_deadline_missed_cb, deadline_adm);
 | 
			
		||||
  deadline_adm->deadline_missed_cb = deadline_missed_cb;
 | 
			
		||||
  deadline_adm->list_offset = list_offset;
 | 
			
		||||
  deadline_adm->elem_offset = elem_offset;
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ void deadline_stop (const struct deadline_adm *deadline_adm)
 | 
			
		|||
 | 
			
		||||
void deadline_clear (struct deadline_adm *deadline_adm)
 | 
			
		||||
{
 | 
			
		||||
  while ((deadline_next_missed_locked (deadline_adm, NN_MTIME_NEVER, NULL)).v == 0);
 | 
			
		||||
  while ((deadline_next_missed_locked (deadline_adm, DDSRT_MTIME_NEVER, NULL)).v == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void deadline_fini (const struct deadline_adm *deadline_adm)
 | 
			
		||||
| 
						 | 
				
			
			@ -72,10 +72,10 @@ void deadline_fini (const struct deadline_adm *deadline_adm)
 | 
			
		|||
  (void) deadline_adm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern inline void deadline_register_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, nn_mtime_t tnow);
 | 
			
		||||
extern inline void deadline_reregister_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, nn_mtime_t tnow);
 | 
			
		||||
extern inline void deadline_register_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, ddsrt_mtime_t tnow);
 | 
			
		||||
extern inline void deadline_reregister_instance_locked (struct deadline_adm *deadline_adm, struct deadline_elem *elem, ddsrt_mtime_t tnow);
 | 
			
		||||
 | 
			
		||||
void deadline_register_instance_real (struct deadline_adm *deadline_adm, struct deadline_elem *elem, nn_mtime_t tprev, nn_mtime_t tnow)
 | 
			
		||||
void deadline_register_instance_real (struct deadline_adm *deadline_adm, struct deadline_elem *elem, ddsrt_mtime_t tprev, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_circlist_append(&deadline_adm->list, &elem->e);
 | 
			
		||||
  elem->t_deadline = (tprev.v + deadline_adm->dur >= tnow.v) ? tprev : tnow;
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ void deadline_unregister_instance_real (struct deadline_adm *deadline_adm, struc
 | 
			
		|||
   * this removed element expires. Only remove the element from the
 | 
			
		||||
   * deadline list */
 | 
			
		||||
 | 
			
		||||
  elem->t_deadline = NN_MTIME_NEVER;
 | 
			
		||||
  elem->t_deadline = DDSRT_MTIME_NEVER;
 | 
			
		||||
  ddsrt_circlist_remove(&deadline_adm->list, &elem->e);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ void deadline_renew_instance_real (struct deadline_adm *deadline_adm, struct dea
 | 
			
		|||
     the callback the deadline (which will be the updated value) will be
 | 
			
		||||
     checked for expiry */
 | 
			
		||||
  ddsrt_circlist_remove(&deadline_adm->list, &elem->e);
 | 
			
		||||
  elem->t_deadline = now_mt();
 | 
			
		||||
  elem->t_deadline = ddsrt_time_monotonic();
 | 
			
		||||
  elem->t_deadline.v += deadline_adm->dur;
 | 
			
		||||
  ddsrt_circlist_append(&deadline_adm->list, &elem->e);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,6 @@
 | 
			
		|||
#include "dds/ddsrt/heap.h"
 | 
			
		||||
#include "dds/ddsrt/fibheap.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_lifespan.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_xevent.h"
 | 
			
		||||
 | 
			
		||||
static int compare_lifespan_texp (const void *va, const void *vb)
 | 
			
		||||
| 
						 | 
				
			
			@ -26,33 +25,33 @@ static int compare_lifespan_texp (const void *va, const void *vb)
 | 
			
		|||
 | 
			
		||||
const ddsrt_fibheap_def_t lifespan_fhdef = DDSRT_FIBHEAPDEF_INITIALIZER(offsetof (struct lifespan_fhnode, heapnode), compare_lifespan_texp);
 | 
			
		||||
 | 
			
		||||
static void lifespan_rhc_node_exp (struct xevent *xev, void *varg, nn_mtime_t tnow)
 | 
			
		||||
static void lifespan_rhc_node_exp (struct xevent *xev, void *varg, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct lifespan_adm * const lifespan_adm = varg;
 | 
			
		||||
  nn_mtime_t next_valid = lifespan_adm->sample_expired_cb((char *)lifespan_adm - lifespan_adm->fh_offset, tnow);
 | 
			
		||||
  ddsrt_mtime_t next_valid = lifespan_adm->sample_expired_cb((char *)lifespan_adm - lifespan_adm->fh_offset, tnow);
 | 
			
		||||
  resched_xevent_if_earlier (xev, next_valid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Gets the sample from the fibheap in lifespan admin that was expired first. If no more
 | 
			
		||||
 * expired samples exist in the fibheap, the expiry time (nn_mtime_t) for the next sample to
 | 
			
		||||
 * expire is returned. If the fibheap contains no more samples, NN_MTIME_NEVER is returned */
 | 
			
		||||
nn_mtime_t lifespan_next_expired_locked (const struct lifespan_adm *lifespan_adm, nn_mtime_t tnow, void **sample)
 | 
			
		||||
 * expire is returned. If the fibheap contains no more samples, DDSRT_MTIME_NEVER is returned */
 | 
			
		||||
ddsrt_mtime_t lifespan_next_expired_locked (const struct lifespan_adm *lifespan_adm, ddsrt_mtime_t tnow, void **sample)
 | 
			
		||||
{
 | 
			
		||||
  struct lifespan_fhnode *node;
 | 
			
		||||
  if ((node = ddsrt_fibheap_min(&lifespan_fhdef, &lifespan_adm->ls_exp_heap)) != NULL && node->t_expire.v <= tnow.v)
 | 
			
		||||
  {
 | 
			
		||||
    *sample = (char *)node - lifespan_adm->fhn_offset;
 | 
			
		||||
    return (nn_mtime_t) { 0 };
 | 
			
		||||
    return (ddsrt_mtime_t) { 0 };
 | 
			
		||||
  }
 | 
			
		||||
  *sample = NULL;
 | 
			
		||||
  return (node != NULL) ? node->t_expire : NN_MTIME_NEVER;
 | 
			
		||||
  return (node != NULL) ? node->t_expire : DDSRT_MTIME_NEVER;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lifespan_init (const struct ddsi_domaingv *gv, struct lifespan_adm *lifespan_adm, size_t fh_offset, size_t fh_node_offset, sample_expired_cb_t sample_expired_cb)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_fibheap_init (&lifespan_fhdef, &lifespan_adm->ls_exp_heap);
 | 
			
		||||
  lifespan_adm->evt = qxev_callback (gv->xevents, NN_MTIME_NEVER, lifespan_rhc_node_exp, lifespan_adm);
 | 
			
		||||
  lifespan_adm->evt = qxev_callback (gv->xevents, DDSRT_MTIME_NEVER, lifespan_rhc_node_exp, lifespan_adm);
 | 
			
		||||
  lifespan_adm->sample_expired_cb = sample_expired_cb;
 | 
			
		||||
  lifespan_adm->fh_offset = fh_offset;
 | 
			
		||||
  lifespan_adm->fhn_offset = fh_node_offset;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,7 @@
 | 
			
		|||
#include "dds/ddsi/q_bswap.h"
 | 
			
		||||
#include "dds/ddsi/q_unused.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_plist.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_time.h"
 | 
			
		||||
#include "dds/ddsi/q_xmsg.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_vendor.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_udp.h" /* nn_mc4gen_address_t */
 | 
			
		||||
| 
						 | 
				
			
			@ -215,7 +215,7 @@ static dds_return_t deser_reliability (void * __restrict dst, size_t * __restric
 | 
			
		|||
  if (validate_external_duration (&mbt) < 0)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  x->kind = (enum dds_reliability_kind) (kind - 1);
 | 
			
		||||
  x->max_blocking_time = nn_from_ddsi_duration (mbt);
 | 
			
		||||
  x->max_blocking_time = ddsi_from_ddsi_duration (mbt);
 | 
			
		||||
  *dstoff += sizeof (*x);
 | 
			
		||||
  *flagset->present |= flag;
 | 
			
		||||
  return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -226,7 +226,7 @@ static dds_return_t ser_reliability (struct nn_xmsg *xmsg, nn_parameterid_t pid,
 | 
			
		|||
  DDSRT_STATIC_ASSERT (DDS_EXTERNAL_RELIABILITY_BEST_EFFORT == 1 && DDS_EXTERNAL_RELIABILITY_RELIABLE == 2 &&
 | 
			
		||||
                       DDS_RELIABILITY_BEST_EFFORT == 0 && DDS_RELIABILITY_RELIABLE == 1);
 | 
			
		||||
  dds_reliability_qospolicy_t const * const x = deser_generic_src (src, &srcoff, alignof (dds_reliability_qospolicy_t));
 | 
			
		||||
  ddsi_duration_t mbt = nn_to_ddsi_duration (x->max_blocking_time);
 | 
			
		||||
  ddsi_duration_t mbt = ddsi_to_ddsi_duration (x->max_blocking_time);
 | 
			
		||||
  uint32_t * const p = nn_xmsg_addpar (xmsg, pid, 3 * sizeof (uint32_t));
 | 
			
		||||
  p[0] = 1 + (uint32_t) x->kind;
 | 
			
		||||
  p[1] = (uint32_t) mbt.seconds;
 | 
			
		||||
| 
						 | 
				
			
			@ -551,7 +551,7 @@ static dds_return_t deser_generic (void * __restrict dst, size_t * __restrict ds
 | 
			
		|||
            goto fail;
 | 
			
		||||
          if (validate_external_duration (&tmp))
 | 
			
		||||
            goto fail;
 | 
			
		||||
          x[i] = nn_from_ddsi_duration (tmp);
 | 
			
		||||
          x[i] = ddsi_from_ddsi_duration (tmp);
 | 
			
		||||
        }
 | 
			
		||||
        *dstoff += cnt * sizeof (*x);
 | 
			
		||||
        break;
 | 
			
		||||
| 
						 | 
				
			
			@ -796,7 +796,7 @@ static dds_return_t ser_generic_embeddable (char * const data, size_t *dstoff, c
 | 
			
		|||
        uint32_t * const p = ser_generic_align4 (data, dstoff);
 | 
			
		||||
        for (uint32_t i = 0; i < cnt; i++)
 | 
			
		||||
        {
 | 
			
		||||
          ddsi_duration_t tmp = nn_to_ddsi_duration (x[i]);
 | 
			
		||||
          ddsi_duration_t tmp = ddsi_to_ddsi_duration (x[i]);
 | 
			
		||||
          p[2 * i + 0] = (uint32_t) tmp.seconds;
 | 
			
		||||
          p[2 * i + 1] = tmp.fraction;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,6 @@
 | 
			
		|||
#include "dds/ddsi/q_protocol.h"
 | 
			
		||||
#include "dds/ddsi/q_radmin.h"
 | 
			
		||||
#include "dds/ddsi/q_rtps.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_transmit.h"
 | 
			
		||||
#include "dds/ddsi/q_xmsg.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +56,7 @@ void write_pmd_message_guid (struct ddsi_domaingv * const gv, struct ddsi_guid *
 | 
			
		|||
  else
 | 
			
		||||
  {
 | 
			
		||||
    if ((lease = ddsrt_atomic_ldvoidp (&pp->minl_man)) != NULL)
 | 
			
		||||
      lease_renew (lease, now_et());
 | 
			
		||||
      lease_renew (lease, ddsrt_time_elapsed());
 | 
			
		||||
    write_pmd_message (ts1, NULL, pp, pmd_kind);
 | 
			
		||||
  }
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +92,7 @@ void write_pmd_message (struct thread_state1 * const ts1, struct nn_xpack *xp, s
 | 
			
		|||
    .keysize = 16
 | 
			
		||||
  };
 | 
			
		||||
  serdata = ddsi_serdata_from_sample (gv->rawcdr_topic, SDK_DATA, &raw);
 | 
			
		||||
  serdata->timestamp = now ();
 | 
			
		||||
  serdata->timestamp = ddsrt_time_wallclock ();
 | 
			
		||||
 | 
			
		||||
  tk = ddsi_tkmap_lookup_instance_ref (gv->m_tkmap, serdata);
 | 
			
		||||
  write_sample_nogc (ts1, xp, wr, serdata, tk);
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +100,7 @@ void write_pmd_message (struct thread_state1 * const ts1, struct nn_xpack *xp, s
 | 
			
		|||
#undef PMD_DATA_LENGTH
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void handle_pmd_message (const struct receiver_state *rst, nn_wctime_t timestamp, uint32_t statusinfo, const void *vdata, uint32_t len)
 | 
			
		||||
void handle_pmd_message (const struct receiver_state *rst, ddsrt_wctime_t timestamp, uint32_t statusinfo, const void *vdata, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
  const struct CDRHeader *data = vdata; /* built-ins not deserialized (yet) */
 | 
			
		||||
  const int bswap = (data->identifier == CDR_LE) ^ (DDSRT_ENDIAN == DDSRT_LITTLE_ENDIAN);
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +138,7 @@ void handle_pmd_message (const struct receiver_state *rst, nn_wctime_t timestamp
 | 
			
		|||
                 (l = ddsrt_atomic_ldvoidp (&proxypp->minl_man)) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          /* Renew lease for entity with shortest manual-by-participant lease */
 | 
			
		||||
          lease_renew (l, now_et ());
 | 
			
		||||
          lease_renew (l, ddsrt_time_elapsed ());
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@
 | 
			
		|||
 | 
			
		||||
#include "dds/ddsrt/heap.h"
 | 
			
		||||
#include "dds/ddsrt/sync.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsrt/threads.h"
 | 
			
		||||
#include "dds/ddsrt/hopscotch.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +21,6 @@
 | 
			
		|||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_log.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_unused.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_domaingv.h" /* for mattr, cattr */
 | 
			
		||||
#include "dds/ddsi/q_receive.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ static uint32_t threadmon_thread (struct ddsi_threadmon *sl)
 | 
			
		|||
     reason why it has to be 100ms), regardless of the lease settings.
 | 
			
		||||
     Note: can't trust sl->self, may have been scheduled before the
 | 
			
		||||
     assignment. */
 | 
			
		||||
  nn_mtime_t tlast = { 0 };
 | 
			
		||||
  ddsrt_mtime_t tlast = { 0 };
 | 
			
		||||
  bool was_alive = true;
 | 
			
		||||
  for (uint32_t i = 0; i < thread_states.nthreads; i++)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +80,7 @@ static uint32_t threadmon_thread (struct ddsi_threadmon *sl)
 | 
			
		|||
    /* Check progress only if enough time has passed: there is no
 | 
			
		||||
       guarantee that os_cond_timedwait wont ever return early, and we
 | 
			
		||||
       do want to avoid spurious warnings. */
 | 
			
		||||
    nn_mtime_t tnow = now_mt ();
 | 
			
		||||
    ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
    if (tnow.v < tlast.v)
 | 
			
		||||
      continue;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										70
									
								
								src/core/ddsi/src/ddsi_time.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/core/ddsi/src/ddsi_time.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,70 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_time.h"
 | 
			
		||||
 | 
			
		||||
bool ddsi_is_valid_timestamp (ddsi_time_t t)
 | 
			
		||||
{
 | 
			
		||||
  return t.seconds != DDSI_TIME_INVALID.seconds && t.fraction != DDSI_TIME_INVALID.fraction;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ddsi_time_t to_ddsi_time (int64_t t)
 | 
			
		||||
{
 | 
			
		||||
  if (t == DDS_NEVER)
 | 
			
		||||
    return DDSI_TIME_INFINITE;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* ceiling(ns * 2^32/10^9) -- can't change the ceiling to round-to-nearest
 | 
			
		||||
       because that would break backwards compatibility, but round-to-nearest
 | 
			
		||||
       of the inverse is correctly rounded anyway, so it shouldn't ever matter. */
 | 
			
		||||
    ddsi_time_t x;
 | 
			
		||||
    int ns = (int) (t % DDS_NSECS_IN_SEC);
 | 
			
		||||
    x.seconds = (int) (t / DDS_NSECS_IN_SEC);
 | 
			
		||||
    x.fraction = (unsigned) (((DDS_NSECS_IN_SEC-1) + ((int64_t) ns << 32)) / DDS_NSECS_IN_SEC);
 | 
			
		||||
    return x;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ddsi_time_t ddsi_wctime_to_ddsi_time (ddsrt_wctime_t t)
 | 
			
		||||
{
 | 
			
		||||
  return to_ddsi_time (t.v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t from_ddsi_time (ddsi_time_t x)
 | 
			
		||||
{
 | 
			
		||||
  if (x.seconds == DDSI_TIME_INFINITE.seconds && x.fraction == DDSI_TIME_INFINITE.fraction)
 | 
			
		||||
    return DDS_NEVER;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* Round-to-nearest conversion of DDSI time fraction to nanoseconds */
 | 
			
		||||
    int ns = (int) (((int64_t) 2147483648u + (int64_t) x.fraction * DDS_NSECS_IN_SEC) >> 32);
 | 
			
		||||
    return x.seconds * DDS_NSECS_IN_SEC + ns;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ddsrt_wctime_t ddsi_wctime_from_ddsi_time (ddsi_time_t x)
 | 
			
		||||
{
 | 
			
		||||
  return (ddsrt_wctime_t) { from_ddsi_time (x) };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ddsi_duration_t ddsi_to_ddsi_duration (dds_duration_t x)
 | 
			
		||||
{
 | 
			
		||||
  return to_ddsi_time (x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_duration_t ddsi_from_ddsi_duration (ddsi_duration_t x)
 | 
			
		||||
{
 | 
			
		||||
  return from_ddsi_time (x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ static ssize_t ddsi_udp_conn_read (ddsi_tran_conn_t conn, unsigned char * buf, s
 | 
			
		|||
      socklen_t dest_len = sizeof (dest);
 | 
			
		||||
      if (ddsrt_getsockname (((ddsi_udp_conn_t) conn)->m_sock, (struct sockaddr *) &dest, &dest_len) != DDS_RETCODE_OK)
 | 
			
		||||
        memset(&dest, 0, sizeof(dest));
 | 
			
		||||
      write_pcap_received(conn->m_base.gv, now(), &src, &dest, buf, (size_t) ret);
 | 
			
		||||
      write_pcap_received(conn->m_base.gv, ddsrt_time_wallclock(), &src, &dest, buf, (size_t) ret);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Check for udp packet truncation */
 | 
			
		||||
| 
						 | 
				
			
			@ -155,7 +155,7 @@ static ssize_t ddsi_udp_conn_write (ddsi_tran_conn_t conn, const nn_locator_t *d
 | 
			
		|||
    socklen_t alen = sizeof (sa);
 | 
			
		||||
    if (ddsrt_getsockname (((ddsi_udp_conn_t) conn)->m_sock, (struct sockaddr *) &sa, &alen) != DDS_RETCODE_OK)
 | 
			
		||||
      memset(&sa, 0, sizeof(sa));
 | 
			
		||||
    write_pcap_sent (conn->m_base.gv, now (), &sa, &msg, (size_t) ret);
 | 
			
		||||
    write_pcap_sent (conn->m_base.gv, ddsrt_time_wallclock (), &sa, &msg, (size_t) ret);
 | 
			
		||||
  }
 | 
			
		||||
  else if (rc != DDS_RETCODE_OK &&
 | 
			
		||||
           rc != DDS_RETCODE_NOT_ALLOWED &&
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -179,7 +179,7 @@ static int write_mpayload (struct writer *wr, int alive, nn_parameterid_t keypar
 | 
			
		|||
  nn_xmsg_payload_to_plistsample (&plist_sample, keyparam, mpayload);
 | 
			
		||||
  serdata = ddsi_serdata_from_sample (wr->e.gv->plist_topic, alive ? SDK_DATA : SDK_KEY, &plist_sample);
 | 
			
		||||
  serdata->statusinfo = alive ? 0 : NN_STATUSINFO_DISPOSE | NN_STATUSINFO_UNREGISTER;
 | 
			
		||||
  serdata->timestamp = now ();
 | 
			
		||||
  serdata->timestamp = ddsrt_time_wallclock ();
 | 
			
		||||
  return write_sample_nogc_notk (ts1, NULL, wr, serdata);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -362,7 +362,7 @@ int spdp_dispose_unregister (struct participant *pp)
 | 
			
		|||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned pseudo_random_delay (const ddsi_guid_t *x, const ddsi_guid_t *y, nn_mtime_t tnow)
 | 
			
		||||
static unsigned pseudo_random_delay (const ddsi_guid_t *x, const ddsi_guid_t *y, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  /* You know, an ordinary random generator would be even better, but
 | 
			
		||||
     the C library doesn't have a reentrant one and I don't feel like
 | 
			
		||||
| 
						 | 
				
			
			@ -395,7 +395,7 @@ static void respond_to_spdp (const struct ddsi_domaingv *gv, const ddsi_guid_t *
 | 
			
		|||
{
 | 
			
		||||
  struct entidx_enum_participant est;
 | 
			
		||||
  struct participant *pp;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  entidx_enum_participant_init (&est, gv->entity_index);
 | 
			
		||||
  while ((pp = entidx_enum_participant_next (&est)) != NULL)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -405,7 +405,7 @@ static void respond_to_spdp (const struct ddsi_domaingv *gv, const ddsi_guid_t *
 | 
			
		|||
    unsigned delay_norm = delay_base >> 2;
 | 
			
		||||
    int64_t delay_max_ms = gv->config.spdp_response_delay_max / 1000000;
 | 
			
		||||
    int64_t delay = (int64_t) delay_norm * delay_max_ms / 1000;
 | 
			
		||||
    nn_mtime_t tsched = add_duration_to_mtime (tnow, delay);
 | 
			
		||||
    ddsrt_mtime_t tsched = ddsrt_mtime_add_duration (tnow, delay);
 | 
			
		||||
    GVTRACE (" %"PRId64, delay);
 | 
			
		||||
    if (!pp->e.gv->config.unicast_response_to_spdp_messages)
 | 
			
		||||
      /* pp can't reach gc_delete_participant => can safely reschedule */
 | 
			
		||||
| 
						 | 
				
			
			@ -416,7 +416,7 @@ static void respond_to_spdp (const struct ddsi_domaingv *gv, const ddsi_guid_t *
 | 
			
		|||
  entidx_enum_participant_fini (&est);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_SPDP_dead (const struct receiver_state *rst, nn_wctime_t timestamp, const ddsi_plist_t *datap, unsigned statusinfo)
 | 
			
		||||
static int handle_SPDP_dead (const struct receiver_state *rst, ddsrt_wctime_t timestamp, const ddsi_plist_t *datap, unsigned statusinfo)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = rst->gv;
 | 
			
		||||
  ddsi_guid_t guid;
 | 
			
		||||
| 
						 | 
				
			
			@ -478,7 +478,7 @@ static struct proxy_participant *find_ddsi2_proxy_participant (const struct enti
 | 
			
		|||
  return pp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void make_participants_dependent_on_ddsi2 (struct ddsi_domaingv *gv, const ddsi_guid_t *ddsi2guid, nn_wctime_t timestamp)
 | 
			
		||||
static void make_participants_dependent_on_ddsi2 (struct ddsi_domaingv *gv, const ddsi_guid_t *ddsi2guid, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  struct entidx_enum_proxy_participant it;
 | 
			
		||||
  struct proxy_participant *pp, *d2pp;
 | 
			
		||||
| 
						 | 
				
			
			@ -514,7 +514,7 @@ static void make_participants_dependent_on_ddsi2 (struct ddsi_domaingv *gv, cons
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_SPDP_alive (const struct receiver_state *rst, seqno_t seq, nn_wctime_t timestamp, const ddsi_plist_t *datap)
 | 
			
		||||
static int handle_SPDP_alive (const struct receiver_state *rst, seqno_t seq, ddsrt_wctime_t timestamp, const ddsi_plist_t *datap)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = rst->gv;
 | 
			
		||||
  const unsigned bes_sedp_announcer_mask =
 | 
			
		||||
| 
						 | 
				
			
			@ -596,7 +596,7 @@ static int handle_SPDP_alive (const struct receiver_state *rst, seqno_t seq, nn_
 | 
			
		|||
         that are not alive are not set alive here. This is done only when
 | 
			
		||||
         data is received from a particular pwr (in handle_regular) */
 | 
			
		||||
      if ((lease = ddsrt_atomic_ldvoidp (&proxypp->minl_auto)) != NULL)
 | 
			
		||||
        lease_renew (lease, now_et ());
 | 
			
		||||
        lease_renew (lease, ddsrt_time_elapsed ());
 | 
			
		||||
      ddsrt_mutex_lock (&proxypp->e.lock);
 | 
			
		||||
      if (proxypp->implicitly_created || seq > proxypp->seq)
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -797,7 +797,7 @@ static int handle_SPDP_alive (const struct receiver_state *rst, seqno_t seq, nn_
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_SPDP (const struct receiver_state *rst, seqno_t seq, nn_wctime_t timestamp, unsigned statusinfo, const void *vdata, uint32_t len)
 | 
			
		||||
static void handle_SPDP (const struct receiver_state *rst, seqno_t seq, ddsrt_wctime_t timestamp, unsigned statusinfo, const void *vdata, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = rst->gv;
 | 
			
		||||
  const struct CDRHeader *data = vdata; /* built-ins not deserialized (yet) */
 | 
			
		||||
| 
						 | 
				
			
			@ -1049,7 +1049,7 @@ static const char *durability_to_string (dds_durability_kind_t k)
 | 
			
		|||
  return "undefined-durability";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct proxy_participant *implicitly_create_proxypp (struct ddsi_domaingv *gv, const ddsi_guid_t *ppguid, ddsi_plist_t *datap /* note: potentially modifies datap */, const ddsi_guid_prefix_t *src_guid_prefix, nn_vendorid_t vendorid, nn_wctime_t timestamp, seqno_t seq)
 | 
			
		||||
static struct proxy_participant *implicitly_create_proxypp (struct ddsi_domaingv *gv, const ddsi_guid_t *ppguid, ddsi_plist_t *datap /* note: potentially modifies datap */, const ddsi_guid_prefix_t *src_guid_prefix, nn_vendorid_t vendorid, ddsrt_wctime_t timestamp, seqno_t seq)
 | 
			
		||||
{
 | 
			
		||||
  ddsi_guid_t privguid;
 | 
			
		||||
  ddsi_plist_t pp_plist;
 | 
			
		||||
| 
						 | 
				
			
			@ -1129,7 +1129,7 @@ static struct proxy_participant *implicitly_create_proxypp (struct ddsi_domaingv
 | 
			
		|||
  return entidx_lookup_proxy_participant_guid (gv->entity_index, ppguid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_SEDP_alive (const struct receiver_state *rst, seqno_t seq, ddsi_plist_t *datap /* note: potentially modifies datap */, const ddsi_guid_prefix_t *src_guid_prefix, nn_vendorid_t vendorid, nn_wctime_t timestamp)
 | 
			
		||||
static void handle_SEDP_alive (const struct receiver_state *rst, seqno_t seq, ddsi_plist_t *datap /* note: potentially modifies datap */, const ddsi_guid_prefix_t *src_guid_prefix, nn_vendorid_t vendorid, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
#define E(msg, lbl) do { GVLOGDISC (msg); goto lbl; } while (0)
 | 
			
		||||
  struct ddsi_domaingv * const gv = rst->gv;
 | 
			
		||||
| 
						 | 
				
			
			@ -1225,7 +1225,7 @@ static void handle_SEDP_alive (const struct receiver_state *rst, seqno_t seq, dd
 | 
			
		|||
      GVLOGDISC (" "PGUIDFMT" attach-to-DS "PGUIDFMT, PGUID(pp->e.guid), PGUIDPREFIX(*src_guid_prefix), pp->privileged_pp_guid.entityid.u);
 | 
			
		||||
      ddsrt_mutex_lock (&pp->e.lock);
 | 
			
		||||
      pp->privileged_pp_guid.prefix = *src_guid_prefix;
 | 
			
		||||
      lease_set_expiry(pp->lease, NN_ETIME_NEVER);
 | 
			
		||||
      lease_set_expiry(pp->lease, DDSRT_ETIME_NEVER);
 | 
			
		||||
      ddsrt_mutex_unlock (&pp->e.lock);
 | 
			
		||||
    }
 | 
			
		||||
    GVLOGDISC ("\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -1324,7 +1324,7 @@ err:
 | 
			
		|||
#undef E
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_SEDP_dead (const struct receiver_state *rst, ddsi_plist_t *datap, nn_wctime_t timestamp)
 | 
			
		||||
static void handle_SEDP_dead (const struct receiver_state *rst, ddsi_plist_t *datap, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = rst->gv;
 | 
			
		||||
  int res;
 | 
			
		||||
| 
						 | 
				
			
			@ -1341,7 +1341,7 @@ static void handle_SEDP_dead (const struct receiver_state *rst, ddsi_plist_t *da
 | 
			
		|||
  GVLOGDISC (" %s\n", (res < 0) ? " unknown" : " delete");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_SEDP (const struct receiver_state *rst, seqno_t seq, nn_wctime_t timestamp, unsigned statusinfo, const void *vdata, uint32_t len)
 | 
			
		||||
static void handle_SEDP (const struct receiver_state *rst, seqno_t seq, ddsrt_wctime_t timestamp, unsigned statusinfo, const void *vdata, uint32_t len)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = rst->gv;
 | 
			
		||||
  const struct CDRHeader *data = vdata; /* built-ins not deserialized (yet) */
 | 
			
		||||
| 
						 | 
				
			
			@ -1477,7 +1477,7 @@ int builtins_dqueue_handler (const struct nn_rsample_info *sampleinfo, const str
 | 
			
		|||
  unsigned char *datap;
 | 
			
		||||
  int needs_free;
 | 
			
		||||
  uint32_t datasz = sampleinfo->size;
 | 
			
		||||
  nn_wctime_t timestamp;
 | 
			
		||||
  ddsrt_wctime_t timestamp;
 | 
			
		||||
 | 
			
		||||
  needs_free = defragment (&datap, fragchain, sampleinfo->size);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1625,10 +1625,10 @@ int builtins_dqueue_handler (const struct nn_rsample_info *sampleinfo, const str
 | 
			
		|||
    goto done_upd_deliv;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (sampleinfo->timestamp.v != NN_WCTIME_INVALID.v)
 | 
			
		||||
  if (sampleinfo->timestamp.v != DDSRT_WCTIME_INVALID.v)
 | 
			
		||||
    timestamp = sampleinfo->timestamp;
 | 
			
		||||
  else
 | 
			
		||||
    timestamp = now ();
 | 
			
		||||
    timestamp = ddsrt_time_wallclock ();
 | 
			
		||||
  switch (srcguid.entityid.u)
 | 
			
		||||
  {
 | 
			
		||||
    case NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,6 @@
 | 
			
		|||
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_misc.h"
 | 
			
		||||
#include "dds/ddsi/q_log.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_plist.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,6 @@
 | 
			
		|||
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_misc.h"
 | 
			
		||||
#include "dds/ddsi/q_log.h"
 | 
			
		||||
#include "dds/ddsrt/avl.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -54,7 +53,7 @@ struct deleted_participant {
 | 
			
		|||
  ddsrt_avl_node_t avlnode;
 | 
			
		||||
  ddsi_guid_t guid;
 | 
			
		||||
  unsigned for_what;
 | 
			
		||||
  nn_mtime_t t_prune;
 | 
			
		||||
  ddsrt_mtime_t t_prune;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct deleted_participants_admin {
 | 
			
		||||
| 
						 | 
				
			
			@ -110,7 +109,7 @@ static int gcreq_proxy_reader (struct proxy_reader *prd);
 | 
			
		|||
extern inline bool builtintopic_is_visible (const struct ddsi_builtin_topic_interface *btif, const struct ddsi_guid *guid, nn_vendorid_t vendorid);
 | 
			
		||||
extern inline bool builtintopic_is_builtintopic (const struct ddsi_builtin_topic_interface *btif, const struct ddsi_sertopic *topic);
 | 
			
		||||
extern inline struct ddsi_tkmap_instance *builtintopic_get_tkmap_entry (const struct ddsi_builtin_topic_interface *btif, const struct ddsi_guid *guid);
 | 
			
		||||
extern inline void builtintopic_write (const struct ddsi_builtin_topic_interface *btif, const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
extern inline void builtintopic_write (const struct ddsi_builtin_topic_interface *btif, const struct entity_common *e, ddsrt_wctime_t timestamp, bool alive);
 | 
			
		||||
 | 
			
		||||
extern inline seqno_t writer_read_seq_xmit (const struct writer *wr);
 | 
			
		||||
extern inline void writer_update_seq_xmit (struct writer *wr, seqno_t nv);
 | 
			
		||||
| 
						 | 
				
			
			@ -209,7 +208,7 @@ const ddsrt_fibheap_def_t ldur_fhdef = DDSRT_FIBHEAPDEF_INITIALIZER(offsetof (st
 | 
			
		|||
/* used in (proxy)participant for writer liveliness monitoring */
 | 
			
		||||
const ddsrt_fibheap_def_t lease_fhdef_pp = DDSRT_FIBHEAPDEF_INITIALIZER(offsetof (struct lease, pp_heapnode), compare_lease_tdur);
 | 
			
		||||
 | 
			
		||||
static void entity_common_init (struct entity_common *e, struct ddsi_domaingv *gv, const struct ddsi_guid *guid, const char *name, enum entity_kind kind, nn_wctime_t tcreate, nn_vendorid_t vendorid, bool onlylocal)
 | 
			
		||||
static void entity_common_init (struct entity_common *e, struct ddsi_domaingv *gv, const struct ddsi_guid *guid, const char *name, enum entity_kind kind, ddsrt_wctime_t tcreate, nn_vendorid_t vendorid, bool onlylocal)
 | 
			
		||||
{
 | 
			
		||||
  e->guid = *guid;
 | 
			
		||||
  e->kind = kind;
 | 
			
		||||
| 
						 | 
				
			
			@ -355,9 +354,9 @@ void ddsi_make_writer_info(struct ddsi_writer_info *wrinfo, const struct entity_
 | 
			
		|||
  wrinfo->iid = e->iid;
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
  if (xqos->lifespan.duration != DDS_INFINITY && (statusinfo & (NN_STATUSINFO_UNREGISTER | NN_STATUSINFO_DISPOSE)) == 0)
 | 
			
		||||
    wrinfo->lifespan_exp = add_duration_to_mtime(now_mt(), xqos->lifespan.duration);
 | 
			
		||||
    wrinfo->lifespan_exp = ddsrt_mtime_add_duration(ddsrt_time_monotonic(), xqos->lifespan.duration);
 | 
			
		||||
  else
 | 
			
		||||
    wrinfo->lifespan_exp = NN_MTIME_NEVER;
 | 
			
		||||
    wrinfo->lifespan_exp = DDSRT_MTIME_NEVER;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -380,7 +379,7 @@ void deleted_participants_admin_free (struct deleted_participants_admin *admin)
 | 
			
		|||
  ddsrt_free (admin);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void prune_deleted_participant_guids_unlocked (struct deleted_participants_admin *admin, nn_mtime_t tnow)
 | 
			
		||||
static void prune_deleted_participant_guids_unlocked (struct deleted_participants_admin *admin, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  /* Could do a better job of finding prunable ones efficiently under
 | 
			
		||||
     all circumstances, but I expect the tree to be very small at all
 | 
			
		||||
| 
						 | 
				
			
			@ -400,7 +399,7 @@ static void prune_deleted_participant_guids_unlocked (struct deleted_participant
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void prune_deleted_participant_guids (struct deleted_participants_admin *admin, nn_mtime_t tnow)
 | 
			
		||||
static void prune_deleted_participant_guids (struct deleted_participants_admin *admin, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&admin->deleted_participants_lock);
 | 
			
		||||
  prune_deleted_participant_guids_unlocked (admin, tnow);
 | 
			
		||||
| 
						 | 
				
			
			@ -417,7 +416,7 @@ static void remember_deleted_participant_guid (struct deleted_participants_admin
 | 
			
		|||
    if ((n = ddsrt_malloc (sizeof (*n))) != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      n->guid = *guid;
 | 
			
		||||
      n->t_prune = NN_MTIME_NEVER;
 | 
			
		||||
      n->t_prune = DDSRT_MTIME_NEVER;
 | 
			
		||||
      n->for_what = DPG_LOCAL | DPG_REMOTE;
 | 
			
		||||
      ddsrt_avl_insert_ipath (&deleted_participants_treedef, &admin->deleted_participants, n, &path);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -430,7 +429,7 @@ int is_deleted_participant_guid (struct deleted_participants_admin *admin, const
 | 
			
		|||
  struct deleted_participant *n;
 | 
			
		||||
  int known;
 | 
			
		||||
  ddsrt_mutex_lock (&admin->deleted_participants_lock);
 | 
			
		||||
  prune_deleted_participant_guids_unlocked (admin, now_mt ());
 | 
			
		||||
  prune_deleted_participant_guids_unlocked (admin, ddsrt_time_monotonic ());
 | 
			
		||||
  if ((n = ddsrt_avl_lookup (&deleted_participants_treedef, &admin->deleted_participants, guid)) == NULL)
 | 
			
		||||
    known = 0;
 | 
			
		||||
  else
 | 
			
		||||
| 
						 | 
				
			
			@ -445,12 +444,12 @@ static void remove_deleted_participant_guid (struct deleted_participants_admin *
 | 
			
		|||
  DDS_CLOG (DDS_LC_DISCOVERY, admin->logcfg, "remove_deleted_participant_guid("PGUIDFMT" for_what=%x)\n", PGUID (*guid), for_what);
 | 
			
		||||
  ddsrt_mutex_lock (&admin->deleted_participants_lock);
 | 
			
		||||
  if ((n = ddsrt_avl_lookup (&deleted_participants_treedef, &admin->deleted_participants, guid)) != NULL)
 | 
			
		||||
    n->t_prune = add_duration_to_mtime (now_mt (), admin->delay);
 | 
			
		||||
    n->t_prune = ddsrt_mtime_add_duration (ddsrt_time_monotonic (), admin->delay);
 | 
			
		||||
  ddsrt_mutex_unlock (&admin->deleted_participants_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* PARTICIPANT ------------------------------------------------------ */
 | 
			
		||||
static bool update_qos_locked (struct entity_common *e, dds_qos_t *ent_qos, const dds_qos_t *xqos, nn_wctime_t timestamp)
 | 
			
		||||
static bool update_qos_locked (struct entity_common *e, dds_qos_t *ent_qos, const dds_qos_t *xqos, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  uint64_t mask;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -541,7 +540,7 @@ static void participant_add_wr_lease_locked (struct participant * pp, const stru
 | 
			
		|||
  /* if inserted lease is new shortest lease */
 | 
			
		||||
  if (minl_prev != minl_new)
 | 
			
		||||
  {
 | 
			
		||||
    nn_etime_t texp = add_duration_to_etime (now_et (), minl_new->tdur);
 | 
			
		||||
    ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed (), minl_new->tdur);
 | 
			
		||||
    struct lease *lnew = lease_new (texp, minl_new->tdur, minl_new->entity);
 | 
			
		||||
    if (minl_prev == NULL)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -571,7 +570,7 @@ static void participant_remove_wr_lease_locked (struct participant * pp, struct
 | 
			
		|||
    {
 | 
			
		||||
      dds_duration_t trem = minl->tdur - wr->lease->tdur;
 | 
			
		||||
      assert (trem >= 0);
 | 
			
		||||
      nn_etime_t texp = add_duration_to_etime (now_et(), trem);
 | 
			
		||||
      ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed(), trem);
 | 
			
		||||
      struct lease *lnew = lease_new (texp, minl->tdur, minl->entity);
 | 
			
		||||
      participant_replace_minl (pp, lnew);
 | 
			
		||||
      lease_register (lnew);
 | 
			
		||||
| 
						 | 
				
			
			@ -594,7 +593,7 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct ddsi_domain
 | 
			
		|||
  /* privileged participant MUST have builtin readers and writers */
 | 
			
		||||
  assert (!(flags & RTPS_PF_PRIVILEGED_PP) || (flags & (RTPS_PF_NO_BUILTIN_READERS | RTPS_PF_NO_BUILTIN_WRITERS)) == 0);
 | 
			
		||||
 | 
			
		||||
  prune_deleted_participant_guids (gv->deleted_participants, now_mt ());
 | 
			
		||||
  prune_deleted_participant_guids (gv->deleted_participants, ddsrt_time_monotonic ());
 | 
			
		||||
 | 
			
		||||
  /* FIXME: FULL LOCKING AROUND NEW_XXX FUNCTIONS, JUST SO EXISTENCE TESTS ARE PRECISE */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -630,7 +629,7 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct ddsi_domain
 | 
			
		|||
 | 
			
		||||
  pp = ddsrt_malloc (sizeof (*pp));
 | 
			
		||||
 | 
			
		||||
  entity_common_init (&pp->e, gv, ppguid, "", EK_PARTICIPANT, now (), NN_VENDORID_ECLIPSE, ((flags & RTPS_PF_ONLY_LOCAL) != 0));
 | 
			
		||||
  entity_common_init (&pp->e, gv, ppguid, "", EK_PARTICIPANT, ddsrt_time_wallclock (), NN_VENDORID_ECLIPSE, ((flags & RTPS_PF_ONLY_LOCAL) != 0));
 | 
			
		||||
  pp->user_refc = 1;
 | 
			
		||||
  pp->builtin_refc = 0;
 | 
			
		||||
  pp->builtins_deleted = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -790,7 +789,7 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct ddsi_domain
 | 
			
		|||
    trigger_recv_threads (gv);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  builtintopic_write (gv->builtin_topic_interface, &pp->e, now(), true);
 | 
			
		||||
  builtintopic_write (gv->builtin_topic_interface, &pp->e, ddsrt_time_wallclock(), true);
 | 
			
		||||
 | 
			
		||||
  /* SPDP periodic broadcast uses the retransmit path, so the initial
 | 
			
		||||
     publication must be done differently. Must be later than making
 | 
			
		||||
| 
						 | 
				
			
			@ -806,12 +805,12 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct ddsi_domain
 | 
			
		|||
       fire before the calls return.  If the initial sample wasn't
 | 
			
		||||
       accepted, all is lost, but we continue nonetheless, even though
 | 
			
		||||
       the participant won't be able to discover or be discovered.  */
 | 
			
		||||
    pp->spdp_xevent = qxev_spdp (gv->xevents, add_duration_to_mtime (now_mt (), DDS_MSECS (100)), &pp->e.guid, NULL);
 | 
			
		||||
    pp->spdp_xevent = qxev_spdp (gv->xevents, ddsrt_mtime_add_duration (ddsrt_time_monotonic (), DDS_MSECS (100)), &pp->e.guid, NULL);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tsched;
 | 
			
		||||
    tsched = (pp->lease_duration == DDS_INFINITY) ? NN_MTIME_NEVER : (nn_mtime_t){0};
 | 
			
		||||
    ddsrt_mtime_t tsched;
 | 
			
		||||
    tsched = (pp->lease_duration == DDS_INFINITY) ? DDSRT_MTIME_NEVER : (ddsrt_mtime_t){0};
 | 
			
		||||
    pp->pmd_update_xevent = qxev_pmd_update (gv->xevents, tsched, &pp->e.guid);
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -833,7 +832,7 @@ dds_return_t new_participant (ddsi_guid_t *p_ppguid, struct ddsi_domaingv *gv, u
 | 
			
		|||
void update_participant_plist (struct participant *pp, const ddsi_plist_t *plist)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&pp->e.lock);
 | 
			
		||||
  if (update_qos_locked (&pp->e, &pp->plist->qos, &plist->qos, now ()))
 | 
			
		||||
  if (update_qos_locked (&pp->e, &pp->plist->qos, &plist->qos, ddsrt_time_wallclock ()))
 | 
			
		||||
    spdp_write (pp);
 | 
			
		||||
  ddsrt_mutex_unlock (&pp->e.lock);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1016,7 +1015,7 @@ dds_return_t delete_participant (struct ddsi_domaingv *gv, const struct ddsi_gui
 | 
			
		|||
  GVLOGDISC ("delete_participant("PGUIDFMT")\n", PGUID (*ppguid));
 | 
			
		||||
  if ((pp = entidx_lookup_participant_guid (gv->entity_index, ppguid)) == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  builtintopic_write (gv->builtin_topic_interface, &pp->e, now(), false);
 | 
			
		||||
  builtintopic_write (gv->builtin_topic_interface, &pp->e, ddsrt_time_wallclock(), false);
 | 
			
		||||
  remember_deleted_participant_guid (gv->deleted_participants, &pp->e.guid);
 | 
			
		||||
  entidx_remove_participant_guid (gv->entity_index, pp);
 | 
			
		||||
  gcreq_participant (pp);
 | 
			
		||||
| 
						 | 
				
			
			@ -1864,7 +1863,7 @@ static void writer_add_connection (struct writer *wr, struct proxy_reader *prd)
 | 
			
		|||
  m->next_acknack = DDSI_COUNT_MIN;
 | 
			
		||||
  m->next_nackfrag = DDSI_COUNT_MIN;
 | 
			
		||||
  nn_lat_estim_init (&m->hb_to_ack_latency);
 | 
			
		||||
  m->hb_to_ack_latency_tlastlog = now ();
 | 
			
		||||
  m->hb_to_ack_latency_tlastlog = ddsrt_time_wallclock ();
 | 
			
		||||
  m->t_acknack_accepted.v = 0;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&wr->e.lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -1909,7 +1908,7 @@ static void writer_add_connection (struct writer *wr, struct proxy_reader *prd)
 | 
			
		|||
    if (wr->heartbeat_xevent)
 | 
			
		||||
    {
 | 
			
		||||
      const int64_t delta = DDS_MSECS (1);
 | 
			
		||||
      const nn_mtime_t tnext = add_duration_to_mtime (now_mt (), delta);
 | 
			
		||||
      const ddsrt_mtime_t tnext = ddsrt_mtime_add_duration (ddsrt_time_monotonic (), delta);
 | 
			
		||||
      ddsrt_mutex_lock (&wr->e.lock);
 | 
			
		||||
      /* To make sure that we keep sending heartbeats at a higher rate
 | 
			
		||||
         at the start of this discovery, reset the hbs_since_last_write
 | 
			
		||||
| 
						 | 
				
			
			@ -2097,7 +2096,7 @@ static void reader_add_local_connection (struct reader *rd, struct writer *wr, c
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void proxy_writer_add_connection (struct proxy_writer *pwr, struct reader *rd, nn_mtime_t tnow, nn_count_t init_count)
 | 
			
		||||
static void proxy_writer_add_connection (struct proxy_writer *pwr, struct reader *rd, ddsrt_mtime_t tnow, nn_count_t init_count)
 | 
			
		||||
{
 | 
			
		||||
  struct pwr_rd_match *m = ddsrt_malloc (sizeof (*m));
 | 
			
		||||
  ddsrt_avl_ipath_t path;
 | 
			
		||||
| 
						 | 
				
			
			@ -2116,7 +2115,7 @@ static void proxy_writer_add_connection (struct proxy_writer *pwr, struct reader
 | 
			
		|||
  ELOGDISC (pwr, "  proxy_writer_add_connection(pwr "PGUIDFMT" rd "PGUIDFMT")",
 | 
			
		||||
            PGUID (pwr->e.guid), PGUID (rd->e.guid));
 | 
			
		||||
  m->rd_guid = rd->e.guid;
 | 
			
		||||
  m->tcreate = now_mt ();
 | 
			
		||||
  m->tcreate = ddsrt_time_monotonic ();
 | 
			
		||||
 | 
			
		||||
  /* We track the last heartbeat count value per reader--proxy-writer
 | 
			
		||||
     pair, so that we can correctly handle directed heartbeats. The
 | 
			
		||||
| 
						 | 
				
			
			@ -2191,7 +2190,7 @@ static void proxy_writer_add_connection (struct proxy_writer *pwr, struct reader
 | 
			
		|||
     hopefully it won't make that much of a difference in practice.) */
 | 
			
		||||
  if (rd->reliable)
 | 
			
		||||
  {
 | 
			
		||||
    m->acknack_xevent = qxev_acknack (pwr->evq, add_duration_to_mtime (tnow, pwr->e.gv->config.preemptive_ack_delay), &pwr->e.guid, &rd->e.guid);
 | 
			
		||||
    m->acknack_xevent = qxev_acknack (pwr->evq, ddsrt_mtime_add_duration (tnow, pwr->e.gv->config.preemptive_ack_delay), &pwr->e.guid, &rd->e.guid);
 | 
			
		||||
    m->u.not_in_sync.reorder =
 | 
			
		||||
      nn_reorder_new (&pwr->e.gv->logconfig, NN_REORDER_MODE_NORMAL, pwr->e.gv->config.secondary_reorder_maxsamples, pwr->e.gv->config.late_ack_mode);
 | 
			
		||||
    pwr->n_reliable_readers++;
 | 
			
		||||
| 
						 | 
				
			
			@ -2336,7 +2335,7 @@ static bool topickind_qos_match_p_lock (struct entity_common *rd, const dds_qos_
 | 
			
		|||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void connect_writer_with_proxy_reader (struct writer *wr, struct proxy_reader *prd, nn_mtime_t tnow)
 | 
			
		||||
static void connect_writer_with_proxy_reader (struct writer *wr, struct proxy_reader *prd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  const int isb0 = (is_builtin_entityid (wr->e.guid.entityid, NN_VENDORID_ECLIPSE) != 0);
 | 
			
		||||
  const int isb1 = (is_builtin_entityid (prd->e.guid.entityid, prd->c.vendor) != 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -2355,7 +2354,7 @@ static void connect_writer_with_proxy_reader (struct writer *wr, struct proxy_re
 | 
			
		|||
  writer_add_connection (wr, prd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void connect_proxy_writer_with_reader (struct proxy_writer *pwr, struct reader *rd, nn_mtime_t tnow)
 | 
			
		||||
static void connect_proxy_writer_with_reader (struct proxy_writer *pwr, struct reader *rd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  const int isb0 = (is_builtin_entityid (pwr->e.guid.entityid, pwr->c.vendor) != 0);
 | 
			
		||||
  const int isb1 = (is_builtin_entityid (rd->e.guid.entityid, NN_VENDORID_ECLIPSE) != 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -2410,7 +2409,7 @@ static bool ignore_local_p (const ddsi_guid_t *guid1, const ddsi_guid_t *guid2,
 | 
			
		|||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void connect_writer_with_reader (struct writer *wr, struct reader *rd, nn_mtime_t tnow)
 | 
			
		||||
static void connect_writer_with_reader (struct writer *wr, struct reader *rd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  dds_qos_policy_id_t reason;
 | 
			
		||||
  struct alive_state alive_state;
 | 
			
		||||
| 
						 | 
				
			
			@ -2438,7 +2437,7 @@ static void connect_writer_with_reader (struct writer *wr, struct reader *rd, nn
 | 
			
		|||
  reader_update_notify_wr_alive_state (rd, wr, &alive_state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void connect_writer_with_proxy_reader_wrapper (struct entity_common *vwr, struct entity_common *vprd, nn_mtime_t tnow)
 | 
			
		||||
static void connect_writer_with_proxy_reader_wrapper (struct entity_common *vwr, struct entity_common *vprd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct writer *wr = (struct writer *) vwr;
 | 
			
		||||
  struct proxy_reader *prd = (struct proxy_reader *) vprd;
 | 
			
		||||
| 
						 | 
				
			
			@ -2448,7 +2447,7 @@ static void connect_writer_with_proxy_reader_wrapper (struct entity_common *vwr,
 | 
			
		|||
  connect_writer_with_proxy_reader (wr, prd, tnow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void connect_proxy_writer_with_reader_wrapper (struct entity_common *vpwr, struct entity_common *vrd, nn_mtime_t tnow)
 | 
			
		||||
static void connect_proxy_writer_with_reader_wrapper (struct entity_common *vpwr, struct entity_common *vrd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_writer *pwr = (struct proxy_writer *) vpwr;
 | 
			
		||||
  struct reader *rd = (struct reader *) vrd;
 | 
			
		||||
| 
						 | 
				
			
			@ -2458,7 +2457,7 @@ static void connect_proxy_writer_with_reader_wrapper (struct entity_common *vpwr
 | 
			
		|||
  connect_proxy_writer_with_reader (pwr, rd, tnow);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void connect_writer_with_reader_wrapper (struct entity_common *vwr, struct entity_common *vrd, nn_mtime_t tnow)
 | 
			
		||||
static void connect_writer_with_reader_wrapper (struct entity_common *vwr, struct entity_common *vrd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct writer *wr = (struct writer *) vwr;
 | 
			
		||||
  struct reader *rd = (struct reader *) vrd;
 | 
			
		||||
| 
						 | 
				
			
			@ -2486,7 +2485,7 @@ static enum entity_kind generic_do_match_mkind (enum entity_kind kind, bool loca
 | 
			
		|||
  return EK_WRITER;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void generic_do_match_connect (struct entity_common *e, struct entity_common *em, nn_mtime_t tnow, bool local)
 | 
			
		||||
static void generic_do_match_connect (struct entity_common *e, struct entity_common *em, ddsrt_mtime_t tnow, bool local)
 | 
			
		||||
{
 | 
			
		||||
  switch (e->kind)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -2534,7 +2533,7 @@ static const char *entity_topic_name (const struct entity_common *e)
 | 
			
		|||
  return "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void generic_do_match (struct entity_common *e, nn_mtime_t tnow, bool local)
 | 
			
		||||
static void generic_do_match (struct entity_common *e, ddsrt_mtime_t tnow, bool local)
 | 
			
		||||
{
 | 
			
		||||
  static const struct { const char *full; const char *full_us; const char *abbrev; } kindstr[] = {
 | 
			
		||||
    [EK_WRITER] = { "writer", "writer", "wr" },
 | 
			
		||||
| 
						 | 
				
			
			@ -2600,32 +2599,32 @@ static void generic_do_match (struct entity_common *e, nn_mtime_t tnow, bool loc
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void match_writer_with_proxy_readers (struct writer *wr, nn_mtime_t tnow)
 | 
			
		||||
static void match_writer_with_proxy_readers (struct writer *wr, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  generic_do_match (&wr->e, tnow, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void match_writer_with_local_readers (struct writer *wr, nn_mtime_t tnow)
 | 
			
		||||
static void match_writer_with_local_readers (struct writer *wr, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  generic_do_match (&wr->e, tnow, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void match_reader_with_proxy_writers (struct reader *rd, nn_mtime_t tnow)
 | 
			
		||||
static void match_reader_with_proxy_writers (struct reader *rd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  generic_do_match (&rd->e, tnow, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void match_reader_with_local_writers (struct reader *rd, nn_mtime_t tnow)
 | 
			
		||||
static void match_reader_with_local_writers (struct reader *rd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  generic_do_match (&rd->e, tnow, true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void match_proxy_writer_with_readers (struct proxy_writer *pwr, nn_mtime_t tnow)
 | 
			
		||||
static void match_proxy_writer_with_readers (struct proxy_writer *pwr, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  generic_do_match (&pwr->e, tnow, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void match_proxy_reader_with_writers (struct proxy_reader *prd, nn_mtime_t tnow)
 | 
			
		||||
static void match_proxy_reader_with_writers (struct proxy_reader *prd, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  generic_do_match(&prd->e, tnow, false);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -2660,7 +2659,7 @@ static void new_reader_writer_common (const struct ddsrt_log_cfg *logcfg, const
 | 
			
		|||
 | 
			
		||||
static void endpoint_common_init (struct entity_common *e, struct endpoint_common *c, struct ddsi_domaingv *gv, enum entity_kind kind, const struct ddsi_guid *guid, const struct ddsi_guid *group_guid, struct participant *pp, bool onlylocal)
 | 
			
		||||
{
 | 
			
		||||
  entity_common_init (e, gv, guid, NULL, kind, now (), NN_VENDORID_ECLIPSE, pp->e.onlylocal || onlylocal);
 | 
			
		||||
  entity_common_init (e, gv, guid, NULL, kind, ddsrt_time_wallclock (), NN_VENDORID_ECLIPSE, pp->e.onlylocal || onlylocal);
 | 
			
		||||
  c->pp = ref_participant (pp, &e->guid);
 | 
			
		||||
  if (group_guid)
 | 
			
		||||
    c->group_guid = *group_guid;
 | 
			
		||||
| 
						 | 
				
			
			@ -2861,7 +2860,7 @@ void writer_set_retransmitting (struct writer *wr)
 | 
			
		|||
void writer_clear_retransmitting (struct writer *wr)
 | 
			
		||||
{
 | 
			
		||||
  wr->retransmitting = 0;
 | 
			
		||||
  wr->t_whc_high_upd = wr->t_rexmit_end = now_et();
 | 
			
		||||
  wr->t_whc_high_upd = wr->t_rexmit_end = ddsrt_time_elapsed();
 | 
			
		||||
  ddsrt_cond_broadcast (&wr->throttle_cond);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2924,7 +2923,7 @@ void writer_set_alive_may_unlock (struct writer *wr, bool notify)
 | 
			
		|||
    if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_PARTICIPANT)
 | 
			
		||||
      participant_add_wr_lease_locked (wr->c.pp, wr);
 | 
			
		||||
    else if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_TOPIC)
 | 
			
		||||
      lease_set_expiry (wr->lease, add_duration_to_etime (now_et (), wr->lease->tdur));
 | 
			
		||||
      lease_set_expiry (wr->lease, ddsrt_etime_add_duration (ddsrt_time_elapsed (), wr->lease->tdur));
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&wr->c.pp->e.lock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3092,7 +3091,7 @@ static void new_writer_guid_common_init (struct writer *wr, const struct ddsi_se
 | 
			
		|||
     scheduled, and this can only change by writing data, which won't
 | 
			
		||||
     happen until after it becomes visible. */
 | 
			
		||||
  if (wr->reliable)
 | 
			
		||||
    wr->heartbeat_xevent = qxev_heartbeat (wr->evq, NN_MTIME_NEVER, &wr->e.guid);
 | 
			
		||||
    wr->heartbeat_xevent = qxev_heartbeat (wr->evq, DDSRT_MTIME_NEVER, &wr->e.guid);
 | 
			
		||||
  else
 | 
			
		||||
    wr->heartbeat_xevent = NULL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3133,7 +3132,7 @@ static void new_writer_guid_common_init (struct writer *wr, const struct ddsi_se
 | 
			
		|||
static dds_return_t new_writer_guid (struct writer **wr_out, const struct ddsi_guid *guid, const struct ddsi_guid *group_guid, struct participant *pp, const struct ddsi_sertopic *topic, const struct dds_qos *xqos, struct whc *whc, status_cb_t status_cb, void *status_entity)
 | 
			
		||||
{
 | 
			
		||||
  struct writer *wr;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
 | 
			
		||||
  assert (is_writer_entityid (guid->entityid));
 | 
			
		||||
  assert (entidx_lookup_writer_guid (pp->e.gv->entity_index, guid) == NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -3159,7 +3158,7 @@ static dds_return_t new_writer_guid (struct writer **wr_out, const struct ddsi_g
 | 
			
		|||
   the other. */
 | 
			
		||||
  ddsrt_mutex_lock (&wr->e.lock);
 | 
			
		||||
  entidx_insert_writer_guid (pp->e.gv->entity_index, wr);
 | 
			
		||||
  builtintopic_write (wr->e.gv->builtin_topic_interface, &wr->e, now(), true);
 | 
			
		||||
  builtintopic_write (wr->e.gv->builtin_topic_interface, &wr->e, ddsrt_time_wallclock(), true);
 | 
			
		||||
  ddsrt_mutex_unlock (&wr->e.lock);
 | 
			
		||||
 | 
			
		||||
  /* once it exists, match it with proxy writers and broadcast
 | 
			
		||||
| 
						 | 
				
			
			@ -3184,11 +3183,11 @@ static dds_return_t new_writer_guid (struct writer **wr_out, const struct ddsi_g
 | 
			
		|||
      ddsrt_mutex_unlock (&pp->e.lock);
 | 
			
		||||
 | 
			
		||||
      /* Trigger pmd update */
 | 
			
		||||
      (void) resched_xevent_if_earlier (pp->pmd_update_xevent, now_mt ());
 | 
			
		||||
      (void) resched_xevent_if_earlier (pp->pmd_update_xevent, ddsrt_time_monotonic ());
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      nn_etime_t texpire = add_duration_to_etime (now_et (), wr->lease_duration->ldur);
 | 
			
		||||
      ddsrt_etime_t texpire = ddsrt_etime_add_duration (ddsrt_time_elapsed (), wr->lease_duration->ldur);
 | 
			
		||||
      wr->lease = lease_new (texpire, wr->lease_duration->ldur, &wr->e);
 | 
			
		||||
      if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_PARTICIPANT)
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -3233,7 +3232,7 @@ struct local_orphan_writer *new_local_orphan_writer (struct ddsi_domaingv *gv, d
 | 
			
		|||
  ddsi_guid_t guid;
 | 
			
		||||
  struct local_orphan_writer *lowr;
 | 
			
		||||
  struct writer *wr;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
 | 
			
		||||
  GVLOGDISC ("new_local_orphan_writer(%s/%s)\n", topic->name, topic->type_name);
 | 
			
		||||
  lowr = ddsrt_malloc (sizeof (*lowr));
 | 
			
		||||
| 
						 | 
				
			
			@ -3241,12 +3240,12 @@ struct local_orphan_writer *new_local_orphan_writer (struct ddsi_domaingv *gv, d
 | 
			
		|||
 | 
			
		||||
  memset (&guid.prefix, 0, sizeof (guid.prefix));
 | 
			
		||||
  guid.entityid = entityid;
 | 
			
		||||
  entity_common_init (&wr->e, gv, &guid, NULL, EK_WRITER, now (), NN_VENDORID_ECLIPSE, true);
 | 
			
		||||
  entity_common_init (&wr->e, gv, &guid, NULL, EK_WRITER, ddsrt_time_wallclock (), NN_VENDORID_ECLIPSE, true);
 | 
			
		||||
  wr->c.pp = NULL;
 | 
			
		||||
  memset (&wr->c.group_guid, 0, sizeof (wr->c.group_guid));
 | 
			
		||||
  new_writer_guid_common_init (wr, topic, xqos, whc, 0, NULL);
 | 
			
		||||
  entidx_insert_writer_guid (gv->entity_index, wr);
 | 
			
		||||
  builtintopic_write (gv->builtin_topic_interface, &wr->e, now(), true);
 | 
			
		||||
  builtintopic_write (gv->builtin_topic_interface, &wr->e, ddsrt_time_wallclock(), true);
 | 
			
		||||
  match_writer_with_local_readers (wr, tnow);
 | 
			
		||||
  return lowr;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3254,7 +3253,7 @@ struct local_orphan_writer *new_local_orphan_writer (struct ddsi_domaingv *gv, d
 | 
			
		|||
void update_writer_qos (struct writer *wr, const dds_qos_t *xqos)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&wr->e.lock);
 | 
			
		||||
  if (update_qos_locked (&wr->e, wr->xqos, xqos, now ()))
 | 
			
		||||
  if (update_qos_locked (&wr->e, wr->xqos, xqos, ddsrt_time_wallclock ()))
 | 
			
		||||
    sedp_write_writer (wr);
 | 
			
		||||
  ddsrt_mutex_unlock (&wr->e.lock);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3271,7 +3270,7 @@ static void gc_delete_writer (struct gcreq *gcreq)
 | 
			
		|||
 | 
			
		||||
  if (wr->heartbeat_xevent)
 | 
			
		||||
  {
 | 
			
		||||
    wr->hbcontrol.tsched = NN_MTIME_NEVER;
 | 
			
		||||
    wr->hbcontrol.tsched = DDSRT_MTIME_NEVER;
 | 
			
		||||
    delete_xevent (wr->heartbeat_xevent);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3388,7 +3387,7 @@ dds_return_t delete_writer_nolinger_locked (struct writer *wr)
 | 
			
		|||
{
 | 
			
		||||
  ELOGDISC (wr, "delete_writer_nolinger(guid "PGUIDFMT") ...\n", PGUID (wr->e.guid));
 | 
			
		||||
  ASSERT_MUTEX_HELD (&wr->e.lock);
 | 
			
		||||
  builtintopic_write (wr->e.gv->builtin_topic_interface, &wr->e, now(), false);
 | 
			
		||||
  builtintopic_write (wr->e.gv->builtin_topic_interface, &wr->e, ddsrt_time_wallclock(), false);
 | 
			
		||||
  local_reader_ary_setinvalid (&wr->rdary);
 | 
			
		||||
  entidx_remove_writer_guid (wr->e.gv->entity_index, wr);
 | 
			
		||||
  writer_set_state (wr, WRST_DELETING);
 | 
			
		||||
| 
						 | 
				
			
			@ -3399,7 +3398,7 @@ dds_return_t delete_writer_nolinger_locked (struct writer *wr)
 | 
			
		|||
      ddsrt_mutex_lock (&wr->c.pp->e.lock);
 | 
			
		||||
      ddsrt_fibheap_delete (&ldur_fhdef, &wr->c.pp->ldur_auto_wr, wr->lease_duration);
 | 
			
		||||
      ddsrt_mutex_unlock (&wr->c.pp->e.lock);
 | 
			
		||||
      resched_xevent_if_earlier (wr->c.pp->pmd_update_xevent, now_mt ());
 | 
			
		||||
      resched_xevent_if_earlier (wr->c.pp->pmd_update_xevent, ddsrt_time_monotonic ());
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -3468,12 +3467,12 @@ dds_return_t delete_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *gu
 | 
			
		|||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tsched;
 | 
			
		||||
    ddsrt_mtime_t tsched;
 | 
			
		||||
    int32_t tsec, tusec;
 | 
			
		||||
    writer_set_state (wr, WRST_LINGERING);
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->e.lock);
 | 
			
		||||
    tsched = add_duration_to_mtime (now_mt (), wr->e.gv->config.writer_linger_duration);
 | 
			
		||||
    mtime_to_sec_usec (&tsec, &tusec, tsched);
 | 
			
		||||
    tsched = ddsrt_mtime_add_duration (ddsrt_time_monotonic (), wr->e.gv->config.writer_linger_duration);
 | 
			
		||||
    ddsrt_mtime_to_sec_usec (&tsec, &tusec, tsched);
 | 
			
		||||
    GVLOGDISC ("delete_writer(guid "PGUIDFMT") - unack'ed samples, will delete when ack'd or at t = %"PRId32".%06"PRId32"\n",
 | 
			
		||||
               PGUID (*guid), tsec, tusec);
 | 
			
		||||
    qxev_delete_writer (gv->xevents, tsched, &wr->e.guid);
 | 
			
		||||
| 
						 | 
				
			
			@ -3604,7 +3603,7 @@ static dds_return_t new_reader_guid
 | 
			
		|||
  /* see new_writer_guid for commenets */
 | 
			
		||||
 | 
			
		||||
  struct reader *rd;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
 | 
			
		||||
  assert (!is_writer_entityid (guid->entityid));
 | 
			
		||||
  assert (entidx_lookup_reader_guid (pp->e.gv->entity_index, guid) == NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -3715,7 +3714,7 @@ static dds_return_t new_reader_guid
 | 
			
		|||
 | 
			
		||||
  ddsrt_mutex_lock (&rd->e.lock);
 | 
			
		||||
  entidx_insert_reader_guid (pp->e.gv->entity_index, rd);
 | 
			
		||||
  builtintopic_write (pp->e.gv->builtin_topic_interface, &rd->e, now(), true);
 | 
			
		||||
  builtintopic_write (pp->e.gv->builtin_topic_interface, &rd->e, ddsrt_time_wallclock(), true);
 | 
			
		||||
  ddsrt_mutex_unlock (&rd->e.lock);
 | 
			
		||||
 | 
			
		||||
  match_reader_with_proxy_writers (rd, tnow);
 | 
			
		||||
| 
						 | 
				
			
			@ -3816,7 +3815,7 @@ dds_return_t delete_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *gu
 | 
			
		|||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  }
 | 
			
		||||
  GVLOGDISC ("delete_reader_guid(guid "PGUIDFMT") ...\n", PGUID (*guid));
 | 
			
		||||
  builtintopic_write (rd->e.gv->builtin_topic_interface, &rd->e, now(), false);
 | 
			
		||||
  builtintopic_write (rd->e.gv->builtin_topic_interface, &rd->e, ddsrt_time_wallclock(), false);
 | 
			
		||||
  entidx_remove_reader_guid (gv->entity_index, rd);
 | 
			
		||||
  gcreq_reader (rd);
 | 
			
		||||
  return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -3825,7 +3824,7 @@ dds_return_t delete_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *gu
 | 
			
		|||
void update_reader_qos (struct reader *rd, const dds_qos_t *xqos)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&rd->e.lock);
 | 
			
		||||
  if (update_qos_locked (&rd->e, rd->xqos, xqos, now ()))
 | 
			
		||||
  if (update_qos_locked (&rd->e, rd->xqos, xqos, ddsrt_time_wallclock ()))
 | 
			
		||||
    sedp_write_reader (rd);
 | 
			
		||||
  ddsrt_mutex_unlock (&rd->e.lock);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3858,7 +3857,7 @@ void proxy_participant_reassign_lease (struct proxy_participant *proxypp, struct
 | 
			
		|||
      {
 | 
			
		||||
        dds_duration_t trem = minl->tdur - proxypp->lease->tdur;
 | 
			
		||||
        assert (trem >= 0);
 | 
			
		||||
        nn_etime_t texp = add_duration_to_etime (now_et(), trem);
 | 
			
		||||
        ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed(), trem);
 | 
			
		||||
        struct lease *lnew = lease_new (texp, minl->tdur, minl->entity);
 | 
			
		||||
        proxy_participant_replace_minl (proxypp, false, lnew);
 | 
			
		||||
        lease_register (lnew);
 | 
			
		||||
| 
						 | 
				
			
			@ -3908,7 +3907,7 @@ static void proxy_participant_add_pwr_lease_locked (struct proxy_participant * p
 | 
			
		|||
  /* if inserted lease is new shortest lease */
 | 
			
		||||
  if (proxypp->owns_lease && minl_prev != minl_new)
 | 
			
		||||
  {
 | 
			
		||||
    nn_etime_t texp = add_duration_to_etime (now_et (), minl_new->tdur);
 | 
			
		||||
    ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed (), minl_new->tdur);
 | 
			
		||||
    struct lease *lnew = lease_new (texp, minl_new->tdur, minl_new->entity);
 | 
			
		||||
    if (minl_prev == NULL)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -3942,7 +3941,7 @@ static void proxy_participant_remove_pwr_lease_locked (struct proxy_participant
 | 
			
		|||
    {
 | 
			
		||||
      dds_duration_t trem = minl->tdur - pwr->lease->tdur;
 | 
			
		||||
      assert (trem >= 0);
 | 
			
		||||
      nn_etime_t texp = add_duration_to_etime (now_et(), trem);
 | 
			
		||||
      ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed(), trem);
 | 
			
		||||
      struct lease *lnew = lease_new (texp, minl->tdur, minl->entity);
 | 
			
		||||
      proxy_participant_replace_minl (proxypp, manbypp, lnew);
 | 
			
		||||
      lease_register (lnew);
 | 
			
		||||
| 
						 | 
				
			
			@ -3954,7 +3953,7 @@ static void proxy_participant_remove_pwr_lease_locked (struct proxy_participant
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, uint32_t bes, const struct ddsi_guid *privileged_pp_guid, struct addrset *as_default, struct addrset *as_meta, const ddsi_plist_t *plist, dds_duration_t tlease_dur, nn_vendorid_t vendor, unsigned custom_flags, nn_wctime_t timestamp, seqno_t seq)
 | 
			
		||||
void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, uint32_t bes, const struct ddsi_guid *privileged_pp_guid, struct addrset *as_default, struct addrset *as_meta, const ddsi_plist_t *plist, dds_duration_t tlease_dur, nn_vendorid_t vendor, unsigned custom_flags, ddsrt_wctime_t timestamp, seqno_t seq)
 | 
			
		||||
{
 | 
			
		||||
  /* No locking => iff all participants use unique guids, and sedp
 | 
			
		||||
     runs on a single thread, it can't go wrong. FIXME, maybe? The
 | 
			
		||||
| 
						 | 
				
			
			@ -3965,7 +3964,7 @@ void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *pp
 | 
			
		|||
  assert (entidx_lookup_proxy_participant_guid (gv->entity_index, ppguid) == NULL);
 | 
			
		||||
  assert (privileged_pp_guid == NULL || privileged_pp_guid->entityid.u == NN_ENTITYID_PARTICIPANT);
 | 
			
		||||
 | 
			
		||||
  prune_deleted_participant_guids (gv->deleted_participants, now_mt ());
 | 
			
		||||
  prune_deleted_participant_guids (gv->deleted_participants, ddsrt_time_monotonic ());
 | 
			
		||||
 | 
			
		||||
  proxypp = ddsrt_malloc (sizeof (*proxypp));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4018,7 +4017,7 @@ void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *pp
 | 
			
		|||
        no further triggers for deleting it. Instead, we take tlease_dur == NEVER as a special value meaning a
 | 
			
		||||
        lease that doesn't expire now and that has a "reasonable" lease duration. That way the lease renewal in
 | 
			
		||||
        the data path is fine, and we only need to do something special in SEDP handling. */
 | 
			
		||||
      nn_etime_t texp = add_duration_to_etime (now_et(), tlease_dur);
 | 
			
		||||
      ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed(), tlease_dur);
 | 
			
		||||
      dds_duration_t dur = (tlease_dur == DDS_INFINITY) ? gv->config.lease_duration : tlease_dur;
 | 
			
		||||
      proxypp->lease = lease_new (texp, dur, &proxypp->e);
 | 
			
		||||
      proxypp->owns_lease = 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -4139,7 +4138,7 @@ void new_proxy_participant (struct ddsi_domaingv *gv, const struct ddsi_guid *pp
 | 
			
		|||
  ddsrt_mutex_unlock (&proxypp->e.lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, nn_wctime_t timestamp)
 | 
			
		||||
int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  if (seq > proxypp->seq)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -4160,7 +4159,7 @@ int update_proxy_participant_plist_locked (struct proxy_participant *proxypp, se
 | 
			
		|||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int update_proxy_participant_plist (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, nn_wctime_t timestamp)
 | 
			
		||||
int update_proxy_participant_plist (struct proxy_participant *proxypp, seqno_t seq, const struct ddsi_plist *datap, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&proxypp->e.lock);
 | 
			
		||||
  update_proxy_participant_plist_locked (proxypp, seq, datap, timestamp);
 | 
			
		||||
| 
						 | 
				
			
			@ -4194,7 +4193,7 @@ static int ref_proxy_participant (struct proxy_participant *proxypp, struct prox
 | 
			
		|||
static void unref_proxy_participant (struct proxy_participant *proxypp, struct proxy_endpoint_common *c)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t refc;
 | 
			
		||||
  const nn_wctime_t tnow = now();
 | 
			
		||||
  const ddsrt_wctime_t tnow = ddsrt_time_wallclock();
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&proxypp->e.lock);
 | 
			
		||||
  refc = --proxypp->refc;
 | 
			
		||||
| 
						 | 
				
			
			@ -4269,7 +4268,7 @@ static struct entity_common *entity_common_from_proxy_endpoint_common (const str
 | 
			
		|||
  return (struct entity_common *) ((char *) c - offsetof (struct proxy_writer, c));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void delete_or_detach_dependent_pp (struct proxy_participant *p, struct proxy_participant *proxypp, nn_wctime_t timestamp, int isimplicit)
 | 
			
		||||
static void delete_or_detach_dependent_pp (struct proxy_participant *p, struct proxy_participant *proxypp, ddsrt_wctime_t timestamp, int isimplicit)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&p->e.lock);
 | 
			
		||||
  if (memcmp (&p->privileged_pp_guid, &proxypp->e.guid, sizeof (proxypp->e.guid)) != 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -4286,7 +4285,7 @@ static void delete_or_detach_dependent_pp (struct proxy_participant *p, struct p
 | 
			
		|||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    nn_etime_t texp = add_duration_to_etime (now_et(), p->e.gv->config.ds_grace_period);
 | 
			
		||||
    ddsrt_etime_t texp = ddsrt_etime_add_duration (ddsrt_time_elapsed(), p->e.gv->config.ds_grace_period);
 | 
			
		||||
    /* Clear dependency (but don't touch entity id, which must be 0x1c1) and set the lease ticking */
 | 
			
		||||
    ELOGDISC (p, PGUIDFMT" detach-from-DS "PGUIDFMT"\n", PGUID(p->e.guid), PGUID(proxypp->e.guid));
 | 
			
		||||
    memset (&p->privileged_pp_guid.prefix, 0, sizeof (p->privileged_pp_guid.prefix));
 | 
			
		||||
| 
						 | 
				
			
			@ -4296,7 +4295,7 @@ static void delete_or_detach_dependent_pp (struct proxy_participant *p, struct p
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void delete_ppt (struct proxy_participant *proxypp, nn_wctime_t timestamp, int isimplicit)
 | 
			
		||||
static void delete_ppt (struct proxy_participant *proxypp, ddsrt_wctime_t timestamp, int isimplicit)
 | 
			
		||||
{
 | 
			
		||||
  ddsi_entityid_t *eps;
 | 
			
		||||
  ddsi_guid_t ep_guid;
 | 
			
		||||
| 
						 | 
				
			
			@ -4351,7 +4350,7 @@ static void delete_ppt (struct proxy_participant *proxypp, nn_wctime_t timestamp
 | 
			
		|||
typedef struct proxy_purge_data {
 | 
			
		||||
  struct proxy_participant *proxypp;
 | 
			
		||||
  const nn_locator_t *loc;
 | 
			
		||||
  nn_wctime_t timestamp;
 | 
			
		||||
  ddsrt_wctime_t timestamp;
 | 
			
		||||
} *proxy_purge_data_t;
 | 
			
		||||
 | 
			
		||||
static void purge_helper (const nn_locator_t *n, void * varg)
 | 
			
		||||
| 
						 | 
				
			
			@ -4371,7 +4370,7 @@ void purge_proxy_participants (struct ddsi_domaingv *gv, const nn_locator_t *loc
 | 
			
		|||
 | 
			
		||||
  thread_state_awake_fixed_domain (ts1);
 | 
			
		||||
  data.loc = loc;
 | 
			
		||||
  data.timestamp = now();
 | 
			
		||||
  data.timestamp = ddsrt_time_wallclock();
 | 
			
		||||
  entidx_enum_proxy_participant_init (&est, gv->entity_index);
 | 
			
		||||
  while ((data.proxypp = entidx_enum_proxy_participant_next (&est)) != NULL)
 | 
			
		||||
    addrset_forall (data.proxypp->as_meta, purge_helper, &data);
 | 
			
		||||
| 
						 | 
				
			
			@ -4384,7 +4383,7 @@ void purge_proxy_participants (struct ddsi_domaingv *gv, const nn_locator_t *loc
 | 
			
		|||
  thread_state_asleep (ts1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int delete_proxy_participant_by_guid (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit)
 | 
			
		||||
int delete_proxy_participant_by_guid (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_participant *ppt;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4421,7 +4420,7 @@ uint64_t get_entity_instance_id (const struct ddsi_domaingv *gv, const struct dd
 | 
			
		|||
 | 
			
		||||
/* PROXY-ENDPOINT --------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
static int proxy_endpoint_common_init (struct entity_common *e, struct proxy_endpoint_common *c, enum entity_kind kind, const struct ddsi_guid *guid, nn_wctime_t tcreate, seqno_t seq, struct proxy_participant *proxypp, struct addrset *as, const ddsi_plist_t *plist)
 | 
			
		||||
static int proxy_endpoint_common_init (struct entity_common *e, struct proxy_endpoint_common *c, enum entity_kind kind, const struct ddsi_guid *guid, ddsrt_wctime_t tcreate, seqno_t seq, struct proxy_participant *proxypp, struct addrset *as, const ddsi_plist_t *plist)
 | 
			
		||||
{
 | 
			
		||||
  const char *name;
 | 
			
		||||
  int ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -4466,12 +4465,12 @@ static void proxy_endpoint_common_fini (struct entity_common *e, struct proxy_en
 | 
			
		|||
 | 
			
		||||
/* PROXY-WRITER ----------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
int new_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const ddsi_plist_t *plist, struct nn_dqueue *dqueue, struct xeventq *evq, nn_wctime_t timestamp, seqno_t seq)
 | 
			
		||||
int new_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const ddsi_plist_t *plist, struct nn_dqueue *dqueue, struct xeventq *evq, ddsrt_wctime_t timestamp, seqno_t seq)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_participant *proxypp;
 | 
			
		||||
  struct proxy_writer *pwr;
 | 
			
		||||
  int isreliable;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  assert (is_writer_entityid (guid->entityid));
 | 
			
		||||
| 
						 | 
				
			
			@ -4524,7 +4523,7 @@ int new_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid,
 | 
			
		|||
  assert (pwr->c.xqos->present & QP_LIVELINESS);
 | 
			
		||||
  if (pwr->c.xqos->liveliness.lease_duration != DDS_INFINITY)
 | 
			
		||||
  {
 | 
			
		||||
    nn_etime_t texpire = add_duration_to_etime (now_et (), pwr->c.xqos->liveliness.lease_duration);
 | 
			
		||||
    ddsrt_etime_t texpire = ddsrt_etime_add_duration (ddsrt_time_elapsed (), pwr->c.xqos->liveliness.lease_duration);
 | 
			
		||||
    pwr->lease = lease_new (texpire, pwr->c.xqos->liveliness.lease_duration, &pwr->e);
 | 
			
		||||
    if (pwr->c.xqos->liveliness.kind != DDS_LIVELINESS_MANUAL_BY_TOPIC)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -4573,7 +4572,7 @@ int new_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid,
 | 
			
		|||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void update_proxy_writer (struct proxy_writer *pwr, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, nn_wctime_t timestamp)
 | 
			
		||||
void update_proxy_writer (struct proxy_writer *pwr, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  struct reader * rd;
 | 
			
		||||
  struct pwr_rd_match * m;
 | 
			
		||||
| 
						 | 
				
			
			@ -4610,7 +4609,7 @@ void update_proxy_writer (struct proxy_writer *pwr, seqno_t seq, struct addrset
 | 
			
		|||
  ddsrt_mutex_unlock (&pwr->e.lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void update_proxy_reader (struct proxy_reader *prd, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, nn_wctime_t timestamp)
 | 
			
		||||
void update_proxy_reader (struct proxy_reader *prd, seqno_t seq, struct addrset *as, const struct dds_qos *xqos, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  struct prd_wr_match * m;
 | 
			
		||||
  ddsi_guid_t wrguid;
 | 
			
		||||
| 
						 | 
				
			
			@ -4692,7 +4691,7 @@ static void gc_delete_proxy_writer (struct gcreq *gcreq)
 | 
			
		|||
 | 
			
		||||
/* First stage in deleting the proxy writer. In this function the pwr and its member pointers
 | 
			
		||||
   will remain valid. The real cleaning-up is done async in gc_delete_proxy_writer. */
 | 
			
		||||
int delete_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit)
 | 
			
		||||
int delete_proxy_writer (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_writer *pwr;
 | 
			
		||||
  DDSRT_UNUSED_ARG (isimplicit);
 | 
			
		||||
| 
						 | 
				
			
			@ -4766,7 +4765,7 @@ void proxy_writer_set_alive_may_unlock (struct proxy_writer *pwr, bool notify)
 | 
			
		|||
    if (pwr->c.xqos->liveliness.kind != DDS_LIVELINESS_MANUAL_BY_TOPIC)
 | 
			
		||||
      proxy_participant_add_pwr_lease_locked (pwr->c.proxypp, pwr);
 | 
			
		||||
    else
 | 
			
		||||
      lease_set_expiry (pwr->lease, add_duration_to_etime (now_et (), pwr->lease->tdur));
 | 
			
		||||
      lease_set_expiry (pwr->lease, ddsrt_etime_add_duration (ddsrt_time_elapsed (), pwr->lease->tdur));
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&pwr->c.proxypp->e.lock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -4800,7 +4799,7 @@ int proxy_writer_set_notalive (struct proxy_writer *pwr, bool notify)
 | 
			
		|||
 | 
			
		||||
/* PROXY-READER ----------------------------------------------------- */
 | 
			
		||||
 | 
			
		||||
int new_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const ddsi_plist_t *plist, nn_wctime_t timestamp, seqno_t seq
 | 
			
		||||
int new_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid, const struct ddsi_guid *guid, struct addrset *as, const ddsi_plist_t *plist, ddsrt_wctime_t timestamp, seqno_t seq
 | 
			
		||||
#ifdef DDSI_INCLUDE_SSM
 | 
			
		||||
                      , int favours_ssm
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -4808,7 +4807,7 @@ int new_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *ppguid,
 | 
			
		|||
{
 | 
			
		||||
  struct proxy_participant *proxypp;
 | 
			
		||||
  struct proxy_reader *prd;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  int ret;
 | 
			
		||||
 | 
			
		||||
  assert (!is_writer_entityid (guid->entityid));
 | 
			
		||||
| 
						 | 
				
			
			@ -4911,7 +4910,7 @@ static void gc_delete_proxy_reader (struct gcreq *gcreq)
 | 
			
		|||
  ddsrt_free (prd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int delete_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, nn_wctime_t timestamp, int isimplicit)
 | 
			
		||||
int delete_proxy_reader (struct ddsi_domaingv *gv, const struct ddsi_guid *guid, ddsrt_wctime_t timestamp, int isimplicit)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_reader *prd;
 | 
			
		||||
  (void)isimplicit;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,6 @@
 | 
			
		|||
#include "dds/ddsi/q_gc.h"
 | 
			
		||||
#include "dds/ddsi/q_log.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_entity_index.h"
 | 
			
		||||
#include "dds/ddsi/q_unused.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -89,8 +88,8 @@ static int threads_vtime_check (uint32_t *nivs, struct idx_vtime *ivs)
 | 
			
		|||
static uint32_t gcreq_queue_thread (struct gcreq_queue *q)
 | 
			
		||||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  nn_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
  nn_mtime_t t_trigger_recv_threads = { 0 };
 | 
			
		||||
  ddsrt_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
  ddsrt_mtime_t t_trigger_recv_threads = { 0 };
 | 
			
		||||
  int64_t shortsleep = DDS_MSECS (1);
 | 
			
		||||
  int64_t delay = DDS_MSECS (1); /* force evaluation after startup */
 | 
			
		||||
  struct gcreq *gcreq = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +104,7 @@ static uint32_t gcreq_queue_thread (struct gcreq_queue *q)
 | 
			
		|||
       groups.  Do rate-limit it a bit. */
 | 
			
		||||
    if (q->gv->deaf)
 | 
			
		||||
    {
 | 
			
		||||
      nn_mtime_t tnow_mt = now_mt ();
 | 
			
		||||
      ddsrt_mtime_t tnow_mt = ddsrt_time_monotonic ();
 | 
			
		||||
      if (tnow_mt.v > t_trigger_recv_threads.v)
 | 
			
		||||
      {
 | 
			
		||||
        trigger_recv_threads (q->gv);
 | 
			
		||||
| 
						 | 
				
			
			@ -149,7 +148,7 @@ static uint32_t gcreq_queue_thread (struct gcreq_queue *q)
 | 
			
		|||
       burden on the system than having a separate thread or adding it
 | 
			
		||||
       to the workload of the data handling threads. */
 | 
			
		||||
    thread_state_awake_fixed_domain (ts1);
 | 
			
		||||
    delay = check_and_handle_lease_expiration (q->gv, now_et ());
 | 
			
		||||
    delay = check_and_handle_lease_expiration (q->gv, ddsrt_time_elapsed ());
 | 
			
		||||
    thread_state_asleep (ts1);
 | 
			
		||||
 | 
			
		||||
    if (gcreq)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -728,13 +728,13 @@ struct wait_for_receive_threads_helper_arg {
 | 
			
		|||
  unsigned count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void wait_for_receive_threads_helper (struct xevent *xev, void *varg, nn_mtime_t tnow)
 | 
			
		||||
static void wait_for_receive_threads_helper (struct xevent *xev, void *varg, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct wait_for_receive_threads_helper_arg * const arg = varg;
 | 
			
		||||
  if (arg->count++ == arg->gv->config.recv_thread_stop_maxretries)
 | 
			
		||||
    abort ();
 | 
			
		||||
  trigger_recv_threads (arg->gv);
 | 
			
		||||
  (void) resched_xevent_if_earlier (xev, add_duration_to_mtime (tnow, DDS_SECS (1)));
 | 
			
		||||
  (void) resched_xevent_if_earlier (xev, ddsrt_mtime_add_duration (tnow, DDS_SECS (1)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void wait_for_receive_threads (struct ddsi_domaingv *gv)
 | 
			
		||||
| 
						 | 
				
			
			@ -743,7 +743,7 @@ static void wait_for_receive_threads (struct ddsi_domaingv *gv)
 | 
			
		|||
  struct wait_for_receive_threads_helper_arg cbarg;
 | 
			
		||||
  cbarg.gv = gv;
 | 
			
		||||
  cbarg.count = 0;
 | 
			
		||||
  if ((trigev = qxev_callback (gv->xevents, add_duration_to_mtime (now_mt (), DDS_SECS (1)), wait_for_receive_threads_helper, &cbarg)) == NULL)
 | 
			
		||||
  if ((trigev = qxev_callback (gv->xevents, ddsrt_mtime_add_duration (ddsrt_time_monotonic (), DDS_SECS (1)), wait_for_receive_threads_helper, &cbarg)) == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    /* retrying is to deal a packet geting lost because the socket buffer is full or because the
 | 
			
		||||
       macOS firewall (and perhaps others) likes to ask if the process is allowed to receive data,
 | 
			
		||||
| 
						 | 
				
			
			@ -924,7 +924,7 @@ static uint32_t ddsi_sertopic_hash_wrap (const void *tp)
 | 
			
		|||
  return ddsi_sertopic_hash (tp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void reset_deaf_mute (struct xevent *xev, void *varg, UNUSED_ARG (nn_mtime_t tnow))
 | 
			
		||||
static void reset_deaf_mute (struct xevent *xev, void *varg, UNUSED_ARG (ddsrt_mtime_t tnow))
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv *gv = varg;
 | 
			
		||||
  gv->deaf = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -940,7 +940,7 @@ void ddsi_set_deafmute (struct ddsi_domaingv *gv, bool deaf, bool mute, int64_t
 | 
			
		|||
  GVLOGDISC (" DEAFMUTE set [deaf, mute]=[%d, %d]", gv->deaf, gv->mute);
 | 
			
		||||
  if (reset_after < DDS_INFINITY)
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t when = add_duration_to_mtime (now_mt (), reset_after);
 | 
			
		||||
    ddsrt_mtime_t when = ddsrt_mtime_add_duration (ddsrt_time_monotonic (), reset_after);
 | 
			
		||||
    GVTRACE (" reset after %"PRId64".%09u ns", reset_after / DDS_NSECS_IN_SEC, (unsigned) (reset_after % DDS_NSECS_IN_SEC));
 | 
			
		||||
    qxev_callback (gv->xevents, when, reset_deaf_mute, gv);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -952,9 +952,9 @@ int rtps_init (struct ddsi_domaingv *gv)
 | 
			
		|||
  uint32_t port_disc_uc = 0;
 | 
			
		||||
  uint32_t port_data_uc = 0;
 | 
			
		||||
  bool mc_available = true;
 | 
			
		||||
  nn_mtime_t reset_deaf_mute_time = NN_MTIME_NEVER;
 | 
			
		||||
  ddsrt_mtime_t reset_deaf_mute_time = DDSRT_MTIME_NEVER;
 | 
			
		||||
 | 
			
		||||
  gv->tstart = now ();    /* wall clock time, used in logs */
 | 
			
		||||
  gv->tstart = ddsrt_time_wallclock ();    /* wall clock time, used in logs */
 | 
			
		||||
 | 
			
		||||
  ddsi_plist_init_tables ();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -982,7 +982,7 @@ int rtps_init (struct ddsi_domaingv *gv)
 | 
			
		|||
  if (gv->deaf || gv->mute)
 | 
			
		||||
  {
 | 
			
		||||
    GVLOG (DDS_LC_CONFIG | DDS_LC_DISCOVERY, "DEAFMUTE initial deaf=%d mute=%d reset after %"PRId64"d ns\n", gv->deaf, gv->mute, gv->config.initial_deaf_mute_reset);
 | 
			
		||||
    reset_deaf_mute_time = add_duration_to_mtime (now_mt (), gv->config.initial_deaf_mute_reset);
 | 
			
		||||
    reset_deaf_mute_time = ddsrt_mtime_add_duration (ddsrt_time_monotonic (), gv->config.initial_deaf_mute_reset);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Initialize thread pool */
 | 
			
		||||
| 
						 | 
				
			
			@ -1640,7 +1640,7 @@ void rtps_stop (struct ddsi_domaingv *gv)
 | 
			
		|||
  {
 | 
			
		||||
    struct entidx_enum_proxy_participant est;
 | 
			
		||||
    struct proxy_participant *proxypp;
 | 
			
		||||
    const nn_wctime_t tnow = now();
 | 
			
		||||
    const ddsrt_wctime_t tnow = ddsrt_time_wallclock();
 | 
			
		||||
    /* Clean up proxy readers, proxy writers and proxy
 | 
			
		||||
       participants. Deleting a proxy participants deletes all its
 | 
			
		||||
       readers and writers automatically */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ void lease_management_term (struct ddsi_domaingv *gv)
 | 
			
		|||
  ddsrt_mutex_destroy (&gv->leaseheap_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct lease *lease_new (nn_etime_t texpire, dds_duration_t tdur, struct entity_common *e)
 | 
			
		||||
struct lease *lease_new (ddsrt_etime_t texpire, dds_duration_t tdur, struct entity_common *e)
 | 
			
		||||
{
 | 
			
		||||
  struct lease *l;
 | 
			
		||||
  if ((l = ddsrt_malloc (sizeof (*l))) == NULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +96,7 @@ struct lease *lease_new (nn_etime_t texpire, dds_duration_t tdur, struct entity_
 | 
			
		|||
 */
 | 
			
		||||
struct lease *lease_clone (const struct lease *l)
 | 
			
		||||
{
 | 
			
		||||
  nn_etime_t texp;
 | 
			
		||||
  ddsrt_etime_t texp;
 | 
			
		||||
  dds_duration_t tdur;
 | 
			
		||||
  texp.v = (int64_t) ddsrt_atomic_ld64 (&l->tend);
 | 
			
		||||
  tdur = l->tdur;
 | 
			
		||||
| 
						 | 
				
			
			@ -144,7 +144,7 @@ void lease_free (struct lease *l)
 | 
			
		|||
  ddsrt_free (l);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void trace_lease_renew (const struct lease *l, const char *tag, nn_etime_t tend_new)
 | 
			
		||||
static void trace_lease_renew (const struct lease *l, const char *tag, ddsrt_etime_t tend_new)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv const * gv = l->entity->gv;
 | 
			
		||||
  if (gv->logconfig.c.mask & DDS_LC_TRACE)
 | 
			
		||||
| 
						 | 
				
			
			@ -155,14 +155,14 @@ static void trace_lease_renew (const struct lease *l, const char *tag, nn_etime_
 | 
			
		|||
      GVTRACE (":%"PRIx32, l->entity->guid.entityid.u);
 | 
			
		||||
    else
 | 
			
		||||
      GVTRACE (""PGUIDFMT"", PGUID (l->entity->guid));
 | 
			
		||||
    etime_to_sec_usec (&tsec, &tusec, tend_new);
 | 
			
		||||
    ddsrt_etime_to_sec_usec (&tsec, &tusec, tend_new);
 | 
			
		||||
    GVTRACE (" %"PRId32".%06"PRId32")", tsec, tusec);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lease_renew (struct lease *l, nn_etime_t tnowE)
 | 
			
		||||
void lease_renew (struct lease *l, ddsrt_etime_t tnowE)
 | 
			
		||||
{
 | 
			
		||||
  nn_etime_t tend_new = add_duration_to_etime (tnowE, l->tdur);
 | 
			
		||||
  ddsrt_etime_t tend_new = ddsrt_etime_add_duration (tnowE, l->tdur);
 | 
			
		||||
 | 
			
		||||
  /* do not touch tend if moving forward or if already expired */
 | 
			
		||||
  int64_t tend;
 | 
			
		||||
| 
						 | 
				
			
			@ -179,7 +179,7 @@ void lease_renew (struct lease *l, nn_etime_t tnowE)
 | 
			
		|||
  trace_lease_renew (l, "", tend_new);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lease_set_expiry (struct lease *l, nn_etime_t when)
 | 
			
		||||
void lease_set_expiry (struct lease *l, ddsrt_etime_t when)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = l->entity->gv;
 | 
			
		||||
  bool trigger = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -212,7 +212,7 @@ void lease_set_expiry (struct lease *l, nn_etime_t when)
 | 
			
		|||
    force_lease_check (gv->gcreq_queue);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t check_and_handle_lease_expiration (struct ddsi_domaingv *gv, nn_etime_t tnowE)
 | 
			
		||||
int64_t check_and_handle_lease_expiration (struct ddsi_domaingv *gv, ddsrt_etime_t tnowE)
 | 
			
		||||
{
 | 
			
		||||
  struct lease *l;
 | 
			
		||||
  int64_t delay;
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ int64_t check_and_handle_lease_expiration (struct ddsi_domaingv *gv, nn_etime_t
 | 
			
		|||
          entidx_lookup_proxy_participant_guid (gv->entity_index, &proxypp->privileged_pp_guid) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        GVLOGDISC ("but postponing because privileged pp "PGUIDFMT" is still live\n", PGUID (proxypp->privileged_pp_guid));
 | 
			
		||||
        l->tsched = add_duration_to_etime (tnowE, DDS_MSECS (200));
 | 
			
		||||
        l->tsched = ddsrt_etime_add_duration (tnowE, DDS_MSECS (200));
 | 
			
		||||
        ddsrt_fibheap_insert (&lease_fhdef, &gv->leaseheap, l);
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -285,7 +285,7 @@ int64_t check_and_handle_lease_expiration (struct ddsi_domaingv *gv, nn_etime_t
 | 
			
		|||
    switch (k)
 | 
			
		||||
    {
 | 
			
		||||
      case EK_PROXY_PARTICIPANT:
 | 
			
		||||
        delete_proxy_participant_by_guid (gv, &g, now(), 1);
 | 
			
		||||
        delete_proxy_participant_by_guid (gv, &g, ddsrt_time_wallclock(), 1);
 | 
			
		||||
        break;
 | 
			
		||||
      case EK_PROXY_WRITER:
 | 
			
		||||
        proxy_writer_set_notalive ((struct proxy_writer *) l->entity, true);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,6 @@
 | 
			
		|||
 | 
			
		||||
#include "dds/ddsrt/endian.h"
 | 
			
		||||
#include "dds/ddsi/q_log.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_domaingv.h"
 | 
			
		||||
#include "dds/ddsi/q_bswap.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +126,7 @@ static uint16_t calc_ipv4_checksum (const uint16_t *x)
 | 
			
		|||
  return (uint16_t) ~s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void write_pcap_received (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const struct sockaddr_storage *src, const struct sockaddr_storage *dst, unsigned char *buf, size_t sz)
 | 
			
		||||
void write_pcap_received (struct ddsi_domaingv *gv, ddsrt_wctime_t tstamp, const struct sockaddr_storage *src, const struct sockaddr_storage *dst, unsigned char *buf, size_t sz)
 | 
			
		||||
{
 | 
			
		||||
  if (gv->config.transport_selector == TRANS_UDP)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +139,7 @@ void write_pcap_received (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const st
 | 
			
		|||
    size_t sz_ud = sz + UDP_HDR_SIZE;
 | 
			
		||||
    size_t sz_iud = sz_ud + IPV4_HDR_SIZE;
 | 
			
		||||
    ddsrt_mutex_lock (&gv->pcap_lock);
 | 
			
		||||
    wctime_to_sec_usec (&pcap_hdr.ts_sec, &pcap_hdr.ts_usec, tstamp);
 | 
			
		||||
    ddsrt_wctime_to_sec_usec (&pcap_hdr.ts_sec, &pcap_hdr.ts_usec, tstamp);
 | 
			
		||||
    pcap_hdr.incl_len = pcap_hdr.orig_len = (uint32_t) sz_iud;
 | 
			
		||||
    (void) fwrite (&pcap_hdr, sizeof (pcap_hdr), 1, gv->pcap_fp);
 | 
			
		||||
    u.ipv4_hdr = ipv4_hdr_template;
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +159,7 @@ void write_pcap_received (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const st
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void write_pcap_sent (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const struct sockaddr_storage *src, const ddsrt_msghdr_t *hdr, size_t sz)
 | 
			
		||||
void write_pcap_sent (struct ddsi_domaingv *gv, ddsrt_wctime_t tstamp, const struct sockaddr_storage *src, const ddsrt_msghdr_t *hdr, size_t sz)
 | 
			
		||||
{
 | 
			
		||||
  if (gv->config.transport_selector == TRANS_UDP)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -173,7 +172,7 @@ void write_pcap_sent (struct ddsi_domaingv *gv, nn_wctime_t tstamp, const struct
 | 
			
		|||
    size_t sz_ud = sz + UDP_HDR_SIZE;
 | 
			
		||||
    size_t sz_iud = sz_ud + IPV4_HDR_SIZE;
 | 
			
		||||
    ddsrt_mutex_lock (&gv->pcap_lock);
 | 
			
		||||
    wctime_to_sec_usec (&pcap_hdr.ts_sec, &pcap_hdr.ts_usec, tstamp);
 | 
			
		||||
    ddsrt_wctime_to_sec_usec (&pcap_hdr.ts_sec, &pcap_hdr.ts_usec, tstamp);
 | 
			
		||||
    pcap_hdr.incl_len = pcap_hdr.orig_len = (uint32_t) sz_iud;
 | 
			
		||||
    (void) fwrite (&pcap_hdr, sizeof (pcap_hdr), 1, gv->pcap_fp);
 | 
			
		||||
    u.ipv4_hdr = ipv4_hdr_template;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,6 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_xqos.h"
 | 
			
		||||
#include "dds/ddsi/q_misc.h"
 | 
			
		||||
#include "dds/ddsi/q_qosmatch.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2427,7 +2427,7 @@ static uint32_t dqueue_thread (struct nn_dqueue *q)
 | 
			
		|||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  struct ddsi_domaingv const * const gv = ddsrt_atomic_ldvoidp (&ts1->gv);
 | 
			
		||||
  nn_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
  ddsrt_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
  int keepgoing = 1;
 | 
			
		||||
  ddsi_guid_t rdguid, *prdguid = NULL;
 | 
			
		||||
  uint32_t rdguid_count = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -205,7 +205,7 @@ static int valid_InfoTS (InfoTS_t *msg, size_t size, int byteswap)
 | 
			
		|||
      msg->time.seconds = ddsrt_bswap4 (msg->time.seconds);
 | 
			
		||||
      msg->time.fraction = ddsrt_bswap4u (msg->time.fraction);
 | 
			
		||||
    }
 | 
			
		||||
    return valid_ddsi_timestamp (msg->time);
 | 
			
		||||
    return ddsi_is_valid_timestamp (msg->time);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -585,7 +585,7 @@ static int acknack_is_nack (const AckNack_t *msg)
 | 
			
		|||
  return x != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int accept_ack_or_hb_w_timeout (nn_count_t new_count, nn_count_t *exp_count, nn_etime_t tnow, nn_etime_t *t_last_accepted, int force_accept)
 | 
			
		||||
static int accept_ack_or_hb_w_timeout (nn_count_t new_count, nn_count_t *exp_count, ddsrt_etime_t tnow, ddsrt_etime_t *t_last_accepted, int force_accept)
 | 
			
		||||
{
 | 
			
		||||
  /* AckNacks and Heartbeats with a sequence number (called "count"
 | 
			
		||||
     for some reason) equal to or less than the highest one received
 | 
			
		||||
| 
						 | 
				
			
			@ -613,7 +613,7 @@ static int accept_ack_or_hb_w_timeout (nn_count_t new_count, nn_count_t *exp_cou
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_AckNack (struct receiver_state *rst, nn_etime_t tnow, const AckNack_t *msg, nn_wctime_t timestamp)
 | 
			
		||||
static int handle_AckNack (struct receiver_state *rst, ddsrt_etime_t tnow, const AckNack_t *msg, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_reader *prd;
 | 
			
		||||
  struct wr_prd_match *rn;
 | 
			
		||||
| 
						 | 
				
			
			@ -712,7 +712,7 @@ static int handle_AckNack (struct receiver_state *rst, nn_etime_t tnow, const Ac
 | 
			
		|||
     moment. */
 | 
			
		||||
  if (rst->gv->config.meas_hb_to_ack_latency && timestamp.v)
 | 
			
		||||
  {
 | 
			
		||||
    nn_wctime_t tstamp_now = now ();
 | 
			
		||||
    ddsrt_wctime_t tstamp_now = ddsrt_time_wallclock ();
 | 
			
		||||
    nn_lat_estim_update (&rn->hb_to_ack_latency, tstamp_now.v - timestamp.v);
 | 
			
		||||
    if ((rst->gv->logconfig.c.mask & DDS_LC_TRACE) && tstamp_now.v > rn->hb_to_ack_latency_tlastlog.v + DDS_SECS (10))
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -860,7 +860,7 @@ static int handle_AckNack (struct receiver_state *rst, nn_etime_t tnow, const Ac
 | 
			
		|||
        if (rst->gv->config.retransmit_merging != REXMIT_MERGE_NEVER && rn->assumed_in_sync)
 | 
			
		||||
        {
 | 
			
		||||
          /* send retransmit to all receivers, but skip if recently done */
 | 
			
		||||
          nn_mtime_t tstamp = now_mt ();
 | 
			
		||||
          ddsrt_mtime_t tstamp = ddsrt_time_monotonic ();
 | 
			
		||||
          if (tstamp.v > sample.last_rexmit_ts.v + rst->gv->config.retransmit_merging_period)
 | 
			
		||||
          {
 | 
			
		||||
            RSTTRACE (" RX%"PRId64, seqbase + i);
 | 
			
		||||
| 
						 | 
				
			
			@ -968,7 +968,7 @@ static int handle_AckNack (struct receiver_state *rst, nn_etime_t tnow, const Ac
 | 
			
		|||
       gradually lowering rate.  If we just got a request for a
 | 
			
		||||
       retransmit, and there is more to be retransmitted, surely the
 | 
			
		||||
       rate should be kept up for now */
 | 
			
		||||
    writer_hbcontrol_note_asyncwrite (wr, now_mt ());
 | 
			
		||||
    writer_hbcontrol_note_asyncwrite (wr, ddsrt_time_monotonic ());
 | 
			
		||||
  }
 | 
			
		||||
  /* If "final" flag not set, we must respond with a heartbeat. Do it
 | 
			
		||||
     now if we haven't done so already */
 | 
			
		||||
| 
						 | 
				
			
			@ -1033,9 +1033,9 @@ struct handle_Heartbeat_helper_arg {
 | 
			
		|||
  struct receiver_state *rst;
 | 
			
		||||
  const Heartbeat_t *msg;
 | 
			
		||||
  struct proxy_writer *pwr;
 | 
			
		||||
  nn_wctime_t timestamp;
 | 
			
		||||
  nn_etime_t tnow;
 | 
			
		||||
  nn_mtime_t tnow_mt;
 | 
			
		||||
  ddsrt_wctime_t timestamp;
 | 
			
		||||
  ddsrt_etime_t tnow;
 | 
			
		||||
  ddsrt_mtime_t tnow_mt;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void handle_Heartbeat_helper (struct pwr_rd_match * const wn, struct handle_Heartbeat_helper_arg * const arg)
 | 
			
		||||
| 
						 | 
				
			
			@ -1072,7 +1072,7 @@ static void handle_Heartbeat_helper (struct pwr_rd_match * const wn, struct hand
 | 
			
		|||
     once, regardless of which readers care about it. */
 | 
			
		||||
  if (wn->acknack_xevent)
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tsched = NN_MTIME_NEVER;
 | 
			
		||||
    ddsrt_mtime_t tsched = DDSRT_MTIME_NEVER;
 | 
			
		||||
    if (pwr->last_seq > refseq)
 | 
			
		||||
    {
 | 
			
		||||
      RSTTRACE ("/NAK");
 | 
			
		||||
| 
						 | 
				
			
			@ -1096,7 +1096,7 @@ static void handle_Heartbeat_helper (struct pwr_rd_match * const wn, struct hand
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_Heartbeat (struct receiver_state *rst, nn_etime_t tnow, struct nn_rmsg *rmsg, const Heartbeat_t *msg, nn_wctime_t timestamp)
 | 
			
		||||
static int handle_Heartbeat (struct receiver_state *rst, ddsrt_etime_t tnow, struct nn_rmsg *rmsg, const Heartbeat_t *msg, ddsrt_wctime_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  /* We now cheat: and process the heartbeat for _all_ readers,
 | 
			
		||||
     always, regardless of the destination address in the Heartbeat
 | 
			
		||||
| 
						 | 
				
			
			@ -1243,7 +1243,7 @@ static int handle_Heartbeat (struct receiver_state *rst, nn_etime_t tnow, struct
 | 
			
		|||
  arg.pwr = pwr;
 | 
			
		||||
  arg.timestamp = timestamp;
 | 
			
		||||
  arg.tnow = tnow;
 | 
			
		||||
  arg.tnow_mt = now_mt ();
 | 
			
		||||
  arg.tnow_mt = ddsrt_time_monotonic ();
 | 
			
		||||
  handle_forall_destinations (&dst, pwr, (ddsrt_avl_walk_t) handle_Heartbeat_helper, &arg);
 | 
			
		||||
  RSTTRACE (")");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1251,7 +1251,7 @@ static int handle_Heartbeat (struct receiver_state *rst, nn_etime_t tnow, struct
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_HeartbeatFrag (struct receiver_state *rst, UNUSED_ARG(nn_etime_t tnow), const HeartbeatFrag_t *msg)
 | 
			
		||||
static int handle_HeartbeatFrag (struct receiver_state *rst, UNUSED_ARG(ddsrt_etime_t tnow), const HeartbeatFrag_t *msg)
 | 
			
		||||
{
 | 
			
		||||
  const seqno_t seq = fromSN (msg->writerSN);
 | 
			
		||||
  const nn_fragment_number_t fragnum = msg->lastFragmentNum - 1; /* we do 0-based */
 | 
			
		||||
| 
						 | 
				
			
			@ -1353,7 +1353,7 @@ static int handle_HeartbeatFrag (struct receiver_state *rst, UNUSED_ARG(nn_etime
 | 
			
		|||
           samples we no longer care about) */
 | 
			
		||||
        int64_t delay = rst->gv->config.nack_delay;
 | 
			
		||||
        RSTTRACE ("/nackfrag");
 | 
			
		||||
        (void) resched_xevent_if_earlier (m->acknack_xevent, add_duration_to_mtime (now_mt(), delay));
 | 
			
		||||
        (void) resched_xevent_if_earlier (m->acknack_xevent, ddsrt_mtime_add_duration (ddsrt_time_monotonic(), delay));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1362,7 +1362,7 @@ static int handle_HeartbeatFrag (struct receiver_state *rst, UNUSED_ARG(nn_etime
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_NackFrag (struct receiver_state *rst, nn_etime_t tnow, const NackFrag_t *msg)
 | 
			
		||||
static int handle_NackFrag (struct receiver_state *rst, ddsrt_etime_t tnow, const NackFrag_t *msg)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_reader *prd;
 | 
			
		||||
  struct wr_prd_match *rn;
 | 
			
		||||
| 
						 | 
				
			
			@ -1475,7 +1475,7 @@ static int handle_NackFrag (struct receiver_state *rst, nn_etime_t tnow, const N
 | 
			
		|||
    struct whc_state whcst;
 | 
			
		||||
    whc_get_state(wr->whc, &whcst);
 | 
			
		||||
    force_heartbeat_to_peer (wr, &whcst, prd, 1);
 | 
			
		||||
    writer_hbcontrol_note_asyncwrite (wr, now_mt ());
 | 
			
		||||
    writer_hbcontrol_note_asyncwrite (wr, ddsrt_time_monotonic ());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 out:
 | 
			
		||||
| 
						 | 
				
			
			@ -1515,17 +1515,17 @@ static int handle_InfoSRC (struct receiver_state *rst, const InfoSRC_t *msg)
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_InfoTS (const struct receiver_state *rst, const InfoTS_t *msg, nn_wctime_t *timestamp)
 | 
			
		||||
static int handle_InfoTS (const struct receiver_state *rst, const InfoTS_t *msg, ddsrt_wctime_t *timestamp)
 | 
			
		||||
{
 | 
			
		||||
  RSTTRACE ("INFOTS(");
 | 
			
		||||
  if (msg->smhdr.flags & INFOTS_INVALIDATE_FLAG)
 | 
			
		||||
  {
 | 
			
		||||
    *timestamp = NN_WCTIME_INVALID;
 | 
			
		||||
    *timestamp = DDSRT_WCTIME_INVALID;
 | 
			
		||||
    RSTTRACE ("invalidate");
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    *timestamp = nn_wctime_from_ddsi_time (msg->time);
 | 
			
		||||
    *timestamp = ddsi_wctime_from_ddsi_time (msg->time);
 | 
			
		||||
    if (rst->gv->logconfig.c.mask & DDS_LC_TRACE)
 | 
			
		||||
      RSTTRACE ("%d.%09d", (int) (timestamp->v / 1000000000), (int) (timestamp->v % 1000000000));
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1597,7 +1597,7 @@ static int handle_one_gap (struct proxy_writer *pwr, struct pwr_rd_match *wn, se
 | 
			
		|||
  return gap_was_valuable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_Gap (struct receiver_state *rst, nn_etime_t tnow, struct nn_rmsg *rmsg, const Gap_t *msg)
 | 
			
		||||
static int handle_Gap (struct receiver_state *rst, ddsrt_etime_t tnow, struct nn_rmsg *rmsg, const Gap_t *msg)
 | 
			
		||||
{
 | 
			
		||||
  /* Option 1: Process the Gap for the proxy writer and all
 | 
			
		||||
     out-of-sync readers: what do I care which reader is being
 | 
			
		||||
| 
						 | 
				
			
			@ -1722,7 +1722,7 @@ static int handle_Gap (struct receiver_state *rst, nn_etime_t tnow, struct nn_rm
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct ddsi_serdata *get_serdata (struct ddsi_sertopic const * const topic, const struct nn_rdata *fragchain, uint32_t sz, int justkey, unsigned statusinfo, nn_wctime_t tstamp)
 | 
			
		||||
static struct ddsi_serdata *get_serdata (struct ddsi_sertopic const * const topic, const struct nn_rdata *fragchain, uint32_t sz, int justkey, unsigned statusinfo, ddsrt_wctime_t tstamp)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_serdata *sd = ddsi_serdata_from_ser (topic, justkey ? SDK_KEY : SDK_DATA, fragchain, sz);
 | 
			
		||||
  if (sd)
 | 
			
		||||
| 
						 | 
				
			
			@ -1739,7 +1739,7 @@ struct remote_sourceinfo {
 | 
			
		|||
  const ddsi_plist_t *qos;
 | 
			
		||||
  const struct nn_rdata *fragchain;
 | 
			
		||||
  unsigned statusinfo;
 | 
			
		||||
  nn_wctime_t tstamp;
 | 
			
		||||
  ddsrt_wctime_t tstamp;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ddsi_serdata *remote_make_sample (struct ddsi_tkmap_instance **tk, struct ddsi_domaingv *gv, struct ddsi_sertopic const * const topic, void *vsourceinfo)
 | 
			
		||||
| 
						 | 
				
			
			@ -1751,7 +1751,7 @@ static struct ddsi_serdata *remote_make_sample (struct ddsi_tkmap_instance **tk,
 | 
			
		|||
  const struct nn_rdata * __restrict fragchain = si->fragchain;
 | 
			
		||||
  const uint32_t statusinfo = si->statusinfo;
 | 
			
		||||
  const unsigned char data_smhdr_flags = si->data_smhdr_flags;
 | 
			
		||||
  const nn_wctime_t tstamp = si->tstamp;
 | 
			
		||||
  const ddsrt_wctime_t tstamp = si->tstamp;
 | 
			
		||||
  const ddsi_plist_t * __restrict qos = si->qos;
 | 
			
		||||
  const char *failmsg = NULL;
 | 
			
		||||
  struct ddsi_serdata *sample = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1984,7 +1984,7 @@ static int deliver_user_data (const struct nn_rsample_info *sampleinfo, const st
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* FIXME: should it be 0, local wall clock time or INVALID? */
 | 
			
		||||
  const nn_wctime_t tstamp = (sampleinfo->timestamp.v != NN_WCTIME_INVALID.v) ? sampleinfo->timestamp : ((nn_wctime_t) {0});
 | 
			
		||||
  const ddsrt_wctime_t tstamp = (sampleinfo->timestamp.v != DDSRT_WCTIME_INVALID.v) ? sampleinfo->timestamp : ((ddsrt_wctime_t) {0});
 | 
			
		||||
  struct ddsi_writer_info wrinfo;
 | 
			
		||||
  ddsi_make_writer_info (&wrinfo, &pwr->e, pwr->c.xqos, statusinfo);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2052,7 +2052,7 @@ static void clean_defrag (struct proxy_writer *pwr)
 | 
			
		|||
  nn_defrag_notegap (pwr->defrag, 1, seq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_regular (struct receiver_state *rst, nn_etime_t tnow, struct nn_rmsg *rmsg, const Data_DataFrag_common_t *msg, const struct nn_rsample_info *sampleinfo,
 | 
			
		||||
static void handle_regular (struct receiver_state *rst, ddsrt_etime_t tnow, struct nn_rmsg *rmsg, const Data_DataFrag_common_t *msg, const struct nn_rsample_info *sampleinfo,
 | 
			
		||||
    uint32_t fragnum, struct nn_rdata *rdata, struct nn_dqueue **deferred_wakeup, bool renew_manbypp_lease)
 | 
			
		||||
{
 | 
			
		||||
  struct proxy_writer *pwr;
 | 
			
		||||
| 
						 | 
				
			
			@ -2320,7 +2320,7 @@ static void drop_oversize (struct receiver_state *rst, struct nn_rmsg *rmsg, con
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_Data (struct receiver_state *rst, nn_etime_t tnow, struct nn_rmsg *rmsg, const Data_t *msg, size_t size, struct nn_rsample_info *sampleinfo, unsigned char *datap, struct nn_dqueue **deferred_wakeup)
 | 
			
		||||
static int handle_Data (struct receiver_state *rst, ddsrt_etime_t tnow, struct nn_rmsg *rmsg, const Data_t *msg, size_t size, struct nn_rsample_info *sampleinfo, unsigned char *datap, struct nn_dqueue **deferred_wakeup)
 | 
			
		||||
{
 | 
			
		||||
  RSTTRACE ("DATA("PGUIDFMT" -> "PGUIDFMT" #%"PRId64,
 | 
			
		||||
            PGUIDPREFIX (rst->src_guid_prefix), msg->x.writerId.u,
 | 
			
		||||
| 
						 | 
				
			
			@ -2372,7 +2372,7 @@ static int handle_Data (struct receiver_state *rst, nn_etime_t tnow, struct nn_r
 | 
			
		|||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int handle_DataFrag (struct receiver_state *rst, nn_etime_t tnow, struct nn_rmsg *rmsg, const DataFrag_t *msg, size_t size, struct nn_rsample_info *sampleinfo, unsigned char *datap, struct nn_dqueue **deferred_wakeup)
 | 
			
		||||
static int handle_DataFrag (struct receiver_state *rst, ddsrt_etime_t tnow, struct nn_rmsg *rmsg, const DataFrag_t *msg, size_t size, struct nn_rsample_info *sampleinfo, unsigned char *datap, struct nn_dqueue **deferred_wakeup)
 | 
			
		||||
{
 | 
			
		||||
  RSTTRACE ("DATAFRAG("PGUIDFMT" -> "PGUIDFMT" #%"PRId64"/[%u..%u]",
 | 
			
		||||
            PGUIDPREFIX (rst->src_guid_prefix), msg->x.writerId.u,
 | 
			
		||||
| 
						 | 
				
			
			@ -2586,8 +2586,8 @@ static int handle_submsg_sequence
 | 
			
		|||
  struct ddsi_domaingv *gv,
 | 
			
		||||
  ddsi_tran_conn_t conn,
 | 
			
		||||
  const nn_locator_t *srcloc,
 | 
			
		||||
  nn_wctime_t tnowWC,
 | 
			
		||||
  nn_etime_t tnowE,
 | 
			
		||||
  ddsrt_wctime_t tnowWC,
 | 
			
		||||
  ddsrt_etime_t tnowE,
 | 
			
		||||
  const ddsi_guid_prefix_t * const src_prefix,
 | 
			
		||||
  const ddsi_guid_prefix_t * const dst_prefix,
 | 
			
		||||
  unsigned char * const msg /* NOT const - we may byteswap it */,
 | 
			
		||||
| 
						 | 
				
			
			@ -2601,7 +2601,7 @@ static int handle_submsg_sequence
 | 
			
		|||
  Header_t * hdr = (Header_t *) msg;
 | 
			
		||||
  struct receiver_state *rst;
 | 
			
		||||
  int rst_live, ts_for_latmeas;
 | 
			
		||||
  nn_wctime_t timestamp;
 | 
			
		||||
  ddsrt_wctime_t timestamp;
 | 
			
		||||
  size_t submsg_size = 0;
 | 
			
		||||
  unsigned char * end = msg + len;
 | 
			
		||||
  struct nn_dqueue *deferred_wakeup = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -2632,7 +2632,7 @@ static int handle_submsg_sequence
 | 
			
		|||
  rst->gv = gv;
 | 
			
		||||
  rst_live = 0;
 | 
			
		||||
  ts_for_latmeas = 0;
 | 
			
		||||
  timestamp = NN_WCTIME_INVALID;
 | 
			
		||||
  timestamp = DDSRT_WCTIME_INVALID;
 | 
			
		||||
 | 
			
		||||
  assert (thread_is_asleep ());
 | 
			
		||||
  thread_state_awake_fixed_domain (ts1);
 | 
			
		||||
| 
						 | 
				
			
			@ -2687,14 +2687,14 @@ static int handle_submsg_sequence
 | 
			
		|||
        state = "parse:acknack";
 | 
			
		||||
        if (!valid_AckNack (rst, &sm->acknack, submsg_size, byteswap))
 | 
			
		||||
          goto malformed;
 | 
			
		||||
        handle_AckNack (rst, tnowE, &sm->acknack, ts_for_latmeas ? timestamp : NN_WCTIME_INVALID);
 | 
			
		||||
        handle_AckNack (rst, tnowE, &sm->acknack, ts_for_latmeas ? timestamp : DDSRT_WCTIME_INVALID);
 | 
			
		||||
        ts_for_latmeas = 0;
 | 
			
		||||
        break;
 | 
			
		||||
      case SMID_HEARTBEAT:
 | 
			
		||||
        state = "parse:heartbeat";
 | 
			
		||||
        if (!valid_Heartbeat (&sm->heartbeat, submsg_size, byteswap))
 | 
			
		||||
          goto malformed;
 | 
			
		||||
        handle_Heartbeat (rst, tnowE, rmsg, &sm->heartbeat, ts_for_latmeas ? timestamp : NN_WCTIME_INVALID);
 | 
			
		||||
        handle_Heartbeat (rst, tnowE, rmsg, &sm->heartbeat, ts_for_latmeas ? timestamp : DDSRT_WCTIME_INVALID);
 | 
			
		||||
        ts_for_latmeas = 0;
 | 
			
		||||
        break;
 | 
			
		||||
      case SMID_GAP:
 | 
			
		||||
| 
						 | 
				
			
			@ -2975,7 +2975,7 @@ static bool do_packet (struct thread_state1 * const ts1, struct ddsi_domaingv *g
 | 
			
		|||
                 PGUIDPREFIX (hdr->guid_prefix), hdr->vendorid.id[0], hdr->vendorid.id[1], (unsigned long) sz, addrstr);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      handle_submsg_sequence (ts1, gv, conn, &srcloc, now (), now_et (), &hdr->guid_prefix, guidprefix, buff, (size_t) sz, buff + RTPS_MESSAGE_HEADER_SIZE, rmsg);
 | 
			
		||||
      handle_submsg_sequence (ts1, gv, conn, &srcloc, ddsrt_time_wallclock (), ddsrt_time_elapsed (), &hdr->guid_prefix, guidprefix, buff, (size_t) sz, buff + RTPS_MESSAGE_HEADER_SIZE, rmsg);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  nn_rmsg_commit (rmsg);
 | 
			
		||||
| 
						 | 
				
			
			@ -3174,7 +3174,7 @@ uint32_t recv_thread (void *vrecv_thread_arg)
 | 
			
		|||
  struct ddsi_domaingv * const gv = recv_thread_arg->gv;
 | 
			
		||||
  struct nn_rbufpool *rbpool = recv_thread_arg->rbpool;
 | 
			
		||||
  os_sockWaitset waitset = recv_thread_arg->mode == RTM_MANY ? recv_thread_arg->u.many.ws : NULL;
 | 
			
		||||
  nn_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
  ddsrt_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
 | 
			
		||||
  nn_rbufpool_setowner (rbpool, ddsrt_thread_self ());
 | 
			
		||||
  if (waitset == NULL)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,185 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
 | 
			
		||||
nn_wctime_t now (void)
 | 
			
		||||
{
 | 
			
		||||
  /* This function uses the wall clock.
 | 
			
		||||
   * This clock is not affected by time spent in suspend mode.
 | 
			
		||||
   * This clock is affected when the real time system clock jumps
 | 
			
		||||
   * forwards/backwards */
 | 
			
		||||
  nn_wctime_t t;
 | 
			
		||||
  t.v = dds_time();
 | 
			
		||||
  return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_mtime_t now_mt (void)
 | 
			
		||||
{
 | 
			
		||||
  /* This function uses the monotonic clock.
 | 
			
		||||
   * This clock stops while the system is in suspend mode.
 | 
			
		||||
   * This clock is not affected by any jumps of the realtime clock. */
 | 
			
		||||
  nn_mtime_t t;
 | 
			
		||||
  t.v = ddsrt_time_monotonic();
 | 
			
		||||
  return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_etime_t now_et (void)
 | 
			
		||||
{
 | 
			
		||||
  /* This function uses the elapsed clock.
 | 
			
		||||
   * This clock is not affected by any jumps of the realtime clock.
 | 
			
		||||
   * This clock does NOT stop when the system is in suspend mode.
 | 
			
		||||
   * This clock stops when the system is shut down, and starts when the system is restarted.
 | 
			
		||||
   * When restarted, there are no assumptions about the initial value of clock. */
 | 
			
		||||
  nn_etime_t t;
 | 
			
		||||
  t.v = ddsrt_time_elapsed();
 | 
			
		||||
  return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void time_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, int64_t t)
 | 
			
		||||
{
 | 
			
		||||
  *sec = (int32_t) (t / DDS_NSECS_IN_SEC);
 | 
			
		||||
  *usec = (int32_t) (t % DDS_NSECS_IN_SEC) / 1000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mtime_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, nn_mtime_t t)
 | 
			
		||||
{
 | 
			
		||||
  time_to_sec_usec (sec, usec, t.v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void wctime_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, nn_wctime_t t)
 | 
			
		||||
{
 | 
			
		||||
  time_to_sec_usec (sec, usec, t.v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void etime_to_sec_usec (int32_t * __restrict sec, int32_t * __restrict usec, nn_etime_t t)
 | 
			
		||||
{
 | 
			
		||||
  time_to_sec_usec (sec, usec, t.v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nn_mtime_t mtime_round_up (nn_mtime_t t, int64_t round)
 | 
			
		||||
{
 | 
			
		||||
  /* This function rounds up t to the nearest next multiple of round.
 | 
			
		||||
     t is nanoseconds, round is milliseconds.  Avoid functions from
 | 
			
		||||
     maths libraries to keep code portable */
 | 
			
		||||
  assert (t.v >= 0 && round >= 0);
 | 
			
		||||
  if (round == 0 || t.v == DDS_INFINITY)
 | 
			
		||||
  {
 | 
			
		||||
    return t;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    int64_t remainder = t.v % round;
 | 
			
		||||
    if (remainder == 0)
 | 
			
		||||
    {
 | 
			
		||||
      return t;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      nn_mtime_t u;
 | 
			
		||||
      u.v = t.v + round - remainder;
 | 
			
		||||
      return u;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t add_duration_to_time (int64_t t, int64_t d)
 | 
			
		||||
{
 | 
			
		||||
  uint64_t sum;
 | 
			
		||||
  assert (t >= 0 && d >= 0);
 | 
			
		||||
  sum = (uint64_t)t + (uint64_t)d;
 | 
			
		||||
  return sum >= DDS_NEVER ? DDS_NEVER : (int64_t)sum;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_mtime_t add_duration_to_mtime (nn_mtime_t t, int64_t d)
 | 
			
		||||
{
 | 
			
		||||
  /* assumed DDS_NEVER <=> MAX_INT64 */
 | 
			
		||||
  nn_mtime_t u;
 | 
			
		||||
  u.v = add_duration_to_time (t.v, d);
 | 
			
		||||
  return u;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_wctime_t add_duration_to_wctime (nn_wctime_t t, int64_t d)
 | 
			
		||||
{
 | 
			
		||||
  /* assumed DDS_NEVER <=> MAX_INT64 */
 | 
			
		||||
  nn_wctime_t u;
 | 
			
		||||
  u.v = add_duration_to_time (t.v, d);
 | 
			
		||||
  return u;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_etime_t add_duration_to_etime (nn_etime_t t, int64_t d)
 | 
			
		||||
{
 | 
			
		||||
  /* assumed DDS_NEVER <=> MAX_INT64 */
 | 
			
		||||
  nn_etime_t u;
 | 
			
		||||
  u.v = add_duration_to_time (t.v, d);
 | 
			
		||||
  return u;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int valid_ddsi_timestamp (ddsi_time_t t)
 | 
			
		||||
{
 | 
			
		||||
  return t.seconds != DDSI_TIME_INVALID.seconds && t.fraction != DDSI_TIME_INVALID.fraction;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ddsi_time_t nn_to_ddsi_time (int64_t t)
 | 
			
		||||
{
 | 
			
		||||
  if (t == DDS_NEVER)
 | 
			
		||||
    return DDSI_TIME_INFINITE;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* ceiling(ns * 2^32/10^9) -- can't change the ceiling to round-to-nearest
 | 
			
		||||
       because that would break backwards compatibility, but round-to-nearest
 | 
			
		||||
       of the inverse is correctly rounded anyway, so it shouldn't ever matter. */
 | 
			
		||||
    ddsi_time_t x;
 | 
			
		||||
    int ns = (int) (t % DDS_NSECS_IN_SEC);
 | 
			
		||||
    x.seconds = (int) (t / DDS_NSECS_IN_SEC);
 | 
			
		||||
    x.fraction = (unsigned) (((DDS_NSECS_IN_SEC-1) + ((int64_t) ns << 32)) / DDS_NSECS_IN_SEC);
 | 
			
		||||
    return x;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ddsi_time_t nn_wctime_to_ddsi_time (nn_wctime_t t)
 | 
			
		||||
{
 | 
			
		||||
  return nn_to_ddsi_time (t.v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t nn_from_ddsi_time (ddsi_time_t x)
 | 
			
		||||
{
 | 
			
		||||
  if (x.seconds == DDSI_TIME_INFINITE.seconds && x.fraction == DDSI_TIME_INFINITE.fraction)
 | 
			
		||||
    return DDS_NEVER;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* Round-to-nearest conversion of DDSI time fraction to nanoseconds */
 | 
			
		||||
    int ns = (int) (((int64_t) 2147483648u + (int64_t) x.fraction * DDS_NSECS_IN_SEC) >> 32);
 | 
			
		||||
    return x.seconds * DDS_NSECS_IN_SEC + ns;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nn_wctime_t nn_wctime_from_ddsi_time (ddsi_time_t x)
 | 
			
		||||
{
 | 
			
		||||
  nn_wctime_t t;
 | 
			
		||||
  t.v = nn_from_ddsi_time (x);
 | 
			
		||||
  return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ddsi_duration_t nn_to_ddsi_duration (int64_t x)
 | 
			
		||||
{
 | 
			
		||||
  return nn_to_ddsi_time (x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t nn_from_ddsi_duration (ddsi_duration_t x)
 | 
			
		||||
{
 | 
			
		||||
  return nn_from_ddsi_time (x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,6 @@
 | 
			
		|||
#include "dds/ddsi/q_misc.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_xevent.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_domaingv.h"
 | 
			
		||||
#include "dds/ddsi/q_transmit.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -58,12 +57,12 @@ void writer_hbcontrol_init (struct hbcontrol *hbc)
 | 
			
		|||
  hbc->t_of_last_write.v = 0;
 | 
			
		||||
  hbc->t_of_last_hb.v = 0;
 | 
			
		||||
  hbc->t_of_last_ackhb.v = 0;
 | 
			
		||||
  hbc->tsched = NN_MTIME_NEVER;
 | 
			
		||||
  hbc->tsched = DDSRT_MTIME_NEVER;
 | 
			
		||||
  hbc->hbs_since_last_write = 0;
 | 
			
		||||
  hbc->last_packetid = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void writer_hbcontrol_note_hb (struct writer *wr, nn_mtime_t tnow, int ansreq)
 | 
			
		||||
static void writer_hbcontrol_note_hb (struct writer *wr, ddsrt_mtime_t tnow, int ansreq)
 | 
			
		||||
{
 | 
			
		||||
  struct hbcontrol * const hbc = &wr->hbcontrol;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +76,7 @@ static void writer_hbcontrol_note_hb (struct writer *wr, nn_mtime_t tnow, int an
 | 
			
		|||
  hbc->hbs_since_last_write++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t writer_hbcontrol_intv (const struct writer *wr, const struct whc_state *whcst, UNUSED_ARG (nn_mtime_t tnow))
 | 
			
		||||
int64_t writer_hbcontrol_intv (const struct writer *wr, const struct whc_state *whcst, UNUSED_ARG (ddsrt_mtime_t tnow))
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  struct hbcontrol const * const hbc = &wr->hbcontrol;
 | 
			
		||||
| 
						 | 
				
			
			@ -103,11 +102,11 @@ int64_t writer_hbcontrol_intv (const struct writer *wr, const struct whc_state *
 | 
			
		|||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void writer_hbcontrol_note_asyncwrite (struct writer *wr, nn_mtime_t tnow)
 | 
			
		||||
void writer_hbcontrol_note_asyncwrite (struct writer *wr, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  struct hbcontrol * const hbc = &wr->hbcontrol;
 | 
			
		||||
  nn_mtime_t tnext;
 | 
			
		||||
  ddsrt_mtime_t tnext;
 | 
			
		||||
 | 
			
		||||
  /* Reset number of heartbeats since last write: that means the
 | 
			
		||||
     heartbeat rate will go back up to the default */
 | 
			
		||||
| 
						 | 
				
			
			@ -126,13 +125,13 @@ void writer_hbcontrol_note_asyncwrite (struct writer *wr, nn_mtime_t tnow)
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int writer_hbcontrol_must_send (const struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow /* monotonic */)
 | 
			
		||||
int writer_hbcontrol_must_send (const struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow /* monotonic */)
 | 
			
		||||
{
 | 
			
		||||
  struct hbcontrol const * const hbc = &wr->hbcontrol;
 | 
			
		||||
  return (tnow.v >= hbc->t_of_last_hb.v + writer_hbcontrol_intv (wr, whcst, tnow));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_create_heartbeat (struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow, int hbansreq, int issync)
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_create_heartbeat (struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow, int hbansreq, int issync)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  struct nn_xmsg *msg;
 | 
			
		||||
| 
						 | 
				
			
			@ -224,7 +223,7 @@ struct nn_xmsg *writer_hbcontrol_create_heartbeat (struct writer *wr, const stru
 | 
			
		|||
  return msg;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int writer_hbcontrol_ack_required_generic (const struct writer *wr, const struct whc_state *whcst, nn_mtime_t tlast, nn_mtime_t tnow, int piggyback)
 | 
			
		||||
static int writer_hbcontrol_ack_required_generic (const struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tlast, ddsrt_mtime_t tnow, int piggyback)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  struct hbcontrol const * const hbc = &wr->hbcontrol;
 | 
			
		||||
| 
						 | 
				
			
			@ -260,17 +259,17 @@ static int writer_hbcontrol_ack_required_generic (const struct writer *wr, const
 | 
			
		|||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int writer_hbcontrol_ack_required (const struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow)
 | 
			
		||||
int writer_hbcontrol_ack_required (const struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct hbcontrol const * const hbc = &wr->hbcontrol;
 | 
			
		||||
  return writer_hbcontrol_ack_required_generic (wr, whcst, hbc->t_of_last_write, tnow, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_piggyback (struct writer *wr, const struct whc_state *whcst, nn_mtime_t tnow, uint32_t packetid, int *hbansreq)
 | 
			
		||||
struct nn_xmsg *writer_hbcontrol_piggyback (struct writer *wr, const struct whc_state *whcst, ddsrt_mtime_t tnow, uint32_t packetid, int *hbansreq)
 | 
			
		||||
{
 | 
			
		||||
  struct hbcontrol * const hbc = &wr->hbcontrol;
 | 
			
		||||
  uint32_t last_packetid;
 | 
			
		||||
  nn_mtime_t tlast;
 | 
			
		||||
  ddsrt_mtime_t tlast;
 | 
			
		||||
  struct nn_xmsg *msg;
 | 
			
		||||
 | 
			
		||||
  tlast = hbc->t_of_last_write;
 | 
			
		||||
| 
						 | 
				
			
			@ -332,7 +331,7 @@ void add_Heartbeat (struct nn_xmsg *msg, struct writer *wr, const struct whc_sta
 | 
			
		|||
  {
 | 
			
		||||
    /* If configured to measure heartbeat-to-ack latency, we must add
 | 
			
		||||
       a timestamp.  No big deal if it fails. */
 | 
			
		||||
    nn_xmsg_add_timestamp (msg, now ());
 | 
			
		||||
    nn_xmsg_add_timestamp (msg, ddsrt_time_wallclock ());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  hb = nn_xmsg_append (msg, &sm_marker, sizeof (Heartbeat_t));
 | 
			
		||||
| 
						 | 
				
			
			@ -687,9 +686,9 @@ dds_return_t write_hb_liveliness (struct ddsi_domaingv * const gv, struct ddsi_g
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_PARTICIPANT && ((lease = ddsrt_atomic_ldvoidp (&wr->c.pp->minl_man)) != NULL))
 | 
			
		||||
    lease_renew (lease, now_et());
 | 
			
		||||
    lease_renew (lease, ddsrt_time_elapsed());
 | 
			
		||||
  else if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_TOPIC && wr->lease != NULL)
 | 
			
		||||
    lease_renew (wr->lease, now_et());
 | 
			
		||||
    lease_renew (wr->lease, ddsrt_time_elapsed());
 | 
			
		||||
 | 
			
		||||
  if ((msg = nn_xmsg_new (gv->xmsgpool, &wr->e.guid.prefix, sizeof (InfoTS_t) + sizeof (Heartbeat_t), NN_XMSG_KIND_CONTROL)) == NULL)
 | 
			
		||||
    return DDS_RETCODE_OUT_OF_RESOURCES;
 | 
			
		||||
| 
						 | 
				
			
			@ -920,13 +919,13 @@ static int insert_sample_in_whc (struct writer *wr, seqno_t seq, struct ddsi_pli
 | 
			
		|||
 | 
			
		||||
  if ((wr->reliable && have_reliable_subs (wr)) || wr_deadline || wr->handle_as_transient_local)
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t exp = NN_MTIME_NEVER;
 | 
			
		||||
    ddsrt_mtime_t exp = DDSRT_MTIME_NEVER;
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
    /* Don't set expiry for samples with flags unregister or dispose, because these are required
 | 
			
		||||
     * for sample lifecycle and should always be delivered to the reader so that is can clean up
 | 
			
		||||
     * its history cache. */
 | 
			
		||||
    if (wr->xqos->lifespan.duration != DDS_INFINITY && (serdata->statusinfo & (NN_STATUSINFO_UNREGISTER | NN_STATUSINFO_DISPOSE)) == 0)
 | 
			
		||||
      exp = add_duration_to_mtime(serdata->twrite, wr->xqos->lifespan.duration);
 | 
			
		||||
      exp = ddsrt_mtime_add_duration(serdata->twrite, wr->xqos->lifespan.duration);
 | 
			
		||||
#endif
 | 
			
		||||
    res = ((insres = whc_insert (wr->whc, writer_max_drop_seq (wr), seq, exp, plist, serdata, tk)) < 0) ? insres : 1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -999,8 +998,8 @@ static dds_return_t throttle_writer (struct thread_state1 * const ts1, struct nn
 | 
			
		|||
     writer. */
 | 
			
		||||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  dds_return_t result = DDS_RETCODE_OK;
 | 
			
		||||
  nn_mtime_t tnow = now_mt ();
 | 
			
		||||
  const nn_mtime_t abstimeout = add_duration_to_mtime (tnow, wr->xqos->reliability.max_blocking_time);
 | 
			
		||||
  ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  const ddsrt_mtime_t abstimeout = ddsrt_mtime_add_duration (tnow, wr->xqos->reliability.max_blocking_time);
 | 
			
		||||
  struct whc_state whcst;
 | 
			
		||||
  whc_get_state (wr->whc, &whcst);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1036,7 +1035,7 @@ static dds_return_t throttle_writer (struct thread_state1 * const ts1, struct nn
 | 
			
		|||
  while (ddsrt_atomic_ld32 (&gv->rtps_keepgoing) && !writer_may_continue (wr, &whcst))
 | 
			
		||||
  {
 | 
			
		||||
    int64_t reltimeout;
 | 
			
		||||
    tnow = now_mt ();
 | 
			
		||||
    tnow = ddsrt_time_monotonic ();
 | 
			
		||||
    reltimeout = abstimeout.v - tnow.v;
 | 
			
		||||
    result = DDS_RETCODE_TIMEOUT;
 | 
			
		||||
    if (reltimeout > 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -1071,8 +1070,8 @@ static int maybe_grow_whc (struct writer *wr)
 | 
			
		|||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  if (!wr->retransmitting && gv->config.whc_adaptive && wr->whc_high < gv->config.whc_highwater_mark)
 | 
			
		||||
  {
 | 
			
		||||
    nn_etime_t tnow = now_et();
 | 
			
		||||
    nn_etime_t tgrow = add_duration_to_etime (wr->t_whc_high_upd, DDS_MSECS (10));
 | 
			
		||||
    ddsrt_etime_t tnow = ddsrt_time_elapsed();
 | 
			
		||||
    ddsrt_etime_t tgrow = ddsrt_etime_add_duration (wr->t_whc_high_upd, DDS_MSECS (10));
 | 
			
		||||
    if (tnow.v >= tgrow.v)
 | 
			
		||||
    {
 | 
			
		||||
      uint32_t m = (gv->config.whc_highwater_mark - wr->whc_high) / 32;
 | 
			
		||||
| 
						 | 
				
			
			@ -1089,7 +1088,7 @@ static int write_sample_eot (struct thread_state1 * const ts1, struct nn_xpack *
 | 
			
		|||
  struct ddsi_domaingv const * const gv = wr->e.gv;
 | 
			
		||||
  int r;
 | 
			
		||||
  seqno_t seq;
 | 
			
		||||
  nn_mtime_t tnow;
 | 
			
		||||
  ddsrt_mtime_t tnow;
 | 
			
		||||
  struct lease *lease;
 | 
			
		||||
 | 
			
		||||
  /* If GC not allowed, we must be sure to never block when writing.  That is only the case for (true, aggressive) KEEP_LAST writers, and also only if there is no limit to how much unacknowledged data the WHC may contain. */
 | 
			
		||||
| 
						 | 
				
			
			@ -1113,9 +1112,9 @@ static int write_sample_eot (struct thread_state1 * const ts1, struct nn_xpack *
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_PARTICIPANT && ((lease = ddsrt_atomic_ldvoidp (&wr->c.pp->minl_man)) != NULL))
 | 
			
		||||
    lease_renew (lease, now_et());
 | 
			
		||||
    lease_renew (lease, ddsrt_time_elapsed());
 | 
			
		||||
  else if (wr->xqos->liveliness.kind == DDS_LIVELINESS_MANUAL_BY_TOPIC && wr->lease != NULL)
 | 
			
		||||
    lease_renew (wr->lease, now_et());
 | 
			
		||||
    lease_renew (wr->lease, ddsrt_time_elapsed());
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&wr->e.lock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1162,7 +1161,7 @@ static int write_sample_eot (struct thread_state1 * const ts1, struct nn_xpack *
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* Always use the current monotonic time */
 | 
			
		||||
  tnow = now_mt ();
 | 
			
		||||
  tnow = ddsrt_time_monotonic ();
 | 
			
		||||
  serdata->twrite = tnow;
 | 
			
		||||
 | 
			
		||||
  seq = ++wr->seq;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@
 | 
			
		|||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#include "dds/ddsi/q_rtps.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_whc.h"
 | 
			
		||||
 | 
			
		||||
extern inline seqno_t whc_next_seq (const struct whc *whc, seqno_t seq);
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +20,7 @@ extern inline void whc_return_sample (struct whc *whc, struct whc_borrowed_sampl
 | 
			
		|||
extern inline void whc_sample_iter_init (const struct whc *whc, struct whc_sample_iter *it);
 | 
			
		||||
extern inline bool whc_sample_iter_borrow_next (struct whc_sample_iter *it, struct whc_borrowed_sample *sample);
 | 
			
		||||
extern inline void whc_free (struct whc *whc);
 | 
			
		||||
extern int whc_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);
 | 
			
		||||
extern int whc_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);
 | 
			
		||||
extern unsigned whc_downgrade_to_volatile (struct whc *whc, struct whc_state *st);
 | 
			
		||||
extern unsigned whc_remove_acked_messages (struct whc *whc, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list);
 | 
			
		||||
extern void whc_free_deferred_free_list (struct whc *whc, struct whc_node *deferred_free_list);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,6 @@
 | 
			
		|||
#include "dds/ddsrt/avl.h"
 | 
			
		||||
#include "dds/ddsrt/fibheap.h"
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_log.h"
 | 
			
		||||
#include "dds/ddsi/q_addrset.h"
 | 
			
		||||
#include "dds/ddsi/q_xmsg.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +65,7 @@ struct xevent
 | 
			
		|||
{
 | 
			
		||||
  ddsrt_fibheap_node_t heapnode;
 | 
			
		||||
  struct xeventq *evq;
 | 
			
		||||
  nn_mtime_t tsched;
 | 
			
		||||
  ddsrt_mtime_t tsched;
 | 
			
		||||
  enum xeventkind kind;
 | 
			
		||||
  union {
 | 
			
		||||
    struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +91,7 @@ struct xevent
 | 
			
		|||
      ddsi_guid_t guid;
 | 
			
		||||
    } delete_writer;
 | 
			
		||||
    struct {
 | 
			
		||||
      void (*cb) (struct xevent *ev, void *arg, nn_mtime_t tnow);
 | 
			
		||||
      void (*cb) (struct xevent *ev, void *arg, ddsrt_mtime_t tnow);
 | 
			
		||||
      void *arg;
 | 
			
		||||
      bool executing;
 | 
			
		||||
    } callback;
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +151,7 @@ struct xeventq {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
static uint32_t xevent_thread (struct xeventq *xevq);
 | 
			
		||||
static nn_mtime_t earliest_in_xeventq (struct xeventq *evq);
 | 
			
		||||
static ddsrt_mtime_t earliest_in_xeventq (struct xeventq *evq);
 | 
			
		||||
static int msg_xevents_cmp (const void *a, const void *b);
 | 
			
		||||
static int compare_xevent_tsched (const void *va, const void *vb);
 | 
			
		||||
static void handle_nontimed_xevent (struct xevent_nt *xev, struct nn_xpack *xp);
 | 
			
		||||
| 
						 | 
				
			
			@ -360,7 +359,7 @@ void delete_xevent_callback (struct xevent *ev)
 | 
			
		|||
  free_xevent (evq, ev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int resched_xevent_if_earlier (struct xevent *ev, nn_mtime_t tsched)
 | 
			
		||||
int resched_xevent_if_earlier (struct xevent *ev, ddsrt_mtime_t tsched)
 | 
			
		||||
{
 | 
			
		||||
  struct xeventq *evq = ev->evq;
 | 
			
		||||
  int is_resched;
 | 
			
		||||
| 
						 | 
				
			
			@ -376,7 +375,7 @@ int resched_xevent_if_earlier (struct xevent *ev, nn_mtime_t tsched)
 | 
			
		|||
    is_resched = 0;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tbefore = earliest_in_xeventq (evq);
 | 
			
		||||
    ddsrt_mtime_t tbefore = earliest_in_xeventq (evq);
 | 
			
		||||
    if (ev->tsched.v != DDS_NEVER)
 | 
			
		||||
    {
 | 
			
		||||
      ev->tsched = tsched;
 | 
			
		||||
| 
						 | 
				
			
			@ -395,7 +394,25 @@ int resched_xevent_if_earlier (struct xevent *ev, nn_mtime_t tsched)
 | 
			
		|||
  return is_resched;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct xevent *qxev_common (struct xeventq *evq, nn_mtime_t tsched, enum xeventkind kind)
 | 
			
		||||
static ddsrt_mtime_t mtime_round_up (ddsrt_mtime_t t, int64_t round)
 | 
			
		||||
{
 | 
			
		||||
  /* This function rounds up t to the nearest next multiple of round.
 | 
			
		||||
     t is nanoseconds, round is milliseconds.  Avoid functions from
 | 
			
		||||
     maths libraries to keep code portable */
 | 
			
		||||
  assert (t.v >= 0 && round >= 0);
 | 
			
		||||
  if (round == 0 || t.v == DDS_INFINITY)
 | 
			
		||||
    return t;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    int64_t remainder = t.v % round;
 | 
			
		||||
    if (remainder == 0)
 | 
			
		||||
      return t;
 | 
			
		||||
    else
 | 
			
		||||
      return (ddsrt_mtime_t) { t.v + round - remainder };
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct xevent *qxev_common (struct xeventq *evq, ddsrt_mtime_t tsched, enum xeventkind kind)
 | 
			
		||||
{
 | 
			
		||||
  /* qxev_common is the route by which all timed xevents are
 | 
			
		||||
     created. */
 | 
			
		||||
| 
						 | 
				
			
			@ -407,7 +424,7 @@ static struct xevent *qxev_common (struct xeventq *evq, nn_mtime_t tsched, enum
 | 
			
		|||
  /* round up the scheduled time if required */
 | 
			
		||||
  if (tsched.v != DDS_NEVER && evq->gv->config.schedule_time_rounding != 0)
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tsched_rounded = mtime_round_up (tsched, evq->gv->config.schedule_time_rounding);
 | 
			
		||||
    ddsrt_mtime_t tsched_rounded = mtime_round_up (tsched, evq->gv->config.schedule_time_rounding);
 | 
			
		||||
    EVQTRACE ("rounded event scheduled for %"PRId64" to %"PRId64"\n", tsched.v, tsched_rounded.v);
 | 
			
		||||
    tsched = tsched_rounded;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -427,11 +444,11 @@ static struct xevent_nt *qxev_common_nt (struct xeventq *evq, enum xeventkind_nt
 | 
			
		|||
  return ev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static nn_mtime_t earliest_in_xeventq (struct xeventq *evq)
 | 
			
		||||
static ddsrt_mtime_t earliest_in_xeventq (struct xeventq *evq)
 | 
			
		||||
{
 | 
			
		||||
  struct xevent *min;
 | 
			
		||||
  ASSERT_MUTEX_HELD (&evq->lock);
 | 
			
		||||
  return ((min = ddsrt_fibheap_min (&evq_xevents_fhdef, &evq->xevents)) != NULL) ? min->tsched : NN_MTIME_NEVER;
 | 
			
		||||
  return ((min = ddsrt_fibheap_min (&evq_xevents_fhdef, &evq->xevents)) != NULL) ? min->tsched : DDSRT_MTIME_NEVER;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void qxev_insert (struct xevent *ev)
 | 
			
		||||
| 
						 | 
				
			
			@ -442,7 +459,7 @@ static void qxev_insert (struct xevent *ev)
 | 
			
		|||
  ASSERT_MUTEX_HELD (&evq->lock);
 | 
			
		||||
  if (ev->tsched.v != DDS_NEVER)
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tbefore = earliest_in_xeventq (evq);
 | 
			
		||||
    ddsrt_mtime_t tbefore = earliest_in_xeventq (evq);
 | 
			
		||||
    ddsrt_fibheap_insert (&evq_xevents_fhdef, &evq->xevents, ev);
 | 
			
		||||
    if (ev->tsched.v < tbefore.v)
 | 
			
		||||
      ddsrt_cond_broadcast (&evq->cond);
 | 
			
		||||
| 
						 | 
				
			
			@ -584,12 +601,12 @@ static void handle_xevk_entityid (struct nn_xpack *xp, struct xevent_nt *ev)
 | 
			
		|||
  nn_xpack_addmsg (xp, ev->u.entityid.msg, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_xevk_heartbeat (struct nn_xpack *xp, struct xevent *ev, nn_mtime_t tnow /* monotonic */)
 | 
			
		||||
static void handle_xevk_heartbeat (struct nn_xpack *xp, struct xevent *ev, ddsrt_mtime_t tnow /* monotonic */)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv const * const gv = ev->evq->gv;
 | 
			
		||||
  struct nn_xmsg *msg;
 | 
			
		||||
  struct writer *wr;
 | 
			
		||||
  nn_mtime_t t_next;
 | 
			
		||||
  ddsrt_mtime_t t_next;
 | 
			
		||||
  int hbansreq = 0;
 | 
			
		||||
  struct whc_state whcst;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -846,7 +863,7 @@ static void add_AckNack (struct nn_xmsg *msg, struct proxy_writer *pwr, struct p
 | 
			
		|||
  ETRACE (pwr, "\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_xevk_acknack (UNUSED_ARG (struct nn_xpack *xp), struct xevent *ev, nn_mtime_t tnow)
 | 
			
		||||
static void handle_xevk_acknack (UNUSED_ARG (struct nn_xpack *xp), struct xevent *ev, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: ought to keep track of which NACKs are being generated in
 | 
			
		||||
     response to a Heartbeat.  There is no point in having multiple
 | 
			
		||||
| 
						 | 
				
			
			@ -901,7 +918,7 @@ static void handle_xevk_acknack (UNUSED_ARG (struct nn_xpack *xp), struct xevent
 | 
			
		|||
         HEARTBEAT, I've seen too many cases of not sending an NACK
 | 
			
		||||
         because the writing side got confused ...  Better to recover
 | 
			
		||||
         eventually. */
 | 
			
		||||
      (void) resched_xevent_if_earlier (ev, add_duration_to_mtime (tnow, gv->config.auto_resched_nack_delay));
 | 
			
		||||
      (void) resched_xevent_if_earlier (ev, ddsrt_mtime_add_duration (tnow, gv->config.auto_resched_nack_delay));
 | 
			
		||||
    }
 | 
			
		||||
    GVTRACE ("send acknack(rd "PGUIDFMT" -> pwr "PGUIDFMT")\n",
 | 
			
		||||
             PGUID (ev->u.acknack.rd_guid), PGUID (ev->u.acknack.pwr_guid));
 | 
			
		||||
| 
						 | 
				
			
			@ -927,7 +944,7 @@ static void handle_xevk_acknack (UNUSED_ARG (struct nn_xpack *xp), struct xevent
 | 
			
		|||
      intv = 5;
 | 
			
		||||
    else
 | 
			
		||||
      intv = 10;
 | 
			
		||||
    (void) resched_xevent_if_earlier (ev, add_duration_to_mtime (tnow, intv * DDS_NSECS_IN_SEC));
 | 
			
		||||
    (void) resched_xevent_if_earlier (ev, ddsrt_mtime_add_duration (tnow, intv * DDS_NSECS_IN_SEC));
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&pwr->e.lock);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -940,7 +957,7 @@ static void handle_xevk_acknack (UNUSED_ARG (struct nn_xpack *xp), struct xevent
 | 
			
		|||
 outofmem:
 | 
			
		||||
  /* What to do if out of memory?  Crash or burn? */
 | 
			
		||||
  ddsrt_mutex_unlock (&pwr->e.lock);
 | 
			
		||||
  (void) resched_xevent_if_earlier (ev, add_duration_to_mtime (tnow, DDS_MSECS (100)));
 | 
			
		||||
  (void) resched_xevent_if_earlier (ev, ddsrt_mtime_add_duration (tnow, DDS_MSECS (100)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool resend_spdp_sample_by_guid_key (struct writer *wr, const ddsi_guid_t *guid, struct proxy_reader *prd)
 | 
			
		||||
| 
						 | 
				
			
			@ -981,7 +998,7 @@ static bool resend_spdp_sample_by_guid_key (struct writer *wr, const ddsi_guid_t
 | 
			
		|||
  return sample_found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_xevk_spdp (UNUSED_ARG (struct nn_xpack *xp), struct xevent *ev, nn_mtime_t tnow)
 | 
			
		||||
static void handle_xevk_spdp (UNUSED_ARG (struct nn_xpack *xp), struct xevent *ev, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  /* Like the writer pointer in the heartbeat event, the participant pointer in the spdp event is assumed valid. */
 | 
			
		||||
  struct ddsi_domaingv *gv = ev->evq->gv;
 | 
			
		||||
| 
						 | 
				
			
			@ -1060,7 +1077,7 @@ static void handle_xevk_spdp (UNUSED_ARG (struct nn_xpack *xp), struct xevent *e
 | 
			
		|||
      delete_xevent (ev);
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      nn_mtime_t tnext = add_duration_to_mtime (tnow, DDS_SECS (1));
 | 
			
		||||
      ddsrt_mtime_t tnext = ddsrt_mtime_add_duration (tnow, DDS_SECS (1));
 | 
			
		||||
      GVTRACE ("xmit spdp "PGUIDFMT" to %"PRIx32":%"PRIx32":%"PRIx32":%x (resched %gs)\n",
 | 
			
		||||
               PGUID (pp->e.guid),
 | 
			
		||||
               PGUIDPREFIX (ev->u.spdp.dest_proxypp_guid_prefix), NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_READER,
 | 
			
		||||
| 
						 | 
				
			
			@ -1075,7 +1092,7 @@ static void handle_xevk_spdp (UNUSED_ARG (struct nn_xpack *xp), struct xevent *e
 | 
			
		|||
       but never wait longer than spdp_interval */
 | 
			
		||||
    const dds_duration_t mindelta = DDS_MSECS (10);
 | 
			
		||||
    const dds_duration_t ldur = pp->lease_duration;
 | 
			
		||||
    nn_mtime_t tnext;
 | 
			
		||||
    ddsrt_mtime_t tnext;
 | 
			
		||||
    int64_t intv;
 | 
			
		||||
 | 
			
		||||
    if (ldur < 5 * mindelta / 4)
 | 
			
		||||
| 
						 | 
				
			
			@ -1087,7 +1104,7 @@ static void handle_xevk_spdp (UNUSED_ARG (struct nn_xpack *xp), struct xevent *e
 | 
			
		|||
    if (intv > gv->config.spdp_interval)
 | 
			
		||||
      intv = gv->config.spdp_interval;
 | 
			
		||||
 | 
			
		||||
    tnext = add_duration_to_mtime (tnow, intv);
 | 
			
		||||
    tnext = ddsrt_mtime_add_duration (tnow, intv);
 | 
			
		||||
    GVTRACE ("xmit spdp "PGUIDFMT" to %"PRIx32":%"PRIx32":%"PRIx32":%x (resched %gs)\n",
 | 
			
		||||
             PGUID (pp->e.guid),
 | 
			
		||||
             PGUIDPREFIX (ev->u.spdp.dest_proxypp_guid_prefix), NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_READER,
 | 
			
		||||
| 
						 | 
				
			
			@ -1096,12 +1113,12 @@ static void handle_xevk_spdp (UNUSED_ARG (struct nn_xpack *xp), struct xevent *e
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_xevk_pmd_update (struct thread_state1 * const ts1, struct nn_xpack *xp, struct xevent *ev, nn_mtime_t tnow)
 | 
			
		||||
static void handle_xevk_pmd_update (struct thread_state1 * const ts1, struct nn_xpack *xp, struct xevent *ev, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_domaingv * const gv = ev->evq->gv;
 | 
			
		||||
  struct participant *pp;
 | 
			
		||||
  dds_duration_t intv;
 | 
			
		||||
  nn_mtime_t tnext;
 | 
			
		||||
  ddsrt_mtime_t tnext;
 | 
			
		||||
 | 
			
		||||
  if ((pp = entidx_lookup_participant_guid (gv->entity_index, &ev->u.pmd_update.pp_guid)) == NULL)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -1130,7 +1147,7 @@ static void handle_xevk_pmd_update (struct thread_state1 * const ts1, struct nn_
 | 
			
		|||
  (void) resched_xevent_if_earlier (ev, tnext);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_xevk_delete_writer (UNUSED_ARG (struct nn_xpack *xp), struct xevent *ev, UNUSED_ARG (nn_mtime_t tnow))
 | 
			
		||||
static void handle_xevk_delete_writer (UNUSED_ARG (struct nn_xpack *xp), struct xevent *ev, UNUSED_ARG (ddsrt_mtime_t tnow))
 | 
			
		||||
{
 | 
			
		||||
  /* don't worry if the writer is already gone by the time we get here. */
 | 
			
		||||
  struct ddsi_domaingv * const gv = ev->evq->gv;
 | 
			
		||||
| 
						 | 
				
			
			@ -1139,7 +1156,7 @@ static void handle_xevk_delete_writer (UNUSED_ARG (struct nn_xpack *xp), struct
 | 
			
		|||
  delete_xevent (ev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_individual_xevent (struct thread_state1 * const ts1, struct xevent *xev, struct nn_xpack *xp, nn_mtime_t tnow)
 | 
			
		||||
static void handle_individual_xevent (struct thread_state1 * const ts1, struct xevent *xev, struct nn_xpack *xp, ddsrt_mtime_t tnow)
 | 
			
		||||
{
 | 
			
		||||
  struct xeventq *xevq = xev->evq;
 | 
			
		||||
  /* We relinquish the lock while processing the event, but require it
 | 
			
		||||
| 
						 | 
				
			
			@ -1200,7 +1217,7 @@ static void handle_individual_xevent_nt (struct xevent_nt *xev, struct nn_xpack
 | 
			
		|||
  ddsrt_free (xev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_timed_xevent (struct thread_state1 * const ts1, struct xevent *xev, struct nn_xpack *xp, nn_mtime_t tnow /* monotonic */)
 | 
			
		||||
static void handle_timed_xevent (struct thread_state1 * const ts1, struct xevent *xev, struct nn_xpack *xp, ddsrt_mtime_t tnow /* monotonic */)
 | 
			
		||||
{
 | 
			
		||||
   /* This function handles the individual xevent irrespective of
 | 
			
		||||
      whether it is a "timed" or "non-timed" xevent */
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,7 +1245,7 @@ static void handle_nontimed_xevent (struct xevent_nt *xev, struct nn_xpack *xp)
 | 
			
		|||
  ASSERT_MUTEX_HELD (&xevq->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_xevents (struct thread_state1 * const ts1, struct xeventq *xevq, struct nn_xpack *xp, nn_mtime_t tnow /* monotonic */)
 | 
			
		||||
static void handle_xevents (struct thread_state1 * const ts1, struct xeventq *xevq, struct nn_xpack *xp, ddsrt_mtime_t tnow /* monotonic */)
 | 
			
		||||
{
 | 
			
		||||
  int xeventsToProcess = 1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1265,7 +1282,7 @@ static void handle_xevents (struct thread_state1 * const ts1, struct xeventq *xe
 | 
			
		|||
 | 
			
		||||
      /* Limited-bandwidth channels means events can take a LONG time
 | 
			
		||||
         to process.  So read the clock more often. */
 | 
			
		||||
      tnow = now_mt ();
 | 
			
		||||
      tnow = ddsrt_time_monotonic ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!non_timed_xmit_list_is_empty (xevq))
 | 
			
		||||
| 
						 | 
				
			
			@ -1273,7 +1290,7 @@ static void handle_xevents (struct thread_state1 * const ts1, struct xeventq *xe
 | 
			
		|||
      struct xevent_nt *xev = getnext_from_non_timed_xmit_list (xevq);
 | 
			
		||||
      thread_state_awake_to_awake_no_nest (ts1);
 | 
			
		||||
      handle_nontimed_xevent (xev, xp);
 | 
			
		||||
      tnow = now_mt ();
 | 
			
		||||
      tnow = ddsrt_time_monotonic ();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -1288,14 +1305,14 @@ static uint32_t xevent_thread (struct xeventq * xevq)
 | 
			
		|||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  struct nn_xpack *xp;
 | 
			
		||||
  nn_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
  ddsrt_mtime_t next_thread_cputime = { 0 };
 | 
			
		||||
 | 
			
		||||
  xp = nn_xpack_new (xevq->tev_conn, xevq->auxiliary_bandwidth_limit, xevq->gv->config.xpack_send_async);
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&xevq->lock);
 | 
			
		||||
  while (!xevq->terminate)
 | 
			
		||||
  {
 | 
			
		||||
    nn_mtime_t tnow = now_mt ();
 | 
			
		||||
    ddsrt_mtime_t tnow = ddsrt_time_monotonic ();
 | 
			
		||||
 | 
			
		||||
    LOG_THREAD_CPUTIME (&xevq->gv->logconfig, next_thread_cputime);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1313,7 +1330,7 @@ static uint32_t xevent_thread (struct xeventq * xevq)
 | 
			
		|||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      nn_mtime_t twakeup = earliest_in_xeventq (xevq);
 | 
			
		||||
      ddsrt_mtime_t twakeup = earliest_in_xeventq (xevq);
 | 
			
		||||
      if (twakeup.v == DDS_NEVER)
 | 
			
		||||
      {
 | 
			
		||||
        /* no scheduled events nor any non-timed events */
 | 
			
		||||
| 
						 | 
				
			
			@ -1325,7 +1342,7 @@ static uint32_t xevent_thread (struct xeventq * xevq)
 | 
			
		|||
           don't want to sleep much longer than we have to. With
 | 
			
		||||
           os_condTimedWait requiring a relative time, we don't have
 | 
			
		||||
           much choice but to read the clock now */
 | 
			
		||||
        tnow = now_mt ();
 | 
			
		||||
        tnow = ddsrt_time_monotonic ();
 | 
			
		||||
        if (twakeup.v > tnow.v)
 | 
			
		||||
        {
 | 
			
		||||
          twakeup.v -= tnow.v; /* ddsrt_cond_waitfor: relative timeout */
 | 
			
		||||
| 
						 | 
				
			
			@ -1453,7 +1470,7 @@ int qxev_msg_rexmit_wrlock_held (struct xeventq *evq, struct nn_xmsg *msg, int f
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct xevent *qxev_heartbeat (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *wr_guid)
 | 
			
		||||
struct xevent *qxev_heartbeat (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *wr_guid)
 | 
			
		||||
{
 | 
			
		||||
  /* Event _must_ be deleted before enough of the writer is freed to
 | 
			
		||||
     cause trouble.  Currently used exclusively for
 | 
			
		||||
| 
						 | 
				
			
			@ -1468,7 +1485,7 @@ struct xevent *qxev_heartbeat (struct xeventq *evq, nn_mtime_t tsched, const dds
 | 
			
		|||
  return ev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct xevent *qxev_acknack (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *pwr_guid, const ddsi_guid_t *rd_guid)
 | 
			
		||||
struct xevent *qxev_acknack (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *pwr_guid, const ddsi_guid_t *rd_guid)
 | 
			
		||||
{
 | 
			
		||||
  struct xevent *ev;
 | 
			
		||||
  assert(evq);
 | 
			
		||||
| 
						 | 
				
			
			@ -1481,7 +1498,7 @@ struct xevent *qxev_acknack (struct xeventq *evq, nn_mtime_t tsched, const ddsi_
 | 
			
		|||
  return ev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct xevent *qxev_spdp (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *pp_guid, const ddsi_guid_t *dest_proxypp_guid)
 | 
			
		||||
struct xevent *qxev_spdp (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *pp_guid, const ddsi_guid_t *dest_proxypp_guid)
 | 
			
		||||
{
 | 
			
		||||
  struct xevent *ev;
 | 
			
		||||
  ddsrt_mutex_lock (&evq->lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -1499,7 +1516,7 @@ struct xevent *qxev_spdp (struct xeventq *evq, nn_mtime_t tsched, const ddsi_gui
 | 
			
		|||
  return ev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct xevent *qxev_pmd_update (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *pp_guid)
 | 
			
		||||
struct xevent *qxev_pmd_update (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *pp_guid)
 | 
			
		||||
{
 | 
			
		||||
  struct xevent *ev;
 | 
			
		||||
  ddsrt_mutex_lock (&evq->lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -1510,7 +1527,7 @@ struct xevent *qxev_pmd_update (struct xeventq *evq, nn_mtime_t tsched, const dd
 | 
			
		|||
  return ev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct xevent *qxev_delete_writer (struct xeventq *evq, nn_mtime_t tsched, const ddsi_guid_t *guid)
 | 
			
		||||
struct xevent *qxev_delete_writer (struct xeventq *evq, ddsrt_mtime_t tsched, const ddsi_guid_t *guid)
 | 
			
		||||
{
 | 
			
		||||
  struct xevent *ev;
 | 
			
		||||
  ddsrt_mutex_lock (&evq->lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -1521,7 +1538,7 @@ struct xevent *qxev_delete_writer (struct xeventq *evq, nn_mtime_t tsched, const
 | 
			
		|||
  return ev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct xevent *qxev_callback (struct xeventq *evq, nn_mtime_t tsched, void (*cb) (struct xevent *ev, void *arg, nn_mtime_t tnow), void *arg)
 | 
			
		||||
struct xevent *qxev_callback (struct xeventq *evq, ddsrt_mtime_t tsched, void (*cb) (struct xevent *ev, void *arg, ddsrt_mtime_t tnow), void *arg)
 | 
			
		||||
{
 | 
			
		||||
  struct xevent *ev;
 | 
			
		||||
  ddsrt_mutex_lock (&evq->lock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -538,14 +538,14 @@ void nn_xmsg_shrink (struct nn_xmsg *m, struct nn_xmsg_marker marker, size_t sz)
 | 
			
		|||
  m->sz = marker.offset + sz;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nn_xmsg_add_timestamp (struct nn_xmsg *m, nn_wctime_t t)
 | 
			
		||||
void nn_xmsg_add_timestamp (struct nn_xmsg *m, ddsrt_wctime_t t)
 | 
			
		||||
{
 | 
			
		||||
  InfoTimestamp_t * ts;
 | 
			
		||||
  struct nn_xmsg_marker sm;
 | 
			
		||||
 | 
			
		||||
  ts = (InfoTimestamp_t*) nn_xmsg_append (m, &sm, sizeof (InfoTimestamp_t));
 | 
			
		||||
  nn_xmsg_submsg_init (m, sm, SMID_INFO_TS);
 | 
			
		||||
  ts->time = nn_wctime_to_ddsi_time (t);
 | 
			
		||||
  ts->time = ddsi_wctime_to_ddsi_time (t);
 | 
			
		||||
  nn_xmsg_submsg_setnext (m, sm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -108,9 +108,9 @@ static struct ddsi_serdata *mkkeysample (int32_t keyval, unsigned statusinfo)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#if defined(DDSI_INCLUDE_LIFESPAN) || defined (DDSI_INCLUDE_DEADLINE_MISSED)
 | 
			
		||||
static nn_mtime_t rand_texp ()
 | 
			
		||||
static ddsrt_mtime_t rand_texp ()
 | 
			
		||||
{
 | 
			
		||||
  nn_mtime_t ret = now_mt();
 | 
			
		||||
  ddsrt_mtime_t ret = ddsrt_time_monotonic();
 | 
			
		||||
  ret.v -= DDS_MSECS(500) + (int64_t) (ddsrt_prng_random (&prng) % DDS_MSECS(1500));
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +158,7 @@ static uint64_t store (struct ddsi_tkmap *tkmap, struct dds_rhc *rhc, struct pro
 | 
			
		|||
  if (lifespan_expiry && (sd->statusinfo & (NN_STATUSINFO_UNREGISTER | NN_STATUSINFO_DISPOSE)) == 0)
 | 
			
		||||
    pwr_info.lifespan_exp = rand_texp();
 | 
			
		||||
  else
 | 
			
		||||
    pwr_info.lifespan_exp = NN_MTIME_NEVER;
 | 
			
		||||
    pwr_info.lifespan_exp = DDSRT_MTIME_NEVER;
 | 
			
		||||
#endif
 | 
			
		||||
  dds_rhc_store (rhc, &pwr_info, sd, tk);
 | 
			
		||||
  ddsi_tkmap_instance_unref (tkmap, tk);
 | 
			
		||||
| 
						 | 
				
			
			@ -831,7 +831,7 @@ static void test_conditions (dds_entity_t pp, dds_entity_t tp, const int count,
 | 
			
		|||
        wr_info.iid = wr[which]->e.iid;
 | 
			
		||||
        wr_info.ownership_strength = wr[which]->c.xqos->ownership_strength.value;
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
        wr_info.lifespan_exp = NN_MTIME_NEVER;
 | 
			
		||||
        wr_info.lifespan_exp = DDSRT_MTIME_NEVER;
 | 
			
		||||
#endif
 | 
			
		||||
        for (size_t k = 0; k < nrd; k++)
 | 
			
		||||
          dds_rhc_unregister_wr (rhc[k], &wr_info);
 | 
			
		||||
| 
						 | 
				
			
			@ -962,7 +962,7 @@ int main (int argc, char **argv)
 | 
			
		|||
    wr0_info.iid = wr0->e.iid;
 | 
			
		||||
    wr0_info.ownership_strength = wr0->c.xqos->ownership_strength.value;
 | 
			
		||||
#ifdef DDSI_INCLUDE_LIFESPAN
 | 
			
		||||
    wr0_info.lifespan_exp = NN_MTIME_NEVER;
 | 
			
		||||
    wr0_info.lifespan_exp = DDSRT_MTIME_NEVER;
 | 
			
		||||
#endif
 | 
			
		||||
    dds_rhc_unregister_wr (rhc, &wr0_info);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue