Subscriber dropping samples (can't keep up ?)

1 post / 0 new
Last seen: 7 years 8 months ago
Joined: 09/14/2016
Posts: 1
Subscriber dropping samples (can't keep up ?)

I have a publisher/subscriber pair (created using  DDSTheParticipantFactory->create_participant_from_config). The subscriber uses a dynamic reader and waits on DDS_DATA_AVAILABLE_STATUS to receive new data from the publisher. At publication rates of > around 5 Hz, the subscriber begins to "miss" new samples, getting worse as the publication rate is increased. It will typically go for 1 - 3 seconds without seeing new samples, then receive a short burst (2 - 10) of consecutive samples, and repeat this cycle. rtiddsspy sees all the data from the publisher so the problem appears to be in the subscriber. Here is the relevant subscriber code:


// Common method which does the work of creating the subscriber
CFAI_DDSSubscriber::makeSubscriber(const char *participantLibrary,
                                   const char *participantName,
                                   const char *subscriberName,
                                   const char *readerName)
  char *tmp;
   asprintf(&tmp, "%s::%s", participantLibrary, participantName);

  participant = DDSTheParticipantFactory->create_participant_from_config(tmp);
  if (participant == NULL) {
    throw std::runtime_error("create_participant error");

  asprintf(&tmp, "%s::%s", subscriberName, readerName);
  dynamicReader = DDSDynamicDataReader::narrow(participant->
  if (dynamicReader == NULL) {
    throw std::runtime_error("lookup_datawriter_by_name error");

  //Set up the WaitSet and Condition, to wait for new data
  waitSet = new DDS::WaitSet();
  myStatusCond = dynamicReader->get_statuscondition();


  // Create dynamic data "container" to receive samples
  data = dynamicReader->create_data(DDS_DYNAMIC_DATA_PROPERTY_DEFAULT);


   Wait for new data. These methods return a pointer to a DDS dynamic data
   object. The type/structure of this object is defined in the XML file.

CFAI_DDSSubscriber::waitSample(DDS_Long timeout_ns,
                                                DDS_DynamicData **sample)
  DDS_Duration_t timeout;
  DDSConditionSeq activeConds;
  DDS_ReturnCode_t retCode;
  DDS_SampleInfo sampleInfo;

  if (timeout_ns >= 0)
    timeout = DDS_Duration_t::from_nanos((DDS_UnsignedLong)timeout_ns);
    timeout = DDS_Duration_t::from_seconds(DDS_DURATION_INFINITE_SEC);

  // Create a new container to receive the data
  DDS_DynamicData *data = dynamicReader->create_data(DDS_DYNAMIC_DATA_PROPERTY_DEFAULT);

  // Wait for new data
  retCode = waitSet->wait(activeConds, timeout);
  if (retCode == DDS_RETCODE_OK)   // data is available
    // Get the new data (single sample)

    retCode = dynamicReader->take_next_sample(*data, sampleInfo);

  *sample = data; // Return the dynamic data


Is there anything obviously wrong with this code which could cause it to misss new samples ?

I'm quite new to DDS and based the code on samples from the documentation. Any help or suggestions would be much appreciated.