OpenDDS  Snapshot(2023/04/28-20:55)
Classes | Public Member Functions | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::InternalDataReader< T >::Instance Class Reference
Collaboration diagram for OpenDDS::DCPS::InternalDataReader< T >::Instance:
Collaboration graph
[legend]

Classes

struct  SampleHolder
 

Public Member Functions

 Instance ()
 
DDS::ViewStateKind view_state () const
 
DDS::InstanceStateKind instance_state () const
 
void purge_samples (const DDS::DataReaderQos &qos)
 
bool can_purge_instance (const DDS::DataReaderQos &qos) const
 
void read (const T &key, SampleSequence &samples, InternalSampleInfoSequence &infos, CORBA::Long max_samples, DDS::SampleStateMask sample_states, DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states)
 
void take (const T &key, SampleSequence &samples, InternalSampleInfoSequence &infos, CORBA::Long max_samples, DDS::SampleStateMask sample_states, DDS::ViewStateMask view_states, DDS::InstanceStateMask instance_states)
 
void write (InternalEntity_wrch publication_handle, const T &sample, const DDS::DataReaderQos &qos)
 
bool dispose (InternalEntity_wrch publication_handle, const DDS::DataReaderQos &qos)
 
bool unregister_instance (InternalEntity_wrch publication_handle, const DDS::DataReaderQos &qos)
 

Private Member Functions

typedef OPENDDS_LIST (SampleHolder) SampleList
 
void compute_ranks (CORBA::Long sample_count, InternalSampleInfoSequence &infos)
 

Private Attributes

SampleList read_samples_
 
SampleList not_read_samples_
 
PublicationSet publication_set_
 
DDS::ViewStateKind view_state_
 
DDS::InstanceStateKind instance_state_
 
DDS::Time_t disposed_expiration_date_
 
DDS::Time_t no_writers_expiration_date_
 
CORBA::Long disposed_generation_count_
 
CORBA::Long no_writers_generation_count_
 
bool informed_of_not_alive_
 

Detailed Description

template<typename T>
class OpenDDS::DCPS::InternalDataReader< T >::Instance

Definition at line 297 of file InternalDataReader.h.

Constructor & Destructor Documentation

◆ Instance()

template<typename T>
OpenDDS::DCPS::InternalDataReader< T >::Instance::Instance ( )
inline

Definition at line 300 of file InternalDataReader.h.

305  , informed_of_not_alive_(false)
306  {
311  }
const ViewStateKind NEW_VIEW_STATE
unsigned long nanosec
const InstanceStateKind ALIVE_INSTANCE_STATE

Member Function Documentation

◆ can_purge_instance()

template<typename T>
bool OpenDDS::DCPS::InternalDataReader< T >::Instance::can_purge_instance ( const DDS::DataReaderQos qos) const
inline

Definition at line 327 of file InternalDataReader.h.

References DDS::ALIVE_INSTANCE_STATE, DDS::ReaderDataLifecycleQosPolicy::autopurge_nowriter_samples_delay, OpenDDS::DCPS::is_infinite(), DDS::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, OpenDDS::DCPS::TimePoint_T< SystemClock >::now(), DDS::DataReaderQos::reader_data_lifecycle, and OpenDDS::DCPS::TimePoint_T< AceClock >::to_dds_time().

328  {
330  not_read_samples_.empty() &&
331  read_samples_.empty() &&
332  publication_set_.empty()) {
333  return true;
334  }
335 
339  return true;
340  }
341 
342  return false;
343  }
DDS::Time_t to_dds_time() const
Definition: TimePoint_T.inl:89
static TimePoint_T< SystemClock > now()
Definition: TimePoint_T.inl:41
ReaderDataLifecycleQosPolicy reader_data_lifecycle
ACE_INLINE OpenDDS_Dcps_Export bool is_infinite(const DDS::Duration_t &value)
const InstanceStateKind NOT_ALIVE_NO_WRITERS_INSTANCE_STATE
const InstanceStateKind ALIVE_INSTANCE_STATE

◆ compute_ranks()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::Instance::compute_ranks ( CORBA::Long  sample_count,
InternalSampleInfoSequence &  infos 
)
inlineprivate

Definition at line 544 of file InternalDataReader.h.

References OPENDDS_MAP_T.

545  {
546  if (sample_count == 0) {
547  return;
548  }
549 
550  typename InternalSampleInfoSequence::reverse_iterator pos = infos.rbegin();
551  const CORBA::Long mrsic = pos->disposed_generation_count + pos->no_writers_generation_count;
553 
554  for (CORBA::Long rank = 0; rank != sample_count; ++rank, ++pos) {
555  pos->sample_rank = rank;
556  pos->generation_rank = mrsic - (pos->disposed_generation_count + pos->no_writers_generation_count);
557  pos->absolute_generation_rank = mrs - (pos->disposed_generation_count + pos->no_writers_generation_count);
558  }
559  }
ACE_CDR::Long Long

◆ dispose()

template<typename T>
bool OpenDDS::DCPS::InternalDataReader< T >::Instance::dispose ( InternalEntity_wrch  publication_handle,
const DDS::DataReaderQos qos 
)
inline

Definition at line 485 of file InternalDataReader.h.

References DDS::ReaderDataLifecycleQosPolicy::autopurge_disposed_samples_delay, DDS::NOT_ALIVE_DISPOSED_INSTANCE_STATE, OpenDDS::DCPS::TimePoint_T< SystemClock >::now(), DDS::DataReaderQos::reader_data_lifecycle, and OpenDDS::DCPS::TimePoint_T< AceClock >::to_dds_time().

487  {
488  publication_set_.insert(publication_handle);
489 
493  informed_of_not_alive_ = false;
494  return true;
495  }
496 
497  return false;
498  }
DDS::Time_t to_dds_time() const
Definition: TimePoint_T.inl:89
static TimePoint_T< SystemClock > now()
Definition: TimePoint_T.inl:41
ReaderDataLifecycleQosPolicy reader_data_lifecycle
const InstanceStateKind NOT_ALIVE_DISPOSED_INSTANCE_STATE

◆ instance_state()

template<typename T>
DDS::InstanceStateKind OpenDDS::DCPS::InternalDataReader< T >::Instance::instance_state ( ) const
inline

Definition at line 315 of file InternalDataReader.h.

315 { return instance_state_; }

◆ OPENDDS_LIST()

template<typename T>
typedef OpenDDS::DCPS::InternalDataReader< T >::Instance::OPENDDS_LIST ( SampleHolder  )
private

◆ purge_samples()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::Instance::purge_samples ( const DDS::DataReaderQos qos)
inline

Definition at line 317 of file InternalDataReader.h.

References DDS::ReaderDataLifecycleQosPolicy::autopurge_disposed_samples_delay, OpenDDS::DCPS::is_infinite(), DDS::NOT_ALIVE_DISPOSED_INSTANCE_STATE, OpenDDS::DCPS::TimePoint_T< SystemClock >::now(), DDS::DataReaderQos::reader_data_lifecycle, and OpenDDS::DCPS::TimePoint_T< AceClock >::to_dds_time().

318  {
322  not_read_samples_.clear();
323  read_samples_.clear();
324  }
325  }
DDS::Time_t to_dds_time() const
Definition: TimePoint_T.inl:89
static TimePoint_T< SystemClock > now()
Definition: TimePoint_T.inl:41
ReaderDataLifecycleQosPolicy reader_data_lifecycle
ACE_INLINE OpenDDS_Dcps_Export bool is_infinite(const DDS::Duration_t &value)
const InstanceStateKind NOT_ALIVE_DISPOSED_INSTANCE_STATE

◆ read()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::Instance::read ( const T &  key,
SampleSequence &  samples,
InternalSampleInfoSequence &  infos,
CORBA::Long  max_samples,
DDS::SampleStateMask  sample_states,
DDS::ViewStateMask  view_states,
DDS::InstanceStateMask  instance_states 
)
inline

Definition at line 345 of file InternalDataReader.h.

References DDS::ALIVE_INSTANCE_STATE, DDS::LENGTH_UNLIMITED, OpenDDS::DCPS::make_sample_info(), max_samples, DDS::NOT_NEW_VIEW_STATE, DDS::NOT_READ_SAMPLE_STATE, and DDS::READ_SAMPLE_STATE.

352  {
354  return;
355  }
356 
357  CORBA::Long sample_count = 0;
358 
360  for (typename SampleList::const_iterator pos = read_samples_.begin(), limit = read_samples_.end();
361  pos != limit && (max_samples == DDS::LENGTH_UNLIMITED || sample_count < max_samples); ++pos) {
362  samples.push_back(pos->sample);
363  infos.push_back(make_sample_info(DDS::READ_SAMPLE_STATE, view_state_, instance_state_, pos->disposed_generation_count, pos->no_writers_generation_count, 0, 0, 0, true));
364  ++sample_count;
365  }
366  }
367 
369  typename SampleList::iterator pos = not_read_samples_.begin();
370  for (typename SampleList::iterator limit = not_read_samples_.end();
371  pos != limit && (max_samples == DDS::LENGTH_UNLIMITED || sample_count < max_samples); ++pos) {
372  samples.push_back(pos->sample);
373  infos.push_back(make_sample_info(DDS::NOT_READ_SAMPLE_STATE, view_state_, instance_state_, pos->disposed_generation_count, pos->no_writers_generation_count, 0, 0, 0, true));
374  ++sample_count;
375  }
376  read_samples_.splice(read_samples_.end(), not_read_samples_, not_read_samples_.begin(), pos);
377 
378  // Generate a synthetic sample for not alive states.
379  if (sample_count == 0 &&
380  instance_state_ != DDS::ALIVE_INSTANCE_STATE &&
382  samples.push_back(key);
383  infos.push_back(make_sample_info(DDS::NOT_READ_SAMPLE_STATE, view_state_, instance_state_, disposed_generation_count_, no_writers_generation_count_, 0, 0, 0, false));
384  ++sample_count;
385  }
386  }
387 
388  compute_ranks(sample_count, infos);
389 
390  if (sample_count) {
391  view_state_ = DDS::NOT_NEW_VIEW_STATE;
392  informed_of_not_alive_ = true;
393  }
394  }
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask sample_states
Definition: IDLTemplate.txt:72
ACE_CDR::Long Long
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask in ::DDS::InstanceStateMask instance_states
Definition: IDLTemplate.txt:72
sequence< octet > key
DDS::SampleInfo make_sample_info(DDS::SampleStateKind sample_state, DDS::ViewStateKind view_state, DDS::InstanceStateKind instance_state, CORBA::Long disposed_generation_count, CORBA::Long no_writers_generation_count, CORBA::Long sample_rank, CORBA::Long generation_rank, CORBA::Long absolute_generation_rank, bool valid_data)
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask view_states
Definition: IDLTemplate.txt:72
const ViewStateKind NOT_NEW_VIEW_STATE
void compute_ranks(CORBA::Long sample_count, InternalSampleInfoSequence &infos)
const SampleStateKind READ_SAMPLE_STATE
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long max_samples
Definition: IDLTemplate.txt:72
const SampleStateKind NOT_READ_SAMPLE_STATE
const long LENGTH_UNLIMITED
const InstanceStateKind ALIVE_INSTANCE_STATE

◆ take()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::Instance::take ( const T &  key,
SampleSequence &  samples,
InternalSampleInfoSequence &  infos,
CORBA::Long  max_samples,
DDS::SampleStateMask  sample_states,
DDS::ViewStateMask  view_states,
DDS::InstanceStateMask  instance_states 
)
inline

Definition at line 396 of file InternalDataReader.h.

References DDS::ALIVE_INSTANCE_STATE, DDS::LENGTH_UNLIMITED, OpenDDS::DCPS::make_sample_info(), max_samples, DDS::NOT_NEW_VIEW_STATE, DDS::NOT_READ_SAMPLE_STATE, and DDS::READ_SAMPLE_STATE.

403  {
405  return;
406  }
407 
408  CORBA::Long sample_count = 0;
409 
411  typename SampleList::iterator pos = read_samples_.begin();
412  for (typename SampleList::iterator limit = read_samples_.end();
413  pos != limit && (max_samples == DDS::LENGTH_UNLIMITED || sample_count < max_samples); ++pos) {
414  samples.push_back(pos->sample);
415  infos.push_back(make_sample_info(DDS::READ_SAMPLE_STATE, view_state_, instance_state_, pos->disposed_generation_count, pos->no_writers_generation_count, 0, 0, 0, true));
416  ++sample_count;
417  }
418  read_samples_.erase(read_samples_.begin(), pos);
419  }
420 
422  typename SampleList::iterator pos = not_read_samples_.begin();
423  for (typename SampleList::iterator limit = not_read_samples_.end();
424  pos != limit && (max_samples == DDS::LENGTH_UNLIMITED || sample_count < max_samples); ++pos) {
425  samples.push_back(pos->sample);
426  infos.push_back(make_sample_info(DDS::NOT_READ_SAMPLE_STATE, view_state_, instance_state_, pos->disposed_generation_count, pos->no_writers_generation_count, 0, 0, 0, true));
427  ++sample_count;
428  }
429  not_read_samples_.erase(not_read_samples_.begin(), pos);
430 
431  // Generate a synthetic sample for not alive states.
432  if (sample_count == 0 &&
433  instance_state_ != DDS::ALIVE_INSTANCE_STATE &&
435  samples.push_back(key);
436  infos.push_back(make_sample_info(DDS::NOT_READ_SAMPLE_STATE, view_state_, instance_state_, disposed_generation_count_, no_writers_generation_count_, 0, 0, 0, false));
437  ++sample_count;
438  }
439  }
440 
441  compute_ranks(sample_count, infos);
442 
443  if (sample_count) {
444  view_state_ = DDS::NOT_NEW_VIEW_STATE;
445  informed_of_not_alive_ = true;
446  }
447  }
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask sample_states
Definition: IDLTemplate.txt:72
ACE_CDR::Long Long
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask in ::DDS::InstanceStateMask instance_states
Definition: IDLTemplate.txt:72
sequence< octet > key
DDS::SampleInfo make_sample_info(DDS::SampleStateKind sample_state, DDS::ViewStateKind view_state, DDS::InstanceStateKind instance_state, CORBA::Long disposed_generation_count, CORBA::Long no_writers_generation_count, CORBA::Long sample_rank, CORBA::Long generation_rank, CORBA::Long absolute_generation_rank, bool valid_data)
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long in ::DDS::SampleStateMask in ::DDS::ViewStateMask view_states
Definition: IDLTemplate.txt:72
const ViewStateKind NOT_NEW_VIEW_STATE
void compute_ranks(CORBA::Long sample_count, InternalSampleInfoSequence &infos)
const SampleStateKind READ_SAMPLE_STATE
local interface<%TYPE%> inout ::DDS::SampleInfoSeq in long max_samples
Definition: IDLTemplate.txt:72
const SampleStateKind NOT_READ_SAMPLE_STATE
const long LENGTH_UNLIMITED
const InstanceStateKind ALIVE_INSTANCE_STATE

◆ unregister_instance()

template<typename T>
bool OpenDDS::DCPS::InternalDataReader< T >::Instance::unregister_instance ( InternalEntity_wrch  publication_handle,
const DDS::DataReaderQos qos 
)
inline

Definition at line 500 of file InternalDataReader.h.

References DDS::ALIVE_INSTANCE_STATE, DDS::ReaderDataLifecycleQosPolicy::autopurge_nowriter_samples_delay, DDS::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, OpenDDS::DCPS::TimePoint_T< SystemClock >::now(), DDS::DataReaderQos::reader_data_lifecycle, and OpenDDS::DCPS::TimePoint_T< AceClock >::to_dds_time().

502  {
503  publication_set_.erase(publication_handle);
504 
508  informed_of_not_alive_ = false;
509  return true;
510  }
511 
512  return false;
513  }
DDS::Time_t to_dds_time() const
Definition: TimePoint_T.inl:89
static TimePoint_T< SystemClock > now()
Definition: TimePoint_T.inl:41
ReaderDataLifecycleQosPolicy reader_data_lifecycle
const InstanceStateKind NOT_ALIVE_NO_WRITERS_INSTANCE_STATE
const InstanceStateKind ALIVE_INSTANCE_STATE

◆ view_state()

template<typename T>
DDS::ViewStateKind OpenDDS::DCPS::InternalDataReader< T >::Instance::view_state ( ) const
inline

Definition at line 313 of file InternalDataReader.h.

313 { return view_state_; }

◆ write()

template<typename T>
void OpenDDS::DCPS::InternalDataReader< T >::Instance::write ( InternalEntity_wrch  publication_handle,
const T &  sample,
const DDS::DataReaderQos qos 
)
inline

Definition at line 449 of file InternalDataReader.h.

References DDS::ALIVE_INSTANCE_STATE, DDS::HistoryQosPolicy::depth, DDS::DataReaderQos::history, DDS::KEEP_LAST_HISTORY_QOS, DDS::HistoryQosPolicy::kind, DDS::NEW_VIEW_STATE, DDS::NOT_ALIVE_DISPOSED_INSTANCE_STATE, DDS::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE, and DDS::NOT_NEW_VIEW_STATE.

452  {
453  publication_set_.insert(publication_handle);
454 
457  }
458 
459  switch (instance_state_) {
461  break;
464  break;
467  break;
468  }
469 
471 
473  while (read_samples_.size() + not_read_samples_.size() >= static_cast<size_t>(qos.history.depth)) {
474  if (!read_samples_.empty()) {
475  read_samples_.pop_front();
476  } else {
477  not_read_samples_.pop_front();
478  }
479  }
480  }
481 
483  }
HistoryQosPolicyKind kind
const ViewStateKind NOT_NEW_VIEW_STATE
const ViewStateKind NEW_VIEW_STATE
HistoryQosPolicy history
const InstanceStateKind NOT_ALIVE_DISPOSED_INSTANCE_STATE
const InstanceStateKind NOT_ALIVE_NO_WRITERS_INSTANCE_STATE
const InstanceStateKind ALIVE_INSTANCE_STATE

Member Data Documentation

◆ disposed_expiration_date_

template<typename T>
DDS::Time_t OpenDDS::DCPS::InternalDataReader< T >::Instance::disposed_expiration_date_
private

Definition at line 538 of file InternalDataReader.h.

◆ disposed_generation_count_

template<typename T>
CORBA::Long OpenDDS::DCPS::InternalDataReader< T >::Instance::disposed_generation_count_
private

Definition at line 540 of file InternalDataReader.h.

◆ informed_of_not_alive_

template<typename T>
bool OpenDDS::DCPS::InternalDataReader< T >::Instance::informed_of_not_alive_
private

Definition at line 542 of file InternalDataReader.h.

◆ instance_state_

template<typename T>
DDS::InstanceStateKind OpenDDS::DCPS::InternalDataReader< T >::Instance::instance_state_
private

Definition at line 537 of file InternalDataReader.h.

◆ no_writers_expiration_date_

template<typename T>
DDS::Time_t OpenDDS::DCPS::InternalDataReader< T >::Instance::no_writers_expiration_date_
private

Definition at line 539 of file InternalDataReader.h.

◆ no_writers_generation_count_

template<typename T>
CORBA::Long OpenDDS::DCPS::InternalDataReader< T >::Instance::no_writers_generation_count_
private

Definition at line 541 of file InternalDataReader.h.

◆ not_read_samples_

template<typename T>
SampleList OpenDDS::DCPS::InternalDataReader< T >::Instance::not_read_samples_
private

Definition at line 532 of file InternalDataReader.h.

◆ publication_set_

template<typename T>
PublicationSet OpenDDS::DCPS::InternalDataReader< T >::Instance::publication_set_
private

Definition at line 534 of file InternalDataReader.h.

◆ read_samples_

template<typename T>
SampleList OpenDDS::DCPS::InternalDataReader< T >::Instance::read_samples_
private

Definition at line 531 of file InternalDataReader.h.

◆ view_state_

template<typename T>
DDS::ViewStateKind OpenDDS::DCPS::InternalDataReader< T >::Instance::view_state_
private

Definition at line 536 of file InternalDataReader.h.


The documentation for this class was generated from the following file: