Exemplo n.º 1
0
bool
WriterInfo::active(ACE_Time_Value default_participant_timeout) const
{
  // Need some period of time by which to decide if a writer the
  // DataReaderImpl knows about has gone 'inactive'.  Used to determine
  // if a remove_associations should remove immediately or wait to let
  // reader process more information that may have queued up from the writer
  // Over-arching max wait time for removal is controlled in the
  // RemoveAssociationSweeper (10 seconds), but on a per writer basis set
  // activity_wait_period based on:
  //     1) Reader's liveliness_lease_duration
  //     2) DCPSPendingTimeout value (if not zero)
  //     3) Writer's max blocking time (could be infinite, in which case
  //        RemoveAssociationSweeper will remove after its max wait)
  //     4) Zero - don't wait, simply remove association
  ACE_Time_Value activity_wait_period(default_participant_timeout);
  if (reader_->liveliness_lease_duration_ != ACE_Time_Value::zero) {
    activity_wait_period = reader_->liveliness_lease_duration_;
  }
  if (activity_wait_period == ACE_Time_Value::zero) {
      activity_wait_period = duration_to_time_value(writer_qos_.reliability.max_blocking_time);
  }
  if (activity_wait_period == ACE_Time_Value::zero) {
    return false;
  }
  return (ACE_OS::gettimeofday() - last_liveliness_activity_time_) <= activity_wait_period;
}
Exemplo n.º 2
0
ACE_Time_Value WriterInfo::activity_wait_period() const
{
  ACE_Time_Value activity_wait_period(TheServiceParticipant->pending_timeout());
  if (reader_->liveliness_lease_duration_ != ACE_Time_Value::zero) {
    activity_wait_period = reader_->liveliness_lease_duration_;
  }
  if (activity_wait_period == ACE_Time_Value::zero) {
      activity_wait_period = duration_to_time_value(writer_qos_.reliability.max_blocking_time);
  }

  return activity_wait_period;
}
Exemplo n.º 3
0
void
OpenDDS::DCPS::InstanceState::schedule_release()
{
  DDS::DataReaderQos qos;
  this->reader_->get_qos(qos);

  DDS::Duration_t delay;

  switch (this->instance_state_) {
  case DDS::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE:
    delay = qos.reader_data_lifecycle.autopurge_nowriter_samples_delay;
    break;

  case DDS::NOT_ALIVE_DISPOSED_INSTANCE_STATE:
    delay = qos.reader_data_lifecycle.autopurge_disposed_samples_delay;
    break;

  default:
    ACE_ERROR((LM_ERROR,
               ACE_TEXT("(%P|%t) ERROR: InstanceState::schedule_release:")
               ACE_TEXT(" Unsupported instance state: %d!\n"),
               this->instance_state_));
    return;
  }

  if (delay.sec != DDS::DURATION_INFINITE_SEC &&
      delay.nanosec != DDS::DURATION_INFINITE_NSEC) {
    cancel_release();

    ACE_Reactor_Timer_Interface* reactor = this->reader_->get_reactor();

    this->release_timer_id_ =
      reactor->schedule_timer(this, 0, duration_to_time_value(delay));

    if (this->release_timer_id_ == -1) {
      ACE_ERROR((LM_ERROR,
                 ACE_TEXT("(%P|%t) ERROR: InstanceState::schedule_release:")
                 ACE_TEXT(" Unable to schedule timer!\n")));
    }

  } else {
    // N.B. instance transitions are always followed by a non-valid
    // sample being queued to the ReceivedDataElementList; marking
    // the release as pending prevents this sample from being lost
    // if all samples have been already removed from the instance.
    schedule_pending();
  }
}
OpenDDS::DCPS::OfferedDeadlineWatchdog::OfferedDeadlineWatchdog(
  lock_type & lock,
  DDS::DeadlineQosPolicy qos,
  OpenDDS::DCPS::DataWriterImpl * writer_impl,
  DDS::DataWriter_ptr writer,
  DDS::OfferedDeadlineMissedStatus & status,
  CORBA::Long & last_total_count)
  : Watchdog(duration_to_time_value(qos.period))
  , status_lock_(lock)
  , reverse_status_lock_(status_lock_)
  , writer_impl_(writer_impl)
  , writer_(DDS::DataWriter::_duplicate(writer))
  , status_(status)
  , last_total_count_(last_total_count)
{
}