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; }
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; }
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) { }