void RecorderImpl::remove_all_associations() { DBG_ENTRY_LVL("RecorderImpl","remove_all_associations",6); OpenDDS::DCPS::WriterIdSeq writers; int size; ACE_GUARD(ACE_Recursive_Thread_Mutex, guard, this->publication_handle_lock_); { ACE_READ_GUARD(ACE_RW_Thread_Mutex, read_guard, this->writers_lock_); size = static_cast<int>(writers_.size()); writers.length(size); WriterMapType::iterator curr_writer = writers_.begin(); WriterMapType::iterator end_writer = writers_.end(); int i = 0; while (curr_writer != end_writer) { writers[i++] = curr_writer->first; ++curr_writer; } } try { CORBA::Boolean dont_notify_lost = 0; if (0 < size) { remove_associations(writers, dont_notify_lost); } } catch (const CORBA::Exception&) { } }
void SubDriver::run() { ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) SubDriver::run, ") ACE_TEXT(" Wait for %s. \n"), pub_id_fname_.c_str ())); PublicationIds ids; // Wait for the publication id file created by the publisher. while (1) { FILE* fp = ACE_OS::fopen (pub_id_fname_.c_str (), ACE_TEXT("r")); if (fp == 0) { ACE_OS::sleep (1); } else { // This could be made cleaner by losing the old C-style I/O. ::OpenDDS::DCPS::PublicationId pub_id = OpenDDS::DCPS::GUID_UNKNOWN; char charBuffer[64]; while (fscanf (fp, "%s\n", &charBuffer[0]) != EOF) { std::stringstream buffer( charBuffer); buffer >> pub_id; ids.push_back (pub_id); std::stringstream idBuffer; idBuffer << pub_id; ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) SubDriver::run, ") ACE_TEXT(" Got from %s: pub_id=%C. \n"), pub_id_fname_.c_str (), buffer.str().c_str())); } ACE_OS::fclose (fp); break; } } CORBA::Object_var object = orb_->string_to_object (pub_driver_ior_.c_str ()); pub_driver_ = ::Test::TestPubDriver::_narrow (object.in ()); TEST_CHECK (!CORBA::is_nil (pub_driver_.in ())); size_t num_publications = ids.size (); // Set up the publications. OpenDDS::DCPS::AssociationData* publications = new OpenDDS::DCPS::AssociationData[num_publications]; for (size_t i = 0; i < num_publications; i ++) { publications[i].remote_id_ = ids[i]; publications[i].remote_data_.transport_id = ALL_TRAFFIC; // TBD later - wrong publications[i].remote_data_.publication_transport_priority = 0; OpenDDS::DCPS::NetworkAddress network_order_address(this->pub_addr_str_); ACE_OutputCDR cdr; cdr << network_order_address; size_t len = cdr.total_length (); publications[i].remote_data_.data = OpenDDS::DCPS::TransportInterfaceBLOB (len, len, (CORBA::Octet*)(cdr.buffer ())); } this->subscriber_.init(ALL_TRAFFIC, this->sub_id_, num_publications, publications, receive_delay_msec_); delete [] publications; while (this->subscriber_.received_test_message() != num_writes_) { ACE_OS::sleep(1); } pub_driver_->shutdown (); // Sleep before release transport so the connection will not go away. // This would avoid the problem of publisher sendv failure due to lost // connection during the shutdown period. ACE_OS::sleep (5); OpenDDS::DCPS::WriterIdSeq writers; writers.length(num_publications); for (size_t i = 0; i < num_publications; ++i) { writers[i] = ids[i]; } this->subscriber_.remove_associations(num_publications, writers.get_buffer(), this->sub_id_); // Tear-down the entire Transport Framework. TheTransportFactory->release(); TheServiceParticipant->shutdown(); }