WriterInfo::WriterInfo(WriterInfoListener* reader, const PublicationId& writer_id, const ::DDS::DataWriterQos& writer_qos, const ::DDS::DataReaderQos& reader_qos) : last_liveliness_activity_time_(ACE_OS::gettimeofday()), seen_data_(false), // Only check reader qos, because durable connection depends on it awaiting_historic_samples_(reader_qos.durability.kind > DDS::VOLATILE_DURABILITY_QOS), state_(NOT_SET), reader_(reader), writer_id_(writer_id), writer_qos_(writer_qos), handle_(DDS::HANDLE_NIL) { #ifndef OPENDDS_NO_OBJECT_MODEL_PROFILE this->reset_coherent_info(); #endif if (DCPS_debug_level >= 5) { GuidConverter writer_converter(writer_id); GuidConverter reader_converter(reader->subscription_id_); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) WriterInfo::WriterInfo: ") ACE_TEXT("writer %C added to reader %C.\n"), std::string(writer_converter).c_str(), std::string(reader_converter).c_str())); } }
WriterInfo::WriterInfo(WriterInfoListener* reader, const PublicationId& writer_id, const ::DDS::DataWriterQos& writer_qos) : last_liveliness_activity_time_(ACE_OS::gettimeofday()), seen_data_(false), historic_samples_timer_(NO_TIMER), remove_association_timer_(NO_TIMER), removal_deadline_(ACE_Time_Value::zero), last_historic_seq_(SequenceNumber::SEQUENCENUMBER_UNKNOWN()), waiting_for_end_historic_samples_(false), scheduled_for_removal_(false), notify_lost_(false), state_(NOT_SET), reader_(reader), writer_id_(writer_id), writer_qos_(writer_qos), handle_(DDS::HANDLE_NIL) { #ifndef OPENDDS_NO_OBJECT_MODEL_PROFILE this->reset_coherent_info(); #endif if (DCPS_debug_level >= 5) { GuidConverter writer_converter(writer_id); GuidConverter reader_converter(reader->subscription_id_); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) WriterInfo::WriterInfo: ") ACE_TEXT("writer %C added to reader %C.\n"), OPENDDS_STRING(writer_converter).c_str(), OPENDDS_STRING(reader_converter).c_str())); } }
void DataWriterRemoteImpl::add_association(const RepoId& yourId, const ReaderAssociation& reader, bool active) { if (DCPS_debug_level) { GuidConverter writer_converter(yourId); GuidConverter reader_converter(reader.readerId); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) DataWriterRemoteImpl::add_association - ") ACE_TEXT("local %C remote %C\n"), std::string(writer_converter).c_str(), std::string(reader_converter).c_str())); } DataWriterCallbacks* parent = 0; DDS::DataWriter_var dwv; { ACE_GUARD(ACE_Thread_Mutex, g, this->mutex_); dwv = getDataWriter(this->parent_); parent = this->parent_; } if (parent) { parent->add_association(yourId, reader, active); } }
void RecorderImpl::remove_associations(const WriterIdSeq& writers, bool notify_lost) { DBG_ENTRY_LVL("RecorderImpl", "remove_associations", 6); if (writers.length() == 0) { return; } if (DCPS_debug_level >= 1) { GuidConverter reader_converter(subscription_id_); GuidConverter writer_converter(writers[0]); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) RecorderImpl::remove_associations: ") ACE_TEXT("bit %d local %C remote %C num remotes %d \n"), is_bit_, OPENDDS_STRING(reader_converter).c_str(), OPENDDS_STRING(writer_converter).c_str(), writers.length())); } if (!this->entity_deleted_.value()) { // stop pending associations for these writer ids this->stop_associating(writers.get_buffer(), writers.length()); // writers which are considered non-active and can // be removed immediately WriterIdSeq non_active_writers; { CORBA::ULong wr_len = writers.length(); ACE_WRITE_GUARD(ACE_RW_Thread_Mutex, write_guard, this->writers_lock_); for (CORBA::ULong i = 0; i < wr_len; i++) { PublicationId writer_id = writers[i]; WriterMapType::iterator it = this->writers_.find(writer_id); if (it != this->writers_.end() && it->second->active(TheServiceParticipant->pending_timeout())) { remove_association_sweeper_->schedule_timer(it->second, notify_lost); } else { push_back(non_active_writers, writer_id); } } } remove_associations_i(non_active_writers, notify_lost); } else { remove_associations_i(writers, notify_lost); } }
void RecorderImpl::remove_associations_i(const WriterIdSeq& writers, bool notify_lost) { DBG_ENTRY_LVL("RecorderImpl", "remove_associations_i", 6); if (writers.length() == 0) { return; } if (DCPS_debug_level >= 1) { GuidConverter reader_converter(subscription_id_); GuidConverter writer_converter(writers[0]); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) RecorderImpl::remove_associations_i: ") ACE_TEXT("bit %d local %C remote %C num remotes %d \n"), is_bit_, OPENDDS_STRING(reader_converter).c_str(), OPENDDS_STRING(writer_converter).c_str(), writers.length())); } DDS::InstanceHandleSeq handles; ACE_GUARD(ACE_Recursive_Thread_Mutex, guard, this->publication_handle_lock_); // This is used to hold the list of writers which were actually // removed, which is a proper subset of the writers which were // requested to be removed. WriterIdSeq updated_writers; CORBA::ULong wr_len; //Remove the writers from writer list. If the supplied writer //is not in the cached writers list then it is already removed. //We just need remove the writers in the list that have not been //removed. { ACE_WRITE_GUARD(ACE_RW_Thread_Mutex, write_guard, this->writers_lock_); wr_len = writers.length(); for (CORBA::ULong i = 0; i < wr_len; i++) { PublicationId writer_id = writers[i]; WriterMapType::iterator it = this->writers_.find(writer_id); if (it != this->writers_.end()) { it->second->removed(); remove_association_sweeper_->cancel_timer(it->second); } if (this->writers_.erase(writer_id) == 0) { if (DCPS_debug_level >= 1) { GuidConverter converter(writer_id); ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) RecorderImpl::remove_associations_i: ") ACE_TEXT("the writer local %C was already removed.\n"), OPENDDS_STRING(converter).c_str())); } } else { push_back(updated_writers, writer_id); } } } wr_len = updated_writers.length(); // Return now if the supplied writers have been removed already. if (wr_len == 0) { return; } if (!is_bit_) { // The writer should be in the id_to_handle map at this time. Note // it if it not there. if (this->lookup_instance_handles(updated_writers, handles) == false) { if (DCPS_debug_level > 4) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) RecorderImpl::remove_associations_i: ") ACE_TEXT("lookup_instance_handles failed.\n"))); } } for (CORBA::ULong i = 0; i < wr_len; ++i) { id_to_handle_map_.erase(updated_writers[i]); } } for (CORBA::ULong i = 0; i < updated_writers.length(); ++i) { this->disassociate(updated_writers[i]); } // Mirror the add_associations SUBSCRIPTION_MATCHED_STATUS processing. if (!this->is_bit_) { // Derive the change in the number of publications writing to this reader. int matchedPublications = static_cast<int>(this->id_to_handle_map_.size()); this->subscription_match_status_.current_count_change = matchedPublications - this->subscription_match_status_.current_count; // Only process status if the number of publications has changed. if (this->subscription_match_status_.current_count_change != 0) { this->subscription_match_status_.current_count = matchedPublications; /// Section 7.1.4.1: total_count will not decrement. /// @TODO: Reconcile this with the verbiage in section 7.1.4.1 this->subscription_match_status_.last_publication_handle = handles[ wr_len - 1]; // set_status_changed_flag(DDS::SUBSCRIPTION_MATCHED_STATUS, true); // DDS::DataReaderListener_var listener // = listener_for(DDS::SUBSCRIPTION_MATCHED_STATUS); if (listener_.in()) { listener_->on_recorder_matched( this, this->subscription_match_status_); // Client will look at it so next time it looks the change should be 0 this->subscription_match_status_.total_count_change = 0; this->subscription_match_status_.current_count_change = 0; } // notify_status_condition(); } } // If this remove_association is invoked when the InfoRepo // detects a lost writer then make a callback to notify // subscription lost. if (notify_lost) { this->notify_subscription_lost(handles); } // if (this->monitor_) { // this->monitor_->report(); // } }