int ParticipantTask::svc() { try { ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) -> PARTICIPANT STARTED\n"))); DDS::DomainParticipantFactory_var dpf = TheParticipantFactory; DDS::DomainParticipant_var participant; DDS::Publisher_var publisher; DDS::DataWriter_var writer; FooDataWriter_var writer_i; DDS::StatusCondition_var cond; DDS::WaitSet_var ws = new DDS::WaitSet; { // Scope for guard to serialize creating Entities. GuardType guard(lock_); // Create Participant participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); #ifdef OPENDDS_SAFETY_PROFILE // RTPS cannot be shared char config_name[64], inst_name[64]; ACE_OS::snprintf(config_name, 64, "cfg_%d", thread_index_); ACE_OS::snprintf(inst_name, 64, "rtps_%d", thread_index_); ++thread_index_; ACE_DEBUG((LM_INFO, "(%P|%t) -> PARTICIPANT creating transport config %C\n", config_name)); OpenDDS::DCPS::TransportConfig_rch config = TheTransportRegistry->create_config(config_name); OpenDDS::DCPS::TransportInst_rch inst = TheTransportRegistry->create_inst(inst_name, "rtps_udp"); config->instances_.push_back(inst); TheTransportRegistry->bind_config(config_name, participant); #endif } // End of lock scope. if (CORBA::is_nil(participant.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" create_participant failed!\n")), 1); { // Create Publisher publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(publisher.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" create_publisher failed!\n")), 1); // Register Type (FooType) FooTypeSupport_var ts = new FooTypeSupportImpl; if (ts->register_type(participant.in(), "") != DDS::RETCODE_OK) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" register_type failed!\n")), 1); // Create Topic (FooTopic) DDS::Topic_var topic = participant->create_topic("FooTopic", CORBA::String_var(ts->get_type_name()), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" create_topic failed!\n")), 1); // Create DataWriter DDS::DataWriterQos writer_qos; publisher->get_default_datawriter_qos(writer_qos); writer_qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS; writer_qos.durability.kind = DDS::TRANSIENT_LOCAL_DURABILITY_QOS; #ifndef OPENDDS_NO_OWNERSHIP_PROFILE writer_qos.history.depth = static_cast<CORBA::Long>(samples_per_thread_); #endif writer = publisher->create_datawriter(topic.in(), writer_qos, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(writer.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" create_datawriter failed!\n")), 1); writer_i = FooDataWriter::_narrow(writer); if (CORBA::is_nil(writer_i)) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" _narrow failed!\n")), 1); // Block until Subscriber is available cond = writer->get_statuscondition(); cond->set_enabled_statuses(DDS::PUBLICATION_MATCHED_STATUS); ws->attach_condition(cond); DDS::Duration_t timeout = { DDS::DURATION_INFINITE_SEC, DDS::DURATION_INFINITE_NSEC }; DDS::ConditionSeq conditions; DDS::PublicationMatchedStatus matches = {0, 0, 0, 0, 0}; do { if (ws->wait(conditions, timeout) != DDS::RETCODE_OK) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" wait failed!\n")), 1); if (writer->get_publication_matched_status(matches) != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, "(%P|%t) ERROR: failed to get publication matched status\n")); ACE_OS::exit (1); } } while (matches.current_count < 1); ws->detach_condition(cond); // The following is intentionally inefficient to stress various // pathways related to publication; we should be especially dull // and write only one sample at a time per writer. ProgressIndicator progress("(%P|%t) PARTICIPANT %d%% (%d samples sent)\n", samples_per_thread_); for (std::size_t i = 0; i < samples_per_thread_; ++i) { Foo foo; foo.key = 3; DDS::InstanceHandle_t handle = writer_i->register_instance(foo); if (writer_i->write(foo, handle) != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: svc()") ACE_TEXT(" write failed!\n")), 1); } ++progress; } DDS::Duration_t interval = { 30, 0}; if( DDS::RETCODE_OK != writer->wait_for_acknowledgments( interval)) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P:%t) ERROR: svc() - ") ACE_TEXT("timed out waiting for acks!\n") ), 1); } } // Clean-up! ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) <- PUBLISHER PARTICIPANT DEL CONT ENTITIES\n"))); participant->delete_contained_entities(); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) <- PUBLISHER DELETE PARTICIPANT\n"))); dpf->delete_participant(participant.in()); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) <- PUBLISHER PARTICIPANT VARS GOING OUT OF SCOPE\n"))); } catch (const CORBA::Exception& e) { e._tao_print_exception("caught in svc()"); return 1; } ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) <- PARTICIPANT FINISHED\n"))); return 0; }
int main (int argc, char *argv[]) { try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil()); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } MessageTypeSupportImpl* servant = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != servant->register_type(participant.in (), "")) { cerr << "register_type failed." << endl; exit(1); } CORBA::String_var type_name = servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil()); if (CORBA::is_nil (topic.in ())) { cerr << "create_topic failed." << endl; exit(1); } TAO::DCPS::TransportImpl_rch tcp_impl = TheTransportFactory->create_transport_impl (transport_impl_id, ::TAO::DCPS::AUTO_CONFIG); DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil()); if (CORBA::is_nil (pub.in ())) { cerr << "create_publisher failed." << endl; exit(1); } // Attach the publisher to the transport. TAO::DCPS::PublisherImpl* pub_impl = TAO::DCPS::reference_to_servant<TAO::DCPS::PublisherImpl> (pub.in()); if (0 == pub_impl) { cerr << "Failed to obtain publisher servant" << endl; exit(1); } TAO::DCPS::AttachStatus status = pub_impl->attach_transport(tcp_impl.in()); if (status != TAO::DCPS::ATTACH_OK) { std::string status_str; switch (status) { case TAO::DCPS::ATTACH_BAD_TRANSPORT: status_str = "ATTACH_BAD_TRANSPORT"; break; case TAO::DCPS::ATTACH_ERROR: status_str = "ATTACH_ERROR"; break; case TAO::DCPS::ATTACH_INCOMPATIBLE_QOS: status_str = "ATTACH_INCOMPATIBLE_QOS"; break; default: status_str = "Unknown Status"; break; } cerr << "Failed to attach to the transport. Status == " << status_str.c_str() << endl; exit(1); } // Create the datawriter DDS::DataWriterQos dw_qos; pub->get_default_datawriter_qos (dw_qos); dw_qos.durability.kind = DDS::TRANSIENT_LOCAL_DURABILITY_QOS; dw_qos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; dw_qos.resource_limits.max_samples_per_instance = 1000; dw_qos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; DDS::DataWriter_var dw = pub->create_datawriter(topic.in (), dw_qos, DDS::DataWriterListener::_nil()); if (CORBA::is_nil (dw.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } Writer* writer = new Writer(dw.in()); writer->start (); while ( !writer->is_finished()) { ACE_Time_Value small(0,250000); ACE_OS::sleep (small); } // Cleanup writer->end (); delete writer; participant->delete_contained_entities(); dpf->delete_participant(participant.in ()); TheTransportFactory->release(); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit(1); } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { int return_result = 0; try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); participant = dpf->create_participant(11, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } Messenger::MessageTypeSupportImpl* mts_servant = new Messenger::MessageTypeSupportImpl; if (DDS::RETCODE_OK != mts_servant->register_type(participant.in (), "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts_servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber (SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } // Create the listener. DDS::DataReaderListener_var listener (new DataReaderListenerImpl); DataReaderListenerImpl* listener_servant = dynamic_cast<DataReaderListenerImpl*>(listener.in()); if (CORBA::is_nil (listener.in ())) { cerr << "ERROR: listener is nil." << endl; exit(1); } DDS::DataReaderQos dr_qos; // Good QoS. sub->get_default_datareader_qos (dr_qos); dr_qos.resource_limits.max_samples_per_instance = MAX_SAMPLES_PER_INSTANCES; dr_qos.resource_limits.max_samples = MAX_SAMPLES; dr_qos.resource_limits.max_instances = MAX_INSTANCES; #ifndef OPENDDS_NO_OWNERSHIP_PROFILE dr_qos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; dr_qos.history.depth = MAX_SAMPLES_PER_INSTANCES; #endif DDS::DataReader_var dr1 = sub->create_datareader (topic.in (), dr_qos, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr1.in ()) ) { cerr << "ERROR: create_datareader failed." << endl; exit(1); } DDS::DataReader_var dr2 = sub->create_datareader (topic.in (), dr_qos, DDS::DataReaderListener::_nil (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr2.in ()) ) { cerr << "ERROR: create_datareader failed." << endl; exit(1); } int max_attempts = 10; int attempts = 0; // Synchronize with publisher. Wait until both associate with DataWriter. while (attempts < max_attempts) { ::DDS::SubscriptionMatchedStatus status1; ::DDS::SubscriptionMatchedStatus status2; if (dr1->get_subscription_matched_status (status1) == ::DDS::RETCODE_OK && dr2->get_subscription_matched_status (status2) == ::DDS::RETCODE_OK) { if (status1.total_count == 2 && status2.total_count == 2) break; ++ attempts; ACE_OS::sleep (1); } else { cerr << "ERROR: Failed to get subscription matched status" << endl; exit (1); } } if (attempts >= max_attempts) { cerr << "ERROR: failed to make associations. " << endl; exit (1); } // ---------------------------------------------- ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Subscriber: sleep for %d milliseconds\n"), SLEEP_DURATION.msec())); // Wait for publisher to finish sending ACE_OS::sleep (SLEEP_DURATION); long rej_max_samples = listener_servant->num_rejected_for_max_samples(); long rej_max_instances = listener_servant->num_rejected_for_max_instances(); long rej_max_samp_instance = listener_servant->num_rejected_for_max_samples_per_instance(); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Subscriber: %d rejected for ") ACE_TEXT ("max_samples\n"), rej_max_samples)); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Subscriber: %d rejected for ") ACE_TEXT ("max_instances\n"), rej_max_instances)); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Subscriber: %d rejected for ") ACE_TEXT ("max_samples_per_instance\n"), rej_max_samp_instance)); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) Subscriber: received %d ") ACE_TEXT ("samples\n"), listener_servant->num_arrived() )); // 3 instances writing 5 messages each // expect 2 rejected for max_samples // expect 6 rejected for max_instances (register_instance + 5 messages) // expect 1 rejected for max_samples_per_instance #ifndef OPENDDS_NO_OWNERSHIP_PROFILE if (rej_max_samples != 2) { cerr << "ERROR: Failed to reject expected for max_samples" << endl; return_result = 1; } #endif if (rej_max_instances != 6) { cerr << "ERROR: Failed to reject expected for max_instances" << endl; return_result = 1; } #ifndef OPENDDS_NO_OWNERSHIP_PROFILE if (rej_max_samp_instance != 1) { cerr << "ERROR: Failed to reject expected for max_samples_per_instance" << endl; return_result = 1; } #endif Messenger::MessageDataReader_var message_dr1 = Messenger::MessageDataReader::_narrow(dr1.in()); Messenger::MessageDataReader_var message_dr2 = Messenger::MessageDataReader::_narrow(dr2.in()); message_dr1->set_listener(DDS::DataReaderListener::_nil (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); message_dr2->set_listener(DDS::DataReaderListener::_nil (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); listener = DDS::DataReaderListener::_nil (); ACE_OS::sleep (2); if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ACE_OS::sleep(2); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "SUB: Exception caught in main ():" << endl << e << endl; return_result = 1; } return return_result; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); if( parse_args(argc, argv) != 0) return 1; ACE_DEBUG((LM_DEBUG, "(%P|%t) subscriber.cpp main()\n")); participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } Messenger::MessageTypeSupportImpl* mts_servant = new Messenger::MessageTypeSupportImpl(); OpenDDS::DCPS::LocalObject_var safe_servant = mts_servant; if (DDS::RETCODE_OK != mts_servant->register_type(participant.in (), "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts_servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } // activate the listener DDS::DataReaderListener_var listener (new DataReaderListenerImpl); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } DataReaderListenerImpl* listener_servant = dynamic_cast<DataReaderListenerImpl*>(listener.in()); if (!listener_servant) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: listener_servant is nil (dynamic_cast failed)!\n")), -1); } // Create the Datareaders DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); DDS::DataReader_var dr = sub->create_datareader(topic.in (), dr_qos, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } // Indicate that the subscriber is ready FILE* readers_ready = ACE_OS::fopen (sub_ready_filename, ACE_TEXT ("w")); if (readers_ready == 0) { cerr << "ERROR Unable to create subscriber ready file." << endl; exit(1); } ACE_OS::fclose(readers_ready); // Wait for the publisher to be ready FILE* writers_ready = 0; do { ACE_Time_Value small_time(0,250000); ACE_OS::sleep (small_time); writers_ready = ACE_OS::fopen (pub_ready_filename, ACE_TEXT ("r")); } while (0 == writers_ready); ACE_OS::fclose(writers_ready); // Since the publisher continue sending while the subscriber crashes, // some messages may be lost, we lower the num_expected_reads by 2. num_expected_reads -= num_reads_deviation; FILE* writers_completed = 0; int timeout_writes = 0; while ( listener_servant->num_reads() < num_expected_reads) { // Get the number of the timed out writes from publisher so we // can re-calculate the number of expected messages. Otherwise, // the blocking timeout test will never exit from this loop. if (writers_completed == 0) { writers_completed = ACE_OS::fopen (pub_finished_filename, ACE_TEXT ("r")); if (writers_completed != 0) { if (end_with_publisher) { // Since we are in the "bp_timeout" test case that publisher // close connection when backpressure last longer than // max_output_pause_period, the publisher ends as it finishes // sending. As the subscriber sees the publisher is done, it // changes the read_delay_ms to 0 so it can read all received // messages and them announce it completed. int old_read_delay_ms = read_delay_ms; read_delay_ms = 0; // Give time to finish reading. ACE_OS::sleep (old_read_delay_ms/1000 * 2); break; } //writers_completed = ACE_OS::fopen (pub_finished_filename, "r"); fscanf (writers_completed, "%d\n", &timeout_writes); num_expected_reads -= timeout_writes; cout << "timed out writes " << timeout_writes << ", we expect " << num_expected_reads << endl; } } ACE_OS::sleep (1); } // Indicate that the subscriber is done FILE* readers_completed = ACE_OS::fopen (sub_finished_filename, ACE_TEXT ("w")); if (readers_completed == 0) { cerr << "ERROR Unable to create subscriber completed file." << endl; exit(1); } ACE_OS::fclose(readers_completed); // Wait for 5 seconds to (>passive_reconnect_duration) // to give transport time to detect the connection lost due to // backpressure timeout before shutdown the datareader. if (end_with_publisher) ACE_OS::sleep (5); if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "Exception caught in main ():" << endl << e << endl; return 1; } if (verify_lost_sub_notification && actual_lost_sub_notification != expected_lost_sub_notification) { ACE_ERROR ((LM_ERROR, "(%P|%t) ERROR: on_subscription_lost called %d times " "and expected %d times\n", actual_lost_sub_notification, expected_lost_sub_notification)); return 1; } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR** argv) { parse_args(argc, argv); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) -> SUBSCRIBER STARTED\n"))); ::CORBA::Long sec = deadline_msec / 1000; ::CORBA::ULong remainder_msec = (deadline_msec - 1000*sec); ::CORBA::ULong nanosec = remainder_msec * 1000000; DDS::Duration_t const DEADLINE_PERIOD = { sec, nanosec }; bool deadline_used = DEADLINE_PERIOD.sec > 0 || DEADLINE_PERIOD.nanosec > 0; try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); SubscriberListenerImpl * subscriberListener = new SubscriberListenerImpl(received_samples, missed_samples); DDS::SubscriberListener_var subscriberListener_var = subscriberListener; // Create Participant DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(participant.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_participant failed!\n")), 1); ACE_Time_Value delay_between_cycles(0, delay_between_cycles_msec * 1000); bool expected_samples_received = false; int i = 0; do { ++i; ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) -> Subscriber cycle %d\n"), i)); // Create Subscriber DDS::Subscriber_var subscriber = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, subscriberListener, ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(subscriber.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_subscriber failed!\n")), 2); // Register Type (FooType) FooTypeSupport_var ts = new FooTypeSupportImpl; if (ts->register_type(participant.in(), "") != DDS::RETCODE_OK) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" register_type failed!\n")), 5); // Create Topic (FooTopic) DDS::Topic_var topic = participant->create_topic("FooTopic", ts->get_type_name(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); DDS::TopicDescription_ptr topic_used = topic.in(); DDS::ContentFilteredTopic_ptr cft = 0; if (use_cft) { // Topic name must be unique. ACE_CString topic_name = "FooTopic-Filtered-" + toStr(i); cft = participant->create_contentfilteredtopic(topic_name.c_str(), topic, "key > 0", DDS::StringSeq()); if (CORBA::is_nil(cft)) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_contentfilteredtopic failed!\n")), 8); topic_used = cft; } if (CORBA::is_nil(topic.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_topic failed!\n")), 6); // Create DataReader DDS::DataReaderQos reader_qos; subscriber->get_default_datareader_qos(reader_qos); reader_qos.history.kind = DDS::KEEP_ALL_HISTORY_QOS; if (deadline_used) { reader_qos.deadline.period.sec = DEADLINE_PERIOD.sec; reader_qos.deadline.period.nanosec = DEADLINE_PERIOD.nanosec; } DDS::DataReader_var reader = subscriber->create_datareader(topic_used, reader_qos, DDS::DataReaderListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(reader.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_datareader failed!\n")), 7); ACE_Time_Value sample_count_sleep(0, sample_count_sleep_msec * 1000); std::size_t sample_count; std::size_t sample_count_start = subscriberListener->samples_processed(); do { ACE_OS::sleep(sample_count_sleep); sample_count = subscriberListener->samples_processed(); expected_samples_received = sample_count >= expected_samples; // ACE_DEBUG((LM_DEBUG, "(%P|%t) sample_count = %d\n", sample_count)); } while (!expected_samples_received && (sample_count - sample_count_start) < samples_per_cycle); subscriber->delete_datareader(reader.in()); if (use_cft) CORBA::release(cft); participant->delete_subscriber(subscriber.in()); ACE_OS::sleep(delay_between_cycles); } while (!expected_samples_received); participant->delete_contained_entities(); dpf->delete_participant(participant.in()); TheServiceParticipant->shutdown(); ACE_DEBUG ((LM_INFO, ACE_TEXT("INFO: %d samples received\n"), subscriberListener->received_samples())); if (deadline_used) ACE_DEBUG ((LM_INFO, ACE_TEXT("INFO: deadline missed %d times\n"), subscriberListener->missed_samples())); } catch (const CORBA::Exception& e) { e._tao_print_exception("caught in main()"); return 9; } ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) <- SUBSCRIBER FINISHED\n"))); return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { try { // Initialize DomainParticipantFactory DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); std::string participant_id; std::vector<std::string> readers; std::vector<std::string> writers; bool reliable = false; int total_readers = 0, total_writers = 0; { // New scope. ACE_Arg_Shifter shifter (argc, argv); while (shifter.is_anything_left ()) { const ACE_TCHAR* x; x = shifter.get_the_parameter (ACE_TEXT("-participant")); if (x != NULL) { participant_id = ACE_TEXT_ALWAYS_CHAR(x); } x = shifter.get_the_parameter (ACE_TEXT("-reader")); if (x != NULL) { readers.push_back(ACE_TEXT_ALWAYS_CHAR(x)); } x = shifter.get_the_parameter (ACE_TEXT("-writer")); if (x != NULL) { writers.push_back(ACE_TEXT_ALWAYS_CHAR(x)); } x = shifter.get_the_parameter (ACE_TEXT("-reliable")); if (x != NULL) { reliable = ACE_OS::atoi(x); } x = shifter.get_the_parameter (ACE_TEXT("-total_readers")); if (x != NULL) { total_readers = ACE_OS::atoi(x); } x = shifter.get_the_parameter (ACE_TEXT("-total_writers")); if (x != NULL) { total_writers = ACE_OS::atoi(x); } shifter.consume_arg (); } } participant_id.resize(12); // Create DomainParticipant DDS::DomainParticipantQos dp_qos; dpf->get_default_participant_qos(dp_qos); dp_qos.user_data.value.length(6); dp_qos.user_data.value[0] = fromhex(participant_id, 0); dp_qos.user_data.value[1] = fromhex(participant_id, 1); dp_qos.user_data.value[2] = fromhex(participant_id, 2); dp_qos.user_data.value[3] = fromhex(participant_id, 3); dp_qos.user_data.value[4] = fromhex(participant_id, 4); dp_qos.user_data.value[5] = fromhex(participant_id, 5); DDS::DomainParticipant_var participant = dpf->create_participant(DOMAIN_ID, dp_qos, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!participant) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_participant failed!\n")), -1); } // Register TypeSupport TestMsgTypeSupport_var ts = new TestMsgTypeSupportImpl; if (ts->register_type(participant, "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" register_type failed!\n")), -1); } // Create Topic CORBA::String_var type_name = ts->get_type_name(); DDS::Topic_var topic = participant->create_topic("TheTopic", type_name, TOPIC_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!topic) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_topic failed!\n")), -1); } // Create Subscriber DDS::Subscriber_var subscriber = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!subscriber) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_subscriber failed!\n")), -1); } const int n_msgs = reliable ? MSGS_PER_WRITER * total_writers : 0; // Create DataReaders for (std::vector<std::string>::iterator pos = readers.begin(), limit = readers.end(); pos != limit; ++pos) { pos->resize(6); DDS::DataReaderListener_var listener(new DataReaderListenerImpl(*pos, n_msgs, reader_done_callback)); DDS::DataReaderQos qos; subscriber->get_default_datareader_qos(qos); qos.user_data.value.length(3); qos.user_data.value[0] = fromhex(*pos, 0); qos.user_data.value[1] = fromhex(*pos, 1); qos.user_data.value[2] = fromhex(*pos, 2); qos.reliability.kind = reliable ? DDS::RELIABLE_RELIABILITY_QOS : DDS::BEST_EFFORT_RELIABILITY_QOS; DDS::DataReader_var reader = subscriber->create_datareader(topic, qos, listener, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!reader) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_datareader failed!\n")), -1); } TestMsgDataReader_var reader_i = TestMsgDataReader::_narrow(reader); if (!reader_i) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" _narrow failed!\n")), -1); } } WriterTask task(writers, participant, topic, reliable, total_readers); task.activate(DEFAULT_FLAGS, writers.size()); task.wait(); if (!reliable) ACE_OS::sleep(10); else { ACE_Guard<ACE_Thread_Mutex> g(readers_done_lock); while (readers_done != static_cast<int>(readers.size())) readers_done_cond.wait(); // Sleep allows an ACKNACK to be generated. ACE_OS::sleep(3); } // Clean-up! participant->delete_contained_entities(); dpf->delete_participant(participant); TheServiceParticipant->shutdown(); } catch (const CORBA::Exception& e) { e._tao_print_exception("Exception caught in main():"); return -1; } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { int status = EXIT_SUCCESS; try { // Initialize DomainParticipantFactory DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); // handle test performance issue on one platform #if defined (sun) const char* udpTransName = "udp"; OpenDDS::DCPS::TransportInst_rch inst = OpenDDS::DCPS::TransportRegistry::instance()->get_inst(udpTransName); if (inst != 0) { OpenDDS::DCPS::UdpInst_rch udp_inst = OpenDDS::DCPS::dynamic_rchandle_cast<OpenDDS::DCPS::UdpInst>(inst); if (udp_inst == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: retrieving transport config for: %C failed!\n"), udpTransName), -1); } udp_inst->rcv_buffer_size_ = 0x40000; } #endif // Create DomainParticipant DDS::DomainParticipant_var participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(participant.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_participant() failed!\n")), -1); } // Register Type (Messenger::Message) Messenger::MessageTypeSupport_var ts = new Messenger::MessageTypeSupportImpl(); if (ts->register_type(participant.in(), "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: register_type() failed!\n")), -1); } // Create Topic (Movie Discussion List) CORBA::String_var type_name = ts->get_type_name(); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_topic() failed!\n")), -1); } // Create Subscriber DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(sub.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_subscriber() failed!\n")), -1); } // Create DataReader DataReaderListenerImpl* listener_svt = new DataReaderListenerImpl; DDS::DataReaderListener_var listener(listener_svt); DDS::DataReaderQos qos; sub->get_default_datareader_qos(qos); qos.liveliness.kind = DDS::AUTOMATIC_LIVELINESS_QOS; qos.liveliness.lease_duration.sec = 10; qos.liveliness.lease_duration.nanosec = 0; qos.history.kind = DDS::KEEP_ALL_HISTORY_QOS; bool reliable = true; parse_args(argc, argv, reliable); if (reliable) { qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS; } DDS::DataReader_var reader = sub->create_datareader(topic.in(), qos, listener.in(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(reader.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_datareader() failed!\n")), -1); } for (int delay = 0; listener_svt->num_samples() != num_messages_expected && delay < 60; ++delay) { ACE_OS::sleep(1); } const long received = listener_svt->num_samples(); const bool data_consistent = listener_svt->data_consistent(); if (reliable && data_consistent && received < num_messages_expected) { std::cout << "ERROR: data loss (" << received << "/" << num_messages_expected << " received)\n"; status = EXIT_FAILURE; } else if (!data_consistent) { status = EXIT_FAILURE; } else { const unsigned int percent = ((num_messages_expected - received) * 100) / num_messages_expected; std::cout << "data loss == " << percent << "% (" << received << "/" << num_messages_expected << " received)\n"; } // Clean-up! ACE_DEBUG((LM_DEBUG, "Subscriber delete contained entities\n")); participant->delete_contained_entities(); ACE_DEBUG((LM_DEBUG, "Subscriber delete participant\n")); dpf->delete_participant(participant); ACE_DEBUG((LM_DEBUG, "Subscriber shutdown\n")); TheServiceParticipant->shutdown(); ACE_DEBUG((LM_DEBUG, "Subscriber wait for thread manager\n")); ACE_Thread_Manager::instance()->wait(); ACE_DEBUG((LM_DEBUG, "Subscriber vars going out of scope\n")); } catch (const CORBA::Exception& e) { e._tao_print_exception("Exception caught in main():"); status = EXIT_FAILURE; } ACE_DEBUG((LM_DEBUG, "Subscriber exiting with status=%d\n", status)); return status; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); // Default DomainParticipantFactory qos is to auto enable. ::DDS::DomainParticipantFactoryQos fqos; if (dpf->get_qos (fqos) != ::DDS::RETCODE_OK) { cerr << "DomainParticipantFactory get_qos failed." << endl; return 1; } if (fqos.entity_factory.autoenable_created_entities == 0) { cerr << "The DomainParticipantFactory defaults to autoenable upon entities creation." << endl; return 1; } // Now disable DomainParticipantFactory autoenable fqos.entity_factory.autoenable_created_entities = 0; if (dpf->set_qos (fqos) != ::DDS::RETCODE_OK) { cerr << "DomainParticipantFactory set_qos failed." << endl; return 1; } DDS::DomainParticipant_var participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } if (participant->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "DomainParticipant can not be enabled because factory autoenable is off." << endl; return 1; } MessageTypeSupport_var mts = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != mts->register_type(participant.in (), "")) { cerr << "register_type failed." << endl; exit(1); } CORBA::String_var type_name = mts->get_type_name (); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "create_topic failed." << endl; exit(1); } if (topic->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "Topic can not be enabled because DomainParticipant is not enabled." << endl; return 1; } DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub.in ())) { cerr << "create_publisher failed." << endl; exit(1); } if (pub->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "Publisher can not be enabled because DomainParticipant is not enabled." << endl; return 1; } // Create the datawriter DDS::DataWriter_var dw = pub->create_datawriter(topic.in (), DATAWRITER_QOS_DEFAULT, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } if (dw->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "DataWriter can not be enabled because Publisher is not enabled." << endl; return 1; } // Now enable DomainParticipantFactory autoenable fqos.entity_factory.autoenable_created_entities = 1; if (dpf->set_qos (fqos) != ::DDS::RETCODE_OK) { cerr << "DomainParticipantFactory set_qos failed." << endl; return 1; } // Enable every entity from factory to it's entities and it should succeed. if (participant->enable () != ::DDS::RETCODE_OK || topic->enable () != ::DDS::RETCODE_OK || pub->enable () != ::DDS::RETCODE_OK) { cerr << "Failed to enable factory." << endl; return 1; } Writer* writer = new Writer(dw.in()); writer->start (); writer->wait (); delete writer; participant->delete_contained_entities(); dpf->delete_participant(participant.in ()); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit(1); } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); participant = dpf->create_participant(111, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } Messenger::MessageTypeSupport_var mts_servant = new Messenger::MessageTypeSupportImpl; if (DDS::RETCODE_OK != mts_servant->register_type (participant.in (), "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts_servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); topic_qos.lifespan.duration.sec = 10; topic_qos.lifespan.duration.nanosec = 0; topic_qos.durability.kind = DDS::TRANSIENT_LOCAL_DURABILITY_QOS; DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } // activate the listener DDS::DataReaderListener_var listener (new DataReaderListenerImpl); DataReaderListenerImpl* const listener_servant = dynamic_cast<DataReaderListenerImpl*>(listener.in()); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } if (!listener_servant) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: listener_servant is nil (dynamic_cast failed)!\n")), -1); } // Create the Datareaders DDS::DataReader_var dr = sub->create_datareader(topic.in (), DATAREADER_QOS_USE_TOPIC_QOS, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } ACE_OS::sleep (10); if (listener_servant->num_reads () != 1) { cerr << "ERROR: Incorrect number of samples received." << endl << " Expired data was probably read." << endl; exit (1); } if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ACE_OS::sleep(2); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "SUB: Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { int status = 0; try { // Initialize DomainParticipantFactory DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); int error; if ((error = parse_args(argc, argv)) != 0) { return error; } // Create DomainParticipant DDS::DomainParticipant_var participant = dpf->create_participant(4, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(participant.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_participant() failed!\n")), -1); } // Register Type (Messenger::Message) Messenger::MessageTypeSupport_var ts = new Messenger::MessageTypeSupportImpl(); if (ts->register_type(participant.in(), "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: register_type() failed!\n")), -1); } // Create Topic (Movie Discussion List) CORBA::String_var type_name = ts->get_type_name(); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_topic() failed!\n")), -1); } // Create Subscriber DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(sub.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_subscriber() failed!\n")), -1); } // Create DataReader DataReaderListenerImpl* const listener_servant = new DataReaderListenerImpl; DDS::DataReaderListener_var listener(listener_servant); DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos(dr_qos); if (DataReaderListenerImpl::is_reliable()) { std::cout << "Reliable DataReader" << std::endl; dr_qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS; } DDS::DataReader_var reader = sub->create_datareader(topic.in(), dr_qos, listener.in(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(reader.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_datareader() failed!\n")), -1); } // Block until Publisher completes DDS::StatusCondition_var condition = reader->get_statuscondition(); condition->set_enabled_statuses(DDS::SUBSCRIPTION_MATCHED_STATUS); DDS::WaitSet_var ws = new DDS::WaitSet; ws->attach_condition(condition); DDS::Duration_t timeout = { DDS::DURATION_INFINITE_SEC, DDS::DURATION_INFINITE_NSEC }; DDS::ConditionSeq conditions; DDS::SubscriptionMatchedStatus matches = { 0, 0, 0, 0, 0 }; while (true) { if (reader->get_subscription_matched_status(matches) != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: get_subscription_matched_status() failed!\n")), -1); } if (matches.current_count == 0 && matches.total_count > 0) { break; } if (ws->wait(conditions, timeout) != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: wait() failed!\n")), -1); } } status = listener_servant->is_valid() ? 0 : -1; ws->detach_condition(condition); // Clean-up! participant->delete_contained_entities(); dpf->delete_participant(participant.in()); TheServiceParticipant->shutdown(); } catch (const CORBA::Exception& e) { e._tao_print_exception("Exception caught in main():"); status = -1; } return status; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("initialization starting.\n") )); } dpf = TheParticipantFactoryWithArgs(argc, argv); participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("participant created.\n") )); } MessageTypeSupportImpl* mts_servant = new MessageTypeSupportImpl; Messenger::MessageTypeSupport_var mts = mts_servant; if (DDS::RETCODE_OK != mts_servant->register_type(participant, "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts_servant->get_type_name(); if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("type support installed.\n") )); } DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("topic created.\n") )); } // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("subscriber created.\n") )); } // activate the listener DDS::DataReaderListener_var listener (new DataReaderListenerImpl); DataReaderListenerImpl* listener_servant = dynamic_cast<DataReaderListenerImpl*>(listener.in()); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("listener created.\n") )); } // Create the Datareaders DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); DDS::DataReader_var dr = sub->create_datareader(topic.in (), dr_qos, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } if( OpenDDS::DCPS::DCPS_debug_level > 0) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) subscriber: ") ACE_TEXT("processing starting.\n") )); } int expected = 5; while ( listener_servant->num_reads() < expected) { ACE_OS::sleep (1); } if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ACE_OS::sleep(2); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "SUB: Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant1; DDS::DomainParticipant_var participant2; { OpenDDS::DCPS::TypeSupport_var typsup = new Xyz::FooTypeSupportImpl; Options configopt(argc, argv); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) Running colocation opt %C\n"), configopt.collocation_str.c_str() )); Factory fconfig(configopt, typsup); Options plainopt; Factory fplain(plainopt, typsup); DDS::DataReaderListener_var drl1(new DataReaderListenerImpl(configopt)); DDS::DataReaderListener_var drl2(new DataReaderListenerImpl(plainopt)); if (configopt.collocation_str == "none") { participant1 = fconfig.participant(dpf); Puller r(fconfig, dpf, participant1, drl1); TEST_ASSERT(assert_supported(configopt, r.reader_.in())); r.pull(ACE_Time_Value(1)); } else if (configopt.collocation_str == "process") { participant1 = fconfig.participant(dpf); Puller r1(fconfig, dpf, participant1, drl1); participant2 = fplain.participant(dpf); Puller r2(fplain, dpf, participant2, drl2); TEST_ASSERT (participant1.in() != participant2.in()); TEST_ASSERT(assert_supported(configopt, r1.reader_)); if (configopt.entity_str == "none") { TEST_ASSERT(assert_supported(configopt, r1.reader_)); } else { TEST_ASSERT(!assert_supported(configopt, r2.reader_)); } r1.pull(ACE_Time_Value(1)); } else if (configopt.collocation_str == "participant") { participant1 = fconfig.participant(dpf); participant2 = participant1; Puller r1(fconfig, dpf, participant1, drl1); Puller r2(fplain, dpf, participant2, drl2); TEST_ASSERT(assert_supported(configopt, r1.reader_)); TEST_ASSERT(assert_supported(configopt, r2.reader_)); r1.pull(ACE_Time_Value(1)); } else if (configopt.collocation_str == "pubsub") { participant1 = fconfig.participant(dpf); participant2 = participant1; DDS::Subscriber_var subscriber1(fconfig.subscriber(participant1)); Puller r1(fconfig, dpf, participant1, subscriber1, drl1); DDS::Subscriber_var subscriber2(fplain.subscriber(participant2)); Puller r2(fplain, dpf, participant2, subscriber2, drl1); TEST_ASSERT(assert_supported(configopt, r1.reader_)); TEST_ASSERT(assert_supported(configopt, r2.reader_)); r1.pull(ACE_Time_Value(1)); } if (configopt.collocation_str == "none") { TEST_ASSERT(assert_subscription_matched(configopt, drl1)); } else if (configopt.collocation_str == "process") { TEST_ASSERT(assert_subscription_matched(configopt, drl1) && assert_subscription_matched(configopt, drl2)); } else if (configopt.collocation_str == "participant") { TEST_ASSERT(assert_subscription_matched(configopt, drl1) && assert_subscription_matched(configopt, drl2)); } else if (configopt.collocation_str == "pubsub") { TEST_ASSERT(assert_subscription_matched(configopt, drl1) && assert_subscription_matched(configopt, drl2)); } } ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) Shutting subscriber down ...\n"))); { ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, shutdown_lock, 1); shutdown_flag = true; } // only want to clean up participant2 if it isn't just pointing to // participant1 if (participant1.in() == participant2.in()) participant2 = 0; if (participant1) { ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) deleting entities1\n"))); // Delete any topics, publishers and subscribers owned by participant participant1->delete_contained_entities(); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) deleting participant1\n"))); // Delete participant itself dpf->delete_participant(participant1); } if (participant2) { ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) deleting entities2\n"))); // Delete any topics, publishers and subscribers owned by participant participant2->delete_contained_entities(); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) deleting participant2\n"))); // Delete participant itself dpf->delete_participant(participant2); } ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) Subscriber shutting down svc part\n"))); // Shut down info repo connection TheServiceParticipant->shutdown(); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) Subscriber shutdown complete\n"))); } catch (char const *ex) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) Assertion failed.\n"), ex), -1); } catch (const CORBA::Exception &ex) { ex._tao_print_exception("Exception caught in main.cpp:"); return 1; } catch (const OpenDDS::DCPS::Transport::MiscProblem& ) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) Transport::MiscProblem caught.\n")), -1); } ACE_ERROR_RETURN((LM_INFO, ACE_TEXT("(%P|%t) done.\n")), 0); }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { long expected_late = 0; try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); participant = dpf->create_participant(111, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("l:")); int c; while ((c = get_opts ()) != -1) { switch(c) { case 'l': expected_late = ACE_OS::atoi (get_opts.opt_arg ()); break; case '?': default: ACE_ERROR_RETURN ((LM_ERROR, "usage: %s " "-l expected late samples " "\n", argv [0]), -1); } } Messenger::MessageTypeSupportImpl::_var_type mts_servant = new Messenger::MessageTypeSupportImpl; if (DDS::RETCODE_OK != mts_servant->register_type (participant.in (), "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts_servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } // Create the subscriber DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } // activate the listener DDS::DataReaderListener_var listener (new DataReaderListenerImpl); DataReaderListenerImpl* const listener_servant = dynamic_cast<DataReaderListenerImpl*>(listener.in()); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } if (!listener_servant) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: listener_servant is nil (dynamic_cast failed)!\n")), -1); } // Create the Datareaders DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); dr_qos.latency_budget.duration.sec = 1; dr_qos.latency_budget.duration.nanosec = 0; DDS::DataReader_var dr = sub->create_datareader(topic.in (), dr_qos, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } dynamic_cast<OpenDDS::DCPS::DataReaderImpl*> (dr.in ())-> reset_latency_stats (); dynamic_cast<OpenDDS::DCPS::DataReaderImpl*> (dr.in ())-> statistics_enabled (true); ACE_OS::sleep (10); if (listener_servant->num_reads () != 10) { cerr << "ERROR: Incorrect number of samples received." << endl << " Expired data was probably read." << endl; exit (1); } if (listener_servant->num_late () != expected_late) { cerr << "ERROR: Incorrect number of samples received late." << endl; exit (1); } if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ACE_OS::sleep(2); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "SUB: Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { int status = 0; try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(111, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } DDS::DomainParticipant_var participant2 = dpf->create_participant(111, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant2.in ())) { cerr << "create_participant failed." << endl; return 1; } try { OpenDDS::DCPS::TransportConfig_rch cfg = TheTransportRegistry->get_config("part1"); if (!cfg.is_nil()) { TheTransportRegistry->bind_config(cfg, participant); } cfg = TheTransportRegistry->get_config("part2"); if (!cfg.is_nil()) { TheTransportRegistry->bind_config(cfg, participant2); } } catch (const OpenDDS::DCPS::Transport::NotFound&) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) Transport::NotFound caught.\n")), -1); } if (parse_args (argc, argv) == -1) { return -1; } MessageTypeSupport_var mts = new MessageTypeSupportImpl(); MessageTypeSupport_var mts2 = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != mts->register_type(participant.in (), "")) { cerr << "register_type failed." << endl; exit(1); } if (DDS::RETCODE_OK != mts2->register_type(participant2.in (), "")) { cerr << "register_type failed." << endl; exit(1); } CORBA::String_var type_name = mts->get_type_name (); CORBA::String_var type_name2 = mts2->get_type_name (); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "create_topic failed." << endl; exit(1); } DDS::Topic_var topic2 = participant2->create_topic ("Movie Discussion List", type_name2.in (), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic2.in ())) { cerr << "create_topic failed." << endl; exit(1); } DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub.in ())) { cerr << "create_publisher failed." << endl; exit(1); } DDS::Publisher_var pub2 = participant2->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub2.in ())) { cerr << "create_publisher failed." << endl; exit(1); } DataWriterListenerImpl * dwl1_servant = new DataWriterListenerImpl; ::DDS::DataWriterListener_var dwl1 (dwl1_servant); DataWriterListenerImpl * dwl2_servant = new DataWriterListenerImpl; ::DDS::DataWriterListener_var dwl2 (dwl2_servant); DataWriterListenerImpl * dwl3_servant = new DataWriterListenerImpl; ::DDS::DataWriterListener_var dwl3 (dwl3_servant); DataWriterListenerImpl * dwl4_servant = new DataWriterListenerImpl; ::DDS::DataWriterListener_var dwl4 (dwl4_servant); // Create the datawriters ::DDS::DataWriterQos dw_qos; pub->get_default_datawriter_qos (dw_qos); ::DDS::DataWriterQos dw2_qos; pub2->get_default_datawriter_qos (dw2_qos); dw_qos.liveliness.kind = ::DDS::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS; dw_qos.liveliness.lease_duration.sec = LEASE_DURATION_SEC; dw_qos.liveliness.lease_duration.nanosec = 0; dw2_qos.liveliness.kind = ::DDS::MANUAL_BY_PARTICIPANT_LIVELINESS_QOS; dw2_qos.liveliness.lease_duration.sec = LEASE_DURATION_SEC; dw2_qos.liveliness.lease_duration.nanosec = 0; // Create the datawriter DDS::DataWriter_var dw1 = pub->create_datawriter(topic.in (), dw_qos, dwl1.in(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw1.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } // Create the datawriter DDS::DataWriter_var dw2 = pub2->create_datawriter(topic2.in (), dw2_qos, dwl2.in(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw2.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } dw_qos.liveliness.kind = ::DDS::MANUAL_BY_TOPIC_LIVELINESS_QOS; // Create the datawriter DDS::DataWriter_var dw3 = pub->create_datawriter(topic.in (), dw_qos, dwl3.in(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw3.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } // Create the datawriter DDS::DataWriter_var dw4 = pub->create_datawriter(topic.in (), dw_qos, dwl4.in(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw4.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } { Write_Samples writer1(dw1, "Manual_By_Participant_Writer_1"); Assert_Participant_Liveliness writer2(dw2, "Manual_By_Participant_Writer_2"); Write_Samples writer3(dw3, "Manual_By_Topic_Writer_1"); Assert_Writer_Liveliness writer4(dw4, "Manual_By_Topic_Writer_2"); writer1.start(); writer2.start(); writer3.start(); writer4.start(); writer1.end(); writer2.end(); writer3.end(); writer4.end(); } const unsigned long actual = dwl1_servant->num_liveliness_lost_callbacks() + dwl2_servant->num_liveliness_lost_callbacks() + dwl3_servant->num_liveliness_lost_callbacks() + dwl4_servant->num_liveliness_lost_callbacks(); if (liveliness_lost_test && static_cast<int>(actual) != num_liveliness_lost_callbacks) { cerr << "ERROR: did not receive expected liveliness lost callbacks. " << actual << "/" << num_liveliness_lost_callbacks << endl; status = 1; } ACE_OS::sleep(1); ACE_DEBUG((LM_INFO, "publisher deleting entities\n")); participant->delete_contained_entities(); dpf->delete_participant(participant.in ()); participant2->delete_contained_entities(); dpf->delete_participant(participant2.in ()); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit(1); } catch (const OpenDDS::DCPS::Transport::MiscProblem&) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("(%P|%t) Transport::MiscProblem caught.\n")), -1); } return status; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]){ try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(11, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { ACE_DEBUG((LM_DEBUG, "create_participant failed.\n")); return 1; } MessageTypeSupportImpl* servant = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != servant->register_type(participant.in (), "")) { ACE_DEBUG((LM_DEBUG, "register_type failed.\n")); exit(1); } CORBA::String_var type_name = servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { ACE_DEBUG((LM_DEBUG, "create_topic failed.\n")); exit(1); } DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub.in ())) { ACE_DEBUG((LM_DEBUG, "create_publisher failed.\n")); exit(1); } DDS::DataWriterQos dw_qos; pub->get_default_datawriter_qos (dw_qos); dw_qos.deadline.period.sec = 4; dw_qos.deadline.period.nanosec = 0; // Create DataWriter with 4 second deadline period which // should be compatible with first DataReader which has 5 // seconds deadline period and not with second DataReader // which has 3 seconds deadline period. DDS::DataWriter_var dw = pub->create_datawriter(topic, dw_qos, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); int const max_attempts = 20000; int attempts = 1; { // Wait for both first DataReader connect and write messages. std::auto_ptr<Writer> writer (new Writer (dw.in ())); while (attempts != max_attempts) { ::DDS::InstanceHandleSeq handles; dw->get_matched_subscriptions(handles); if (handles.length() == 1) break; else ACE_OS::sleep(1); ++attempts; } if (attempts == max_attempts) { ACE_DEBUG((LM_DEBUG, "ERROR: subscriptions failed to match.\n")); exit (1); } writer->start (); writer->end (); ACE_DEBUG((LM_DEBUG, "Writer changing deadline to incompatible value\n")); // Now set DataWriter deadline to be 6 seconds which is not // compatible with the existing DataReader. This QoS change // should be applied and the association broken. dw_qos.deadline.period.sec = 6; if (dw->set_qos (dw_qos) != ::DDS::RETCODE_OK) { ACE_DEBUG((LM_DEBUG, "ERROR: DataWriter could not change deadline period which " "should break DataReader associations\n")); exit (1); } else { DDS::WaitSet_var ws = new DDS::WaitSet; DDS::StatusCondition_var sc = dw->get_statuscondition(); sc->set_enabled_statuses(DDS::PUBLICATION_MATCHED_STATUS); ws->attach_condition(sc); DDS::PublicationMatchedStatus matched; DDS::ConditionSeq active; const DDS::Duration_t timeout = {5, 0}; // seconds while (dw->get_publication_matched_status(matched) == DDS::RETCODE_OK && matched.current_count) { if (ws->wait(active, timeout) == DDS::RETCODE_TIMEOUT) { break; } } ws->detach_condition(sc); if (matched.current_count != 0) { ACE_DEBUG((LM_DEBUG, "ERROR: DataWriter changed deadline period which should " "break association with all existing DataReaders, but did not\n")); exit(1); } } // We know the reader has been disassociated, but the reader itself may // not have been notified yet. Introducing delay here to let the reader // sync up with the disassociated state before re-associating. // Wait for reader to finish unmatching. FILE* fp = ACE_OS::fopen (synch_fname, ACE_TEXT("r")); int i = 0; while (fp == 0 && i < 15) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) waiting reader to unmatch...\n"))); ACE_OS::sleep (1); ++i; fp = ACE_OS::fopen (synch_fname, ACE_TEXT("r")); } if (fp != 0) ACE_OS::fclose (fp); ACE_DEBUG((LM_DEBUG, "Writer restoring deadline to compatible value\n")); // change it back dw_qos.deadline.period.sec = 5; if (dw->set_qos (dw_qos) != ::DDS::RETCODE_OK) { ACE_DEBUG((LM_DEBUG, "ERROR: DataWriter could not change deadline period which " "should restore DataReader associations\n")); exit (1); } } { // Wait for both second DataReader connect which changed deadline period // from 3 seconds to 5 seconds. std::auto_ptr<Writer> writer (new Writer (dw.in ())); attempts = 1; while (attempts != max_attempts) { ::DDS::InstanceHandleSeq handles; dw->get_matched_subscriptions(handles); if (handles.length() == 2) break; else ACE_OS::sleep(1); ++attempts; } if (attempts == max_attempts) { ACE_DEBUG((LM_DEBUG, "ERROR: subscriptions failed to match.\n")); exit(1); } writer->start (); writer->end (); } { // Wait for subscriber exit. attempts = 1; while (attempts != max_attempts) { ::DDS::InstanceHandleSeq handles; dw->get_matched_subscriptions(handles); if (handles.length() == 0) break; else ACE_OS::sleep(1); ++ attempts; } if (attempts == max_attempts) { ACE_DEBUG((LM_DEBUG, "ERROR: failed to wait for DataReader exit.\n")); exit (1); } } participant->delete_contained_entities(); dpf->delete_participant(participant.in ()); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit(1); } TheServiceParticipant->shutdown (); return 0; }
int main (int argc, char *argv[]) { try { // initialize the participant. the same as in the publisher DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(42, // Domain ID PARTICIPANT_QOS_DEFAULT, 0, // No listener required OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!participant) { std::cerr << "create_participant failed." << std::endl; return 1 ; } Messenger::MessageTypeSupport_var mts = new Messenger::MessageTypeSupportImpl(); if (DDS::RETCODE_OK != mts->register_type(participant, "")) { std::cerr << "Failed to register the MessageTypeSupport." << std::endl; return 1; } CORBA::String_var type_name = mts->get_type_name (); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name, TOPIC_QOS_DEFAULT, 0, // No listener required OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!topic) { std::cerr << "Failed to create_topic." << std::endl; return 1; } // Create the subscriber DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, 0, // No listener required OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!sub) { std::cerr << "Failed to create_subscriber." << std::endl; return 1; } // Associate a listener object with the data reader we create, // so we can use it to detect when data is available. // The listener is allocated on the heap and assigned to a// // DataReaderListener_var object. This type provides // reference counting behavior so the listener is // automatically cleaned up when the last reference to it is // removed. This usage is typical for heap allocations in // OpenDDS application code and frees the application // developer from having to actively manage the lifespan of // the allocated objects. DDS::DataReaderListener_var listener(new DataReaderListenerImpl); // Create the data reader DDS::DataReader_var dr = sub->create_datareader(topic, DATAREADER_QOS_DEFAULT, listener, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!dr) { std::cerr << "create_datareader failed." << std::endl; return 1; } // clean up //1. delete all the topics, subscribers and publishers create // with this participant //2. when done, use the factory to delete the domain participant. participant->delete_contained_entities(); dpf->delete_participant(participant); TheServiceParticipant->shutdown (); } catch(...) { std::cerr << "ERROR!!! exception caught" << std::endl; } }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { try { // Initialize DomainParticipantFactory DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); // Create DomainParticipant DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!participant) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_participant failed!\n")), -1); } // Register TypeSupport (Messenger::Message) Messenger::MessageTypeSupport_var ts = new Messenger::MessageTypeSupportImpl; if (ts->register_type(participant, "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" register_type failed!\n")), -1); } // Create Topic (Movie Discussion List) CORBA::String_var type_name = ts->get_type_name(); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name, TOPIC_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!topic) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_topic failed!\n")), -1); } // Create Publisher DDS::Publisher_var publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!publisher) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_publisher failed!\n")), -1); } // Create DataWriter DDS::DataWriter_var writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, 0, OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (!writer) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" create_datawriter failed!\n")), -1); } Messenger::MessageDataWriter_var message_writer = Messenger::MessageDataWriter::_narrow(writer); if (!message_writer) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" _narrow failed!\n")), -1); } // Block until Subscriber is available DDS::StatusCondition_var condition = writer->get_statuscondition(); condition->set_enabled_statuses(DDS::PUBLICATION_MATCHED_STATUS); DDS::WaitSet_var ws = new DDS::WaitSet; ws->attach_condition(condition); while (true) { DDS::PublicationMatchedStatus matches; if (writer->get_publication_matched_status(matches) != ::DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" get_publication_matched_status failed!\n")), -1); } if (matches.current_count >= 1) { break; } DDS::ConditionSeq conditions; DDS::Duration_t timeout = { 60, 0 }; if (ws->wait(conditions, timeout) != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" wait failed!\n")), -1); } } ws->detach_condition(condition); // Write samples Messenger::Message message; message.subject_id = 99; message.from = "Comic Book Guy"; message.subject = "Review"; message.text = "Worst. Movie. Ever."; message.count = 0; for (int i = 0; i < 10; ++i) { DDS::ReturnCode_t error = message_writer->write(message, DDS::HANDLE_NIL); ++message.count; ++message.subject_id; if (error != DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" write returned %d!\n"), error)); } } // Wait for samples to be acknowledged DDS::Duration_t timeout = { 30, 0 }; if (message_writer->wait_for_acknowledgments(timeout) != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: %N:%l: main() -") ACE_TEXT(" wait_for_acknowledgments failed!\n")), -1); } // Clean-up! participant->delete_contained_entities(); dpf->delete_participant(participant); TheServiceParticipant->shutdown(); } catch (const CORBA::Exception& e) { e._tao_print_exception("Exception caught in main():"); return -1; } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]){ try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(11, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } else { ACE_DEBUG ((LM_DEBUG, "Created participant 1 with instance handle %d\n", participant->get_instance_handle ())); } DDS::DomainParticipant_var participant2 = dpf->create_participant(11, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant2.in ())) { cerr << "create_participant2 failed." << endl; return 1; } else { ACE_DEBUG ((LM_DEBUG, "Created participant 2 with instance handle %d\n", participant2->get_instance_handle ())); } // Register TypeSupport (Messenger::Message) Messenger::MessageTypeSupport_var mts = new Messenger::MessageTypeSupportImpl(); if (mts->register_type(participant.in(), "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: register_type failed!\n")), -1); } // Create Topic CORBA::String_var type_name = mts->get_type_name(); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_topic failed!\n")), -1); } // Create Publisher DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(pub.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_publisher failed!\n")), -1); } // Create DataWriter DDS::DataWriter_var dw = pub->create_datawriter(topic.in(), DATAWRITER_QOS_DEFAULT, DDS::DataWriterListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(dw.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_datawriter failed!\n")), -1); } DDS::ReturnCode_t retcode = participant2->delete_topic (topic.in ()); if (retcode != DDS::RETCODE_PRECONDITION_NOT_MET) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: should not be able to delete topic, not part of this participant!\n")), -1); } DDS::ReturnCode_t retcode5 = participant->delete_topic (topic.in ()); if (retcode5 != DDS::RETCODE_PRECONDITION_NOT_MET) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: should not be able to delete topic, still referenced by datawriter!\n")), -1); } DDS::ReturnCode_t retcode2 = pub->delete_datawriter (dw.in ()); if (retcode2 != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: should be able to delete datawriter\n")), -1); } dw = DDS::DataWriter::_nil (); DDS::Duration_t timeout; timeout.sec = 0; timeout.nanosec = 0; // Doing a find_topic will require us to call delete topic twice, see // 7.1.2.2.1.11 from the dds spec DDS::Topic_var topic2 = participant->find_topic ("Movie Discussion List", timeout); if (CORBA::is_nil (topic2.in ())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: Not able to find topic\n")), -1); } DDS::ReturnCode_t retcode4 = participant->delete_topic (topic.in ()); if (retcode4 != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: should be able to delete topic\n")), -1); } topic = DDS::Topic::_nil (); DDS::ReturnCode_t retcode6 = participant->delete_topic (topic2.in ()); if (retcode6 != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: should be able to delete topic\n")), -1); } topic2 = DDS::Topic::_nil (); DDS::ReturnCode_t retcode8 = participant->delete_publisher (pub.in ()); if (retcode8 != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: should be able to delete publisher\n")), -1); } pub = DDS::Publisher::_nil (); dpf->delete_participant(participant.in ()); participant = DDS::DomainParticipant::_nil (); dpf->delete_participant(participant2.in ()); participant2 = DDS::DomainParticipant::_nil (); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "dp: Exception caught in main.cpp:" << endl << e << endl; exit(1); } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { try { // Initialize DomainParticipantFactory DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); if (parse_args (argc, argv) != 0) { return 1; } TheServiceParticipant->monitor_factory_->initialize(); // Create DomainParticipant DDS::DomainParticipant_var participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(participant.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_participant failed!\n")), -1); } // Register TypeSupport (Messenger::Message) Messenger::MessageTypeSupport_var mts = new Messenger::MessageTypeSupportImpl(); if (mts->register_type(participant.in(), "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: register_type failed!\n")), -1); } // Create Topic DDS::Topic_var topic = participant->create_topic("Movie Discussion List", mts->get_type_name(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_topic failed!\n")), -1); } // Create Publisher DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(pub.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_publisher failed!\n")), -1); } // Create DataWriter DDS::DataWriter_var dw = pub->create_datawriter(topic.in(), DATAWRITER_QOS_DEFAULT, DDS::DataWriterListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(dw.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" ERROR: create_datawriter failed!\n")), -1); } // Start writing threads Writer* writer = new Writer(dw.in()); writer->start(); while (!writer->is_finished()) { ACE_Time_Value small_time(0, 250000); ACE_OS::sleep(small_time); } writer->end(); delete writer; // Clean-up! participant->delete_contained_entities(); dpf->delete_participant(participant.in()); TheServiceParticipant->shutdown(); } catch (const CORBA::Exception& e) { e._tao_print_exception("Exception caught in main():"); ACE_OS::exit(-1); } return 0; }
bool Publisher::run (void) { ::DDS::DomainId_t domain_id = 411; try { sync_client_->way_point_reached (1); sync_client_->get_notification (); ACE_High_Res_Timer participant_timer; participant_timer.start(); for (size_t count = 0; count < participant_count_; count++) { participant_[count] = dpf_->create_participant (domain_id, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant_[count].in ())) { cerr << "create_participant failed." << endl; return false; } } participant_timer.stop(); Messenger::MessageTypeSupport_var mts = new Messenger::MessageTypeSupportImpl(); for (size_t count = 0; count < participant_count_; count++) { if (DDS::RETCODE_OK != mts->register_type(participant_[count].in (), "")) { cerr << "register_type failed." << endl; return false; } } CORBA::String_var type_name = mts->get_type_name (); DDS::TopicQos topic_qos; participant_[0]->get_default_topic_qos(topic_qos); ACE_High_Res_Timer topic_timer; topic_timer.start(); for (size_t count = 0; count < topic_count_; count++) { topic_[count] = participant_[count % participant_count_]->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic_[count].in ())) { cerr << "create_topic failed." << endl; return false; } } topic_timer.stop(); // Initialize the transports for( size_t count = 0; count < writer_count_; ++count) { this->transports_[ count] = TheTransportFactory->obtain( this->transport_impl_id_ + count); if( false == this->transports_[ count].is_nil()) { // Only create transports that need to be. continue; } this->transports_[ count] = TheTransportFactory->create_transport_impl( this->transport_impl_id_ + count, ACE_TEXT("SimpleTcp"), ::OpenDDS::DCPS::DONT_AUTO_CONFIG ); OpenDDS::DCPS::TransportConfiguration_rch config = TheTransportFactory->create_configuration( this->transport_impl_id_ + count, ACE_TEXT("SimpleTcp") ); if( this->transports_[ count]->configure( config.in()) != 0) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) %T ERROR: TCP ") ACE_TEXT("failed to configure the transport.\n") )); return false; } } ACE_High_Res_Timer pub_timer; pub_timer.start(); for (size_t count = 0; count < writer_count_; count++) { // Create the publisher and attach to the corresponding // transport. pub_[count] = participant_[count]->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub_[count].in ())) { cerr << "create_publisher failed." << endl; return false; } OpenDDS::DCPS::PublisherImpl* pub_impl = dynamic_cast< OpenDDS::DCPS::PublisherImpl*>(pub_[count].in ()); if (0 == pub_impl) { cerr << "Failed to obtain publisher servant" << endl; return false; } // Attach the publisher to the transport. OpenDDS::DCPS::AttachStatus status = pub_impl->attach_transport( this->transports_[ count].in() ); if (status != OpenDDS::DCPS::ATTACH_OK) { std::string status_str; switch (status) { case OpenDDS::DCPS::ATTACH_BAD_TRANSPORT: status_str = "ATTACH_BAD_TRANSPORT"; break; case OpenDDS::DCPS::ATTACH_ERROR: status_str = "ATTACH_ERROR"; break; case OpenDDS::DCPS::ATTACH_INCOMPATIBLE_QOS: status_str = "ATTACH_INCOMPATIBLE_QOS"; break; default: status_str = "Unknown Status"; break; } cerr << "Failed to attach to the transport. Status == " << status_str.c_str() << endl; return false; } } // Create the datawriter DDS::DataWriterQos dw_qos; pub_[0]->get_default_datawriter_qos (dw_qos); for (size_t count = 0; count < writer_count_; count++) { dw_[count] = pub_[count]->create_datawriter(topic_[count].in (), dw_qos, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw_[count].in ())) { cerr << "create_datawriter failed." << endl; return false; } } // Wait for all expected subscribers while (true) { ::DDS::InstanceHandleSeq handles; dw_[0]->get_matched_subscriptions(handles); //ACE_DEBUG ((LM_DEBUG, "(%P|%t) subs connected: %d\n", handles.length())); if (handles.length() >= subscriber_count_) { break; } ACE_OS::sleep (1); } pub_timer.stop (); // sync up sync_client_->way_point_reached (2); sync_client_->get_notification (); ACE_Time_Value tv; participant_timer.elapsed_time (tv); sync_client_->publish (SyncExt::Topic, topic_count_, tv.msec()); //ACE_DEBUG ((LM_DEBUG, "(%P|%t) Created %d participants in %d secs.\n" //, participant_count_, tv.sec())); topic_timer.elapsed_time (tv); sync_client_->publish (SyncExt::Participant, participant_count_ , tv.msec()); //ACE_DEBUG ((LM_DEBUG, "(%P|%t) Created %d topics in %d secs.\n" //, topic_count_, tv.sec())); pub_timer.elapsed_time (tv); sync_client_->publish (SyncExt::Publisher, writer_count_ , tv.msec()); //ACE_DEBUG ((LM_DEBUG, "(%P|%t) Created %d publishers in %d secs.\n" //, writer_count_, tv.sec())); /* std::auto_ptr<Writer> writer (new Writer(dw_[0].in())); writer->start (); while ( !writer->is_finished()) { ACE_Time_Value small(0,250000); ACE_OS::sleep (small); } // Cleanup writer->end (); //delete writer; */ for (size_t count = 0; count < participant_count_; count++) { participant_[count]->delete_contained_entities (); dpf_->delete_participant (participant_[count].in ()); } TheTransportFactory->release(); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in Publisher::run():\n " << e << endl; return false; } return true; }
int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { bool ok = true; bool generated_config = false; int mypid = ACE_OS::getpid(); try { //Look to see if the config file (.ini) was generated //for rtps participant processing for(int i = 0; i < argc; ++i) { if(ACE_OS::strstr(argv[i], ACE_TEXT("generated"))) { generated_config = true; } else if (0 == ACE_OS::strcmp(ACE_TEXT("-p"), argv[i]) && i < argc - 1) { mypid = ACE_OS::atoi(argv[i + 1]); } } // Initialize DomainParticipantFactory DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); // handle test performance issue on one platform #if defined (sun) const char* udpTransName = "udp"; OpenDDS::DCPS::TransportInst_rch inst = OpenDDS::DCPS::TransportRegistry::instance()->get_inst(udpTransName); if (inst != 0) { OpenDDS::DCPS::UdpInst_rch udp_inst = OpenDDS::DCPS::dynamic_rchandle_cast<OpenDDS::DCPS::UdpInst>(inst); if (udp_inst == 0) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: retrieving transport config for: %C failed!\n"), udpTransName), -1); } udp_inst->rcv_buffer_size_ = 0x40000; } #endif const Options options(argc, argv); // Create DomainParticipant typedef std::vector<DDS::DomainParticipant_var> Participants; Participants participants(options.num_sub_participants); // Register Type (Messenger::Message) Messenger::MessageTypeSupport_var ts = new Messenger::MessageTypeSupportImpl(); CORBA::String_var type_name = ts->get_type_name(); typedef std::vector<DataReaderListenerImpl*> ListenerServants; ListenerServants listener_servants; std::vector<DDS::DataReaderListener_var> listeners; std::stringstream ss; ss << std::setw(5) << mypid; const std::string pid = ss.str(); ACE_DEBUG((LM_DEBUG, ACE_TEXT("%T (%P|%t) Created dpf\n"))); unsigned int part_index = 0; for (Participants::iterator part = participants.begin(); part != participants.end(); ++part, ++part_index) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("%T (%P|%t) Creating participant\n"))); *part = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(part->in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_participant() failed!\n")), -1); } if (generated_config) { std::stringstream domain_config_stream; std::string config_name = "domain_part_"; domain_config_stream << config_name << part_index; OPENDDS_STRING config; config = domain_config_stream.str().c_str(); TheTransportRegistry->bind_config(config, *part); } if (ts->register_type(part->in(), "") != DDS::RETCODE_OK) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: register_type() failed!\n")), -1); } // Create Topic (Movie Discussion List) DDS::Topic_var topic = (*part)->create_topic("Movie Discussion List", type_name.in(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_topic() failed!\n")), -1); } // Create Subscriber DDS::Subscriber_var sub = (*part)->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(sub.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_subscriber() failed!\n")), -1); } DDS::DataReaderQos qos; sub->get_default_datareader_qos(qos); qos.liveliness.kind = DDS::AUTOMATIC_LIVELINESS_QOS; qos.liveliness.lease_duration.sec = 10; qos.liveliness.lease_duration.nanosec = 0; qos.history.kind = DDS::KEEP_ALL_HISTORY_QOS; if (options.reliable) { qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS; } for (unsigned int reader = 0; reader < options.num_readers; ++reader) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("%T (%P|%t) Creating reader\n"))); // Create DataReader listener_servants.push_back(new DataReaderListenerImpl(options, pid, part_index, reader)); listeners.push_back(DDS::DataReaderListener_var(listener_servants.back())); DDS::DataReader_var data_reader = sub->create_datareader(topic.in(), qos, listeners.back().in(), OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(data_reader.in())) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l main()") ACE_TEXT(" ERROR: create_datareader() failed!\n")), -1); } } } const unsigned int sleep_delay_msec = 500; unsigned int delay = 0; while (delay < options.total_duration_msec) { bool complete = true; for (ListenerServants::const_iterator listener = listener_servants.begin(); listener != listener_servants.end(); ++listener) { if (!(*listener)->done()) { complete = false; } } if (complete) break; delay += sleep_delay_msec; ACE_OS::sleep(ACE_Time_Value(0, sleep_delay_msec * 1000)); } ACE_DEBUG((LM_DEBUG, ACE_TEXT("%T (%P|%t) Listeners done (ran for %d msec)\n"), delay)); if (delay >= options.total_duration_msec) { for (ListenerServants::const_iterator listener = listener_servants.begin(); listener != listener_servants.end(); ++listener) { (*listener)->report_errors(); } if (options.reliable) { ok = false; } } // Clean-up! for (Participants::iterator part = participants.begin(); part != participants.end(); ++part) { (*part)->delete_contained_entities(); dpf->delete_participant(*part); } TheServiceParticipant->shutdown(); ACE_Thread_Manager::instance()->wait(); } catch (const CORBA::Exception& e) { e._tao_print_exception("Exception caught in main():"); return -1; } catch (const OpenDDS::DCPS::Transport::Exception&) { ACE_DEBUG((LM_ERROR, "Transport exception caught in subscriber main\n")); return -1; } ACE_DEBUG((LM_DEBUG, ACE_TEXT("%T (%P|%t) Subscriber exiting\n"))); return ok ? EXIT_SUCCESS : EXIT_FAILURE; }
int main (int argc, char *argv[]) { try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); if( parse_args(argc, argv) != 0) return 1; participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil()); if (CORBA::is_nil (participant.in ())) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) create_participant failed.\n") , -1); } MessageTypeSupportImpl* mts_servant = new MessageTypeSupportImpl(); PortableServer::ServantBase_var safe_servant = mts_servant; if (DDS::RETCODE_OK != mts_servant->register_type(participant.in (), "")) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Failed to register the MessageTypeTypeSupport.\n") , -1); } CORBA::String_var type_name = mts_servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil()); if (CORBA::is_nil (topic.in ())) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Failed to create_topic.\n") , -1); } // Initialize the transport TAO::DCPS::TransportImpl_rch tcp_impl = TheTransportFactory->create_transport_impl (TCP_IMPL_ID, ::TAO::DCPS::AUTO_CONFIG); // Indicate that the subscriber is about to become ready FILE* readers_ready = ACE_OS::fopen (sub_ready_filename, "w"); if (readers_ready == 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) ERROR Unable to create subscriber ready file.\n") , -1); } ACE_OS::fclose(readers_ready); // Check if the publisher is up and running ACE_stat stats; while (ACE_OS::stat (pub_ready_filename, &stats) == -1) { ACE_Time_Value small(0,250000); ACE_OS::sleep (small); } for (int count = 1; count <= sub_reinit_itr; count++) { if (verbose) { ACE_DEBUG ((LM_DEBUG, "(%P|%t) Reinitializing subscriber.\n")); } // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil()); if (CORBA::is_nil (sub.in ())) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Failed to create_subscriber.\n") , -1); } // Attach the subscriber to the transport. TAO::DCPS::SubscriberImpl* sub_impl = ::TAO::DCPS::reference_to_servant < TAO::DCPS::SubscriberImpl, DDS::Subscriber_ptr> (sub.in ()); if (0 == sub_impl) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Failed to obtain subscriber servant.\n") , -1); } TAO::DCPS::AttachStatus status = sub_impl->attach_transport(tcp_impl.in()); if (status != TAO::DCPS::ATTACH_OK) { std::string status_str; switch (status) { case TAO::DCPS::ATTACH_BAD_TRANSPORT: status_str = "ATTACH_BAD_TRANSPORT"; break; case TAO::DCPS::ATTACH_ERROR: status_str = "ATTACH_ERROR"; break; case TAO::DCPS::ATTACH_INCOMPATIBLE_QOS: status_str = "ATTACH_INCOMPATIBLE_QOS"; break; default: status_str = "Unknown Status"; break; } ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Failed to attach to the transport. " "Status == %s.\n" , status_str.c_str()) , -1); } // Create the Datareaders DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); DDS::DataReader_var dr = sub->create_datareader(topic.in (), dr_qos, DDS::DataReaderListener::_nil()); if (CORBA::is_nil (dr.in ())) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) create_datareader failed.\n") , -1); } { ACE_OS::sleep (2); // This is where a speed-bump should be. } if (verbose) { ACE_DEBUG ((LM_DEBUG, "(%P|%t) *** Destroying Subscriber\n")); } // Delete data reader sub->delete_datareader(dr.in()); // Delete subscriber participant->delete_subscriber(sub.in()); sub = DDS::Subscriber::_nil(); } if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } TheTransportFactory->release(); TheServiceParticipant->shutdown (); // Indicate that the subscriber is done FILE* readers_completed = ACE_OS::fopen (sub_finished_filename, "w"); if (readers_completed == 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) ERROR Unable to create subscriber completed file.\n") , -1); } ACE_OS::fclose(readers_completed); } catch (CORBA::Exception& e) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) Exception caught in main (): %s (%s).\n" , e._name (), e._rep_id ()) , -1); } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } MessageTypeSupportImpl* mts_servant = new MessageTypeSupportImpl; if (DDS::RETCODE_OK != mts_servant->register_type(participant.in (), "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts_servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } // activate the listener DDS::DataReaderListener_var listener (new DataReaderListenerImpl); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } DataReaderListenerImpl* listener_servant = dynamic_cast<DataReaderListenerImpl*>(listener.in()); // Create the Datareaders DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); DDS::DataReader_var dr = sub->create_datareader(topic.in (), dr_qos, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } while ( ! listener_servant->received_all ()) { ACE_OS::sleep (1); } if (! listener_servant->passed ()) { cerr << "test failed - see errors." << endl; return 1; } if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ::DDS::InstanceHandleSeq handles; while (1) { ACE_OS::sleep(1); dr->get_matched_publications(handles); if (handles.length() == 0) break; } ACE_OS::sleep(2); TheServiceParticipant->shutdown(); } catch (CORBA::Exception& e) { cerr << "Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } MessageTypeSupport_var mts = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != mts->register_type(participant.in (), "")) { cerr << "register_type failed." << endl; exit(1); } CORBA::String_var type_name = mts->get_type_name (); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "create_topic failed." << endl; exit(1); } DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub.in ())) { cerr << "create_publisher failed." << endl; exit(1); } // Create the datawriter DDS::DataWriter_var dw = pub->create_datawriter(topic.in (), DATAWRITER_QOS_DEFAULT, DDS::DataWriterListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } Writer* writer = new Writer(dw.in()); writer->start (); while ( !writer->is_finished()) { ACE_Time_Value small_time(0, 250000); ACE_OS::sleep (small_time); } // Cleanup writer->end (); delete writer; participant->delete_contained_entities(); dpf->delete_participant(participant); TheServiceParticipant->shutdown(); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit(1); } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); // Default DomainParticipantFactory qos is to auto enable. ::DDS::DomainParticipantFactoryQos fqos; if (dpf->get_qos (fqos) != ::DDS::RETCODE_OK) { cerr << "DomainParticipantFactory get_qos failed." << endl; return 1; } if (fqos.entity_factory.autoenable_created_entities == 0) { cerr << "The DomainParticipantFactory defaults to autoenable upon entities creation." << endl; return 1; } // Now disable DomainParticipantFactory autoenable fqos.entity_factory.autoenable_created_entities = 0; if (dpf->set_qos (fqos) != ::DDS::RETCODE_OK) { cerr << "DomainParticipantFactory set_qos failed." << endl; return 1; } participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } if (participant->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "DomainParticipant can not be enabled because factory autoenable is off." << endl; return 1; } MessageTypeSupport_var mts = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != mts->register_type(participant.in (), "")) { cerr << "Failed to register the MessageTypeTypeSupport." << endl; exit(1); } CORBA::String_var type_name = mts->get_type_name (); DDS::Topic_var topic = participant->create_topic("Movie Discussion List", type_name.in (), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } if (topic->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "Topic can not be enabled because DomainParticipant is not enabled." << endl; return 1; } // Initialize the transport OpenDDS::DCPS::TransportImpl_rch transport_impl = TheTransportFactory->create_transport_impl (transport_impl_id, ::OpenDDS::DCPS::AUTO_CONFIG); // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } if (sub->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "Publisher can not be enabled because DomainParticipant is not enabled." << endl; return 1; } // Attach the subscriber to the transport. OpenDDS::DCPS::SubscriberImpl* sub_impl = dynamic_cast<OpenDDS::DCPS::SubscriberImpl*> (sub.in ()); if (0 == sub_impl) { cerr << "Failed to obtain subscriber servant\n" << endl; exit(1); } OpenDDS::DCPS::AttachStatus status = sub_impl->attach_transport(transport_impl.in()); if (status != OpenDDS::DCPS::ATTACH_OK) { std::string status_str; switch (status) { case OpenDDS::DCPS::ATTACH_BAD_TRANSPORT: status_str = "ATTACH_BAD_TRANSPORT"; break; case OpenDDS::DCPS::ATTACH_ERROR: status_str = "ATTACH_ERROR"; break; case OpenDDS::DCPS::ATTACH_INCOMPATIBLE_QOS: status_str = "ATTACH_INCOMPATIBLE_QOS"; break; default: status_str = "Unknown Status"; break; } cerr << "Failed to attach to the transport. Status == " << status_str.c_str() << endl; exit(1); } // activate the listener DDS::DataReaderListener_var listener = new DataReaderListenerImpl; DataReaderListenerImpl &listener_servant = *dynamic_cast<DataReaderListenerImpl*>(listener.in()); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } // Create the Datareaders DDS::DataReader_var dr = sub->create_datareader(topic.in (), DATAREADER_QOS_DEFAULT, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } if (dr->enable () != ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "DataReader can not be enabled because Subscriber is not enabled." << endl; return 1; } // Now enable DomainParticipantFactory autoenable fqos.entity_factory.autoenable_created_entities = 1; if (dpf->set_qos (fqos) != ::DDS::RETCODE_OK) { cerr << "DomainParticipantFactory set_qos failed." << endl; return 1; } // Enable every entity from factory to it's entities and it should succeed. if (participant->enable () != ::DDS::RETCODE_OK || topic->enable () != ::DDS::RETCODE_OK || sub->enable () != ::DDS::RETCODE_OK) { cerr << "Failed to enable factory." << endl; return 1; } // The datareader is not enabled so it will not able to // communicate with datawriter. int i = 0; while (i < 5 && listener_servant.num_reads() == 0) { ACE_OS::sleep (1); ++i; } if (listener_servant.num_reads() > 0) { cerr << "Should not receive any samples since datareader is not enabled." << endl; return 1; } if (dr->enable () != ::DDS::RETCODE_OK) { cerr << "Failed to enable DataReader." << endl; return 1; } int expected = 10; while ( listener_servant.num_reads() < expected ) { ACE_OS::sleep (1); } if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ACE_OS::sleep(2); TheTransportFactory->release(); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "SUB: Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { ACE_DEBUG ((LM_DEBUG, "(%P|%t) monitor main\n")); DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); if (parse_args (argc, argv) == -1) { return -1; } if (CUR_PART_USER_DATA == UPDATED_PART_USER_DATA) { // wait for Monitor 1 done FILE* fp = ACE_OS::fopen (synch_fname, ACE_TEXT("r")); int i = 0; while (fp == 0 && i < 15) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) waiting monitor1 done ...\n"))); ACE_OS::sleep (1); ++ i; fp = ACE_OS::fopen (synch_fname, ACE_TEXT("r")); } if (fp != 0) ACE_OS::fclose (fp); } participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: create_participant failed.\n")); return 1 ; } OpenDDS::DCPS::Discovery_rch disc = TheServiceParticipant->get_discovery(participant->get_domain_id()); OpenDDS::DCPS::DomainParticipantImpl* part_svt = dynamic_cast<OpenDDS::DCPS::DomainParticipantImpl*>(participant.in()); const bool ignoredEntitiesAreInBIT = !dynamic_cast<OpenDDS::RTPS::RtpsDiscovery*>(disc.in()); const bool ownEntitiesAreInBIT = ignoredEntitiesAreInBIT; // give time for BIT datareader/datawriter fully association. ACE_OS::sleep (2); if (delay_before_read_sec > 0) { ACE_DEBUG((LM_DEBUG,"(%P|%t) monitor: SLEEPING BEFORE READING!\n")); ACE_OS::sleep (delay_before_read_sec); } ::DDS::Subscriber_var bit_subscriber = participant->get_builtin_subscriber () ; ::DDS::DataReader_var reader = bit_subscriber->lookup_datareader (OpenDDS::DCPS::BUILT_IN_PARTICIPANT_TOPIC) ; ::DDS::ParticipantBuiltinTopicDataDataReader_var part_reader = ::DDS::ParticipantBuiltinTopicDataDataReader::_narrow (reader.in ()); if (CORBA::is_nil (part_reader.in ())) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: failed to get BUILT_IN_PARTICIPANT_TOPIC datareader.\n")); return 1; } reader = bit_subscriber->lookup_datareader (OpenDDS::DCPS::BUILT_IN_TOPIC_TOPIC); ::DDS::TopicBuiltinTopicDataDataReader_var topic_reader = ::DDS::TopicBuiltinTopicDataDataReader::_narrow (reader.in ()); if (CORBA::is_nil (topic_reader.in ())) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: failed to get BUILT_IN_TOPIC_TOPIC datareader.\n")); return 1; } reader = bit_subscriber->lookup_datareader (OpenDDS::DCPS::BUILT_IN_SUBSCRIPTION_TOPIC) ; ::DDS::SubscriptionBuiltinTopicDataDataReader_var sub_reader = ::DDS::SubscriptionBuiltinTopicDataDataReader::_narrow (reader.in ()); if (CORBA::is_nil (sub_reader.in ())) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: failed to get BUILT_IN_SUBSCRIPTION_TOPIC datareader.\n")); return 1; } reader = bit_subscriber->lookup_datareader (OpenDDS::DCPS::BUILT_IN_PUBLICATION_TOPIC) ; ::DDS::PublicationBuiltinTopicDataDataReader_var pub_reader = ::DDS::PublicationBuiltinTopicDataDataReader::_narrow (reader.in ()); if (CORBA::is_nil (pub_reader.in ())) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: failed to get BUILT_IN_PUBLICATION_TOPIC datareader.\n")); return 1; } { ::DDS::InstanceHandleSeq handles; if (participant->get_discovered_participants (handles) != ::DDS::RETCODE_OK || handles.length () == 0) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: get_discovered_participant test failed.\n")); return 1; } CORBA::ULong len = handles.length (); if (len != num_parts - 1) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: get_discovered_participant expected %d got %d.\n", num_parts, len), 1); } for (CORBA::ULong i = 0; i < len; ++ i) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) monitor: participant %d examining participant handle %d.\n"), participant->get_instance_handle(), handles[i] )); ::DDS::ParticipantBuiltinTopicData data; participant->get_discovered_participant_data(data, handles[i]); OpenDDS::DCPS::RepoId id = disc->bit_key_to_repo_id(part_svt, OpenDDS::DCPS::BUILT_IN_PARTICIPANT_TOPIC, data.key); if (part_svt->get_handle (id) != handles[i]) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: get_discovered_participant_data test failed.\n")); return 1; } } if (participant->ignore_participant (handles[0]) != ::DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: ignore_participant failed.\n")); return 1; } handles.length (0); if (participant->get_discovered_participants (handles) != ::DDS::RETCODE_OK || handles.length () != num_parts - 2) { ACE_ERROR((LM_ERROR, ACE_TEXT ("(%P|%t) monitor: get_discovered_participant ") ACE_TEXT ("skip ignored participant test failed.\n"))); return 1; } if (!ignoredEntitiesAreInBIT) --num_parts; ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: discover participants test PASSED.\n")); } ::DDS::SampleInfoSeq partinfos(10); ::DDS::ParticipantBuiltinTopicDataSeq partdata(10); ::DDS::ReturnCode_t ret = part_reader->read (partdata, partinfos, 10, ::DDS::ANY_SAMPLE_STATE, ::DDS::ANY_VIEW_STATE, ::DDS::ALIVE_INSTANCE_STATE); if (ret != ::DDS::RETCODE_OK && ret != ::DDS::RETCODE_NO_DATA) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: failed to read BIT participant data.\n"), 1); } CORBA::ULong len = partdata.length (); if (len != num_parts - !ownEntitiesAreInBIT) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: read %d BIT part data, expected %d parts.\n", len, num_parts), 1); } CORBA::ULong cur_dps_with_user_data = 0; CORBA::ULong user_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_PART_USER_DATA)); for (CORBA::ULong i = 0; i < len; ++i) { ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: Participant: key = %d, %x, %x \n", partdata[i].key.value[0], partdata[i].key.value[1], partdata[i].key.value[2])); CORBA::ULong cur_len = partdata[i].user_data.value.length (); if ((cur_len == user_data_len) && (ACE_OS::strncmp (reinterpret_cast <char*> (partdata[i].user_data.value.get_buffer()), CUR_PART_USER_DATA, user_data_len) == 0)) { ++cur_dps_with_user_data; } } if (cur_dps_with_user_data == dps_with_user_data - !ignoredEntitiesAreInBIT) { ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DomainParticipant changeable qos test PASSED.\n")); } else { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: DomainParticipant changeable qos test FAILED.\n"), 1); } { ::DDS::InstanceHandleSeq handles; if (participant->get_discovered_topics (handles) != ::DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: get_discovered_topics test failed.\n")); return 1; } CORBA::ULong len = handles.length (); if (len != num_topics) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: get_discovered_topics expected %d got %d.\n", num_topics, len), 1); } for (CORBA::ULong i = 0; i < len; ++ i) { ::DDS::TopicBuiltinTopicData data; participant->get_discovered_topic_data(data, handles[i]); OpenDDS::DCPS::Discovery_rch disc = TheServiceParticipant->get_discovery(participant->get_domain_id()); OpenDDS::DCPS::RepoId id = disc->bit_key_to_repo_id(part_svt, OpenDDS::DCPS::BUILT_IN_TOPIC_TOPIC, data.key); if (part_svt->get_handle (id) != handles[i]) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: get_discovered_topic_data test failed.\n")); return 1; } } if (len && participant->ignore_topic(handles[0]) != ::DDS::RETCODE_OK) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: ignore_topic failed.\n")); return 1; } handles.length (0); if (len && (participant->get_discovered_topics(handles) != ::DDS::RETCODE_OK || handles.length() != num_topics - 1)) { ACE_ERROR((LM_ERROR, "(%P|%t) monitor: get_discovered_topics " "skip ignored topic test failed with len = %d, " "handles.length() = %d, num_topics = %d\n", len, handles.length(), num_topics)); return 1; } ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: discover topics test PASSED.\n")); } ::DDS::SampleInfoSeq topicinfos(10); ::DDS::TopicBuiltinTopicDataSeq topicdata(10); ret = topic_reader->read (topicdata, topicinfos, 10, ::DDS::ANY_SAMPLE_STATE, ::DDS::ANY_VIEW_STATE, ::DDS::ANY_INSTANCE_STATE); if (ret != ::DDS::RETCODE_OK && ret != ::DDS::RETCODE_NO_DATA) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: failed to read BIT topic data.\n"), 1); } len = topicdata.length (); if (len != num_topics) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: read %d BIT topic data, expected %d topics.\n", len, num_topics), 1); } CORBA::ULong num_topics_with_data = 0; for (CORBA::ULong i = 0; i < len; ++i) { if (ACE_OS::strcmp (topicdata[i].name.in (), topic_name) != 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: got topic name \"%C\", expected topic name \"%C\"\n", topicdata[i].name.in (), topic_name), 1); } if (ACE_OS::strcmp (topicdata[i].type_name.in (), topic_type_name) != 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: got topic type name \"%C\", expected topic type name \"%C\"\n", topicdata[i].type_name.in (), topic_type_name), 1); } ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: Topic: key = %d, %x, %x, name = %C, " "type_name=%C \n", topicdata[i].key.value[0], topicdata[i].key.value[1], topicdata[i].key.value[2], topicdata[i].name.in (), topicdata[i].type_name.in ())); CORBA::ULong topic_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_TOPIC_DATA)); if ((topicdata[i].topic_data.value.length () == topic_data_len) && (ACE_OS::strncmp (reinterpret_cast <char*> (topicdata[i].topic_data.value.get_buffer()), CUR_TOPIC_DATA, topic_data_len) == 0)) { ++ num_topics_with_data; } } if (num_topics_with_data == num_topics) { ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: Topic changeable qos test PASSED. \n")); } else { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: Topic changeable qos test FAILED. \n"), 1); } ::DDS::SampleInfoSeq pubinfos(10); ::DDS::PublicationBuiltinTopicDataSeq pubdata(10); ret = pub_reader->read (pubdata, pubinfos, 10, ::DDS::ANY_SAMPLE_STATE, ::DDS::ANY_VIEW_STATE, ::DDS::ALIVE_INSTANCE_STATE); if (ret != ::DDS::RETCODE_OK && ret != ::DDS::RETCODE_NO_DATA) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: failed to read BIT publication data.\n"), 1); } len = pubdata.length (); bool pubWasIgnored = false; if (len != num_pubs) { if (!ignoredEntitiesAreInBIT && len == num_pubs - 1) { pubWasIgnored = true; ACE_DEBUG((LM_INFO, "(%P|%t) monitor: pub assumed to be ignored\n")); } else { ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) monitor: read %d BIT pub data," "expected %d pubs.\n", len, num_pubs), 1); } } CORBA::ULong num_dws_with_data = 0; for (CORBA::ULong i = 0; i < len; ++i) { if (ACE_OS::strcmp (pubdata[i].topic_name.in (), topic_name) != 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: got datawriter topic name \"%C\", expected topic name \"%C\"\n", pubdata[i].topic_name.in (), topic_name), 1); } if (ACE_OS::strcmp (pubdata[i].type_name.in (), topic_type_name) != 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: got datawriter topic type name \"%C\", expected topic type name \"%C\"\n", pubdata[i].type_name.in (), topic_type_name), 1); } ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DataWriter: key = %d, %x, %x. \n", pubdata[i].key.value[0], pubdata[i].key.value[1], pubdata[i].key.value[2])); //ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DW user data %C \n", pubdata[i].user_data.value.get_buffer())); //ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DW topic data %C \n", pubdata[i].topic_data.value.get_buffer())); //ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DW group data %C \n", pubdata[i].group_data.value.get_buffer())); CORBA::ULong user_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_DW_USER_DATA)); CORBA::ULong topic_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_TOPIC_DATA)); CORBA::ULong group_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_GROUP_DATA)); if (pubdata[i].user_data.value.length () == user_data_len && pubdata[i].topic_data.value.length () == topic_data_len && pubdata[i].group_data.value.length () == group_data_len) { if (ACE_OS::strncmp (reinterpret_cast <char*> (pubdata[i].user_data.value.get_buffer()), CUR_DW_USER_DATA, user_data_len) == 0 && ACE_OS::strncmp (reinterpret_cast <char*> (pubdata[i].topic_data.value.get_buffer()), CUR_TOPIC_DATA, topic_data_len) == 0 && ACE_OS::strncmp (reinterpret_cast <char*> (pubdata[i].group_data.value.get_buffer()), CUR_GROUP_DATA, group_data_len) == 0) { ++ num_dws_with_data; } } } if (num_dws_with_data == len) { ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DataWriter changeable qos test PASSED. \n")); } else { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: DataWriter changeable qos test FAILED. \n"), 1); } ::DDS::SampleInfoSeq subinfos(10); ::DDS::SubscriptionBuiltinTopicDataSeq subdata(10); ret = sub_reader->read (subdata, subinfos, 10, ::DDS::ANY_SAMPLE_STATE, ::DDS::ANY_VIEW_STATE, ::DDS::ALIVE_INSTANCE_STATE); if (ret != ::DDS::RETCODE_OK && ret != ::DDS::RETCODE_NO_DATA) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: failed to read BIT subsciption data.\n"), 1); } len = subdata.length (); if (len != num_subs) { if (!pubWasIgnored && !ignoredEntitiesAreInBIT && len == num_subs - 1) { ACE_DEBUG((LM_INFO, "(%P|%t) monitor: sub assumed to be ignored\n")); } else { ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) monitor: read %d BIT sub data, " "expected %d subs.\n", len, num_subs), 1); } } CORBA::ULong num_drs_with_data = 0; for (CORBA::ULong i = 0; i < len; ++i) { if (ACE_OS::strcmp (subdata[i].topic_name.in (), topic_name) != 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: got datareader topic name \"%C\", expected topic name \"%C\"\n", subdata[i].topic_name.in (), topic_name), 1); } if (ACE_OS::strcmp (subdata[i].type_name.in (), topic_type_name) != 0) { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: got datareader topic type name \"%C\", expected topic type name \"%C\"\n", subdata[i].type_name.in (), topic_type_name), 1); } ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DataReader: key = %d, %x, %x \n", subdata[i].key.value[0], subdata[i].key.value[1], subdata[i].key.value[2])); //ACE_DEBUG((LM_DEBUG, "(%P|%t) DR user data %C \n", subdata[i].user_data.value.get_buffer())); //ACE_DEBUG((LM_DEBUG, "(%P|%t) DR topic data %C \n", subdata[i].topic_data.value.get_buffer())); //ACE_DEBUG((LM_DEBUG, "(%P|%t) DR group data %C \n", subdata[i].group_data.value.get_buffer())); CORBA::ULong user_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_DR_USER_DATA)); CORBA::ULong topic_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_TOPIC_DATA)); CORBA::ULong group_data_len = static_cast<CORBA::ULong>(ACE_OS::strlen (CUR_GROUP_DATA)); if (subdata[i].user_data.value.length () == user_data_len && subdata[i].topic_data.value.length () == topic_data_len && subdata[i].group_data.value.length () == group_data_len) { if (ACE_OS::strncmp (reinterpret_cast <char*> (subdata[i].user_data.value.get_buffer()), CUR_DR_USER_DATA, user_data_len) == 0 && ACE_OS::strncmp (reinterpret_cast <char*> (subdata[i].topic_data.value.get_buffer()), CUR_TOPIC_DATA, topic_data_len) == 0 && ACE_OS::strncmp (reinterpret_cast <char*> (subdata[i].group_data.value.get_buffer()), CUR_GROUP_DATA, group_data_len) == 0) { ++ num_drs_with_data; } } } if (num_drs_with_data == len) { ACE_DEBUG((LM_DEBUG, "(%P|%t) monitor: DataReader changeable qos test PASSED. \n")); } else { ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t) monitor: DataReader changeable qos test FAILED. \n"), 1); } dpf->delete_participant(participant.in ()); TheServiceParticipant->shutdown (); if (CUR_PART_USER_DATA == PART_USER_DATA) { // Create synch file. FILE* fp = ACE_OS::fopen (synch_fname, ACE_TEXT("w")); if (fp != 0) { ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) monitor1 is done\n"))); ACE_OS::fclose (fp); } } } catch (CORBA::Exception& e) { cerr << " monitor: SUB: Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs (argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant (411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } if (parse_args (argc, argv) != 0) return -1; if (delete_data) { using OpenDDS::FileSystemStorage::Directory; Directory::create (ACE_TEXT_ALWAYS_CHAR (dir))->remove (); dpf->delete_participant (participant); TheServiceParticipant->shutdown (); return 0; } MessageTypeSupport_var servant = new MessageTypeSupportImpl (); if (DDS::RETCODE_OK != servant->register_type(participant.in (), "")) { cerr << "register_type failed." << endl; exit (1); } CORBA::String_var type_name = servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos (topic_qos); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { cerr << "create_topic failed." << endl; exit (1); } DDS::Publisher_var pub = participant->create_publisher (PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (pub.in ())) { cerr << "create_publisher failed." << endl; exit (1); } // Configure DataWriter QoS policies. DDS::DataWriterQos dw_qos; pub->get_default_datawriter_qos (dw_qos); dw_qos.durability.kind = DDS::PERSISTENT_DURABILITY_QOS; dw_qos.durability_service.history_kind = ::DDS::KEEP_ALL_HISTORY_QOS; dw_qos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; dw_qos.resource_limits.max_samples_per_instance = 1000; dw_qos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; // ------------------------------------------------------- { DataWriterListenerImpl* listener = new DataWriterListenerImpl; DDS::DataWriterListener_var dwl = listener; // Create a DataWriter. // Upon exiting this scope, all unsent data should be // transferred to OpenDDS's data durability cache since the // run_test.pl script should not have started the subscriber // until it detects the "Done writing" log text. DDS::DataWriter_var dw = pub->create_datawriter (topic.in (), dw_qos, dwl.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dw.in ())) { cerr << "create_datawriter failed." << endl; exit (1); } // Only write samples if configured to do so. The expectation // is to otherwise retrieve the data from the PERSISTENT data // durability cache. if (do_write) { // Write samples. std::auto_ptr<Writer> writer (new Writer (dw.in ())); if (!writer->start () || !writer->end ()) { // Error logging performed in above method call. exit (1); } // Explicitly destroy the DataWriter. if (pub->delete_datawriter (dw.in ()) == ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "Unable to delete DataWriter" << endl; exit (1); } } else { int const max_attempts = 50; int attempts; for (attempts = 1; attempts != max_attempts && listener->publication_matched_.value () == false; ++attempts) { ACE_OS::sleep (5); } if (attempts == max_attempts) { cerr << "ERROR: subscriptions failed to match." << endl; exit (1); } // Wait for DataReader to finish. ::DDS::InstanceHandleSeq handles; for (attempts = 1; attempts != max_attempts; ++attempts) { dw->get_matched_subscriptions (handles); if (handles.length () == 0) break; else ACE_OS::sleep(1); } // The data durability cache should no longer contain samples // for this domain/topic/type. } } // ------------------------------------------------------- { // Write samples that will not be sent. Exercise // service_cleanup_delay. We can either do this through the // durability member or durability_service member in either of // TopicQos or DataWriterQos. This test arbitrarily uses the // DataWriterQos::durability_service member. // Cleanup data after this number of seconds. CORBA::Long const delay_seconds = 5; ::DDS::Duration_t & cleanup_delay = dw_qos.durability_service.service_cleanup_delay; cleanup_delay.sec = delay_seconds; cleanup_delay.nanosec = 0; // Create a dummy topic which will have no subscriptions. DDS::Topic_var dummy_topic = participant->create_topic ("Dummy Topic", type_name.in (), topic_qos, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); DDS::DataWriter_var dummy_dw = pub->create_datawriter (dummy_topic.in (), dw_qos, ::DDS::DataWriterListener::_nil (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (dummy_dw.in ())) { cerr << "create_datawriter for dummy topic failed." << endl; exit (1); } // Write samples using multiple threads. std::auto_ptr<Writer> writer (new Writer (dummy_dw.in ())); // Explicitly destroy the DataWriter. if (pub->delete_datawriter (dummy_dw.in ()) == ::DDS::RETCODE_PRECONDITION_NOT_MET) { cerr << "Unable to delete DataWriter" << endl; exit (1); } // Allow durability cleanup to occur ACE_OS::sleep (delay_seconds + 3); } participant->delete_contained_entities(); dpf->delete_participant(participant.in ()); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit (1); } catch (const std::runtime_error& err) { ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("ERROR: main() - %s\n"), err.what()), -1); } return 0; }
int main (int argc, char *argv[]) { const int domainId = 411; const char *topicName = "Stock Quotes"; try { DDS::DomainParticipantFactory_var dpf; DDS::DomainParticipant_var participant; dpf = TheParticipantFactoryWithArgs(argc, argv); // To Do: Create the participant participant = dpf->create_participant(domainId, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil()); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1 ; } // End: Create the participant QuoterTypeSupportImpl* servant = new QuoterTypeSupportImpl(); PortableServer::ServantBase_var safe_servant = servant; // To Do: Register the type if (DDS::RETCODE_OK != servant->register_type(participant.in (), "")) { cerr << "Failed to register the QuoterTypeTypeSupport." << endl; exit(1); } // End: Register the type CORBA::String_var type_name = servant->get_type_name (); // To Do: Get the (default) topic QoS and create the topic DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic(topicName, type_name.in (), topic_qos, DDS::TopicListener::_nil()); if (CORBA::is_nil (topic.in ())) { cerr << "Failed to create_topic." << endl; exit(1); } // End: Get the (default) topic QoS and create the topic // To Do: Create the subscriber DDS::Subscriber_var sub = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil()); if (CORBA::is_nil (sub.in ())) { cerr << "Failed to create_subscriber." << endl; exit(1); } // End: Create the subscriber // jhoffert // There seem to be problems using auto configurations with an application // distributed across different nodes. Take this out for now. // Initialize the transport TAO::DCPS::TransportImpl_rch tcp_impl = TheTransportFactory->create_transport_impl (TCP_IMPL_ID, //::TAO::DCPS::AUTO_CONFIG); ::TAO::DCPS::DONT_AUTO_CONFIG); TAO::DCPS::TransportConfiguration_rch reader_config = //TheTransportFactory->get_configuration (SUB_TRAFFIC); TheTransportFactory->get_configuration (TCP_IMPL_ID); TAO::DCPS::SimpleTcpConfiguration* reader_tcp_config = static_cast <TAO::DCPS::SimpleTcpConfiguration*> (reader_config.in ()); if (0 != ACE_OS::strcmp ("default", reader_address_str)) { ACE_INET_Addr reader_address (reader_address_str); reader_tcp_config->local_address_ = reader_address; } if (0 != tcp_impl->configure (reader_config.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ::main: ") ACE_TEXT("Failed to configure the transport.\n"))); exit(1); } // jhoffert - End of transport configuration changes // Attach the subscriber to the transport. TAO::DCPS::SubscriberImpl* sub_impl = ::TAO::DCPS::reference_to_servant< TAO::DCPS::SubscriberImpl, DDS::Subscriber_ptr> (sub.in ()); if (0 == sub_impl) { cerr << "Failed to obtain subscriber servant\n" << endl; exit(1); } TAO::DCPS::AttachStatus status = sub_impl->attach_transport(tcp_impl.in()); if (status != TAO::DCPS::ATTACH_OK) { std::string status_str; switch (status) { case TAO::DCPS::ATTACH_BAD_TRANSPORT: status_str = "ATTACH_BAD_TRANSPORT"; break; case TAO::DCPS::ATTACH_ERROR: status_str = "ATTACH_ERROR"; break; case TAO::DCPS::ATTACH_INCOMPATIBLE_QOS: status_str = "ATTACH_INCOMPATIBLE_QOS"; break; default: status_str = "Unknown Status"; break; } cerr << "Failed to attach to the transport. Status == " << status_str.c_str() << endl; exit(1); } // activate the listener DataReaderListenerImpl listener_servant; PortableServer::POA_var poa = TheServiceParticipant->the_poa (); CORBA::Object_var obj = poa->servant_to_reference(&listener_servant); DDS::DataReaderListener_var listener = DDS::DataReaderListener::_narrow (obj.in ()); if (CORBA::is_nil (listener.in ())) { cerr << "listener is nil." << endl; exit(1); } // To Do: Get default data reader QoS and create the data reader. DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); DDS::DataReader_var dr = sub->create_datareader(topic.in (), dr_qos, listener.in ()); if (CORBA::is_nil (dr.in ())) { cerr << "create_datareader failed." << endl; exit(1); } // End: Get default data reader QoS and create the data reader. // To Do: Set up the constraints for when the subscriber is done // receiving updates. int expected = 10; while ( listener_servant.num_reads() < expected) { ACE_OS::sleep (1); } // End: Set up the constraints for how long the subscriber should // receive updates. // To Do: Delete the participant's contained entities if (!CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } // End: Delete the participant's contained entities if (!CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } ::DDS::InstanceHandleSeq handles; while (1) { ACE_OS::sleep(1); dr->get_matched_publications(handles); if (handles.length() == 0) break; } ACE_OS::sleep(2); TheTransportFactory->release(); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "Exception caught in main ():" << endl << e << endl; return 1; } return 0; }
int main (int argc, char *argv[]) { try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); DDS::DomainParticipant_var participant = dpf->create_participant(411, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil()); if (CORBA::is_nil (participant.in ())) { cerr << "create_participant failed." << endl; return 1; } if (parse_args (argc, argv) == -1) { return -1; } MessageTypeSupportImpl* servant = new MessageTypeSupportImpl(); if (DDS::RETCODE_OK != servant->register_type(participant.in (), "")) { cerr << "register_type failed." << endl; exit(1); } CORBA::String_var type_name = servant->get_type_name (); DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); DDS::Topic_var topic = participant->create_topic ("Movie Discussion List", type_name.in (), topic_qos, DDS::TopicListener::_nil()); if (CORBA::is_nil (topic.in ())) { cerr << "create_topic failed." << endl; exit(1); } OpenDDS::DCPS::TransportImpl_rch tcp_impl = TheTransportFactory->create_transport_impl (transport_impl_id, ::OpenDDS::DCPS::AUTO_CONFIG); DDS::Publisher_var pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT, DDS::PublisherListener::_nil()); if (CORBA::is_nil (pub.in ())) { cerr << "create_publisher failed." << endl; exit(1); } // Attach the publisher to the transport. OpenDDS::DCPS::PublisherImpl* pub_impl = dynamic_cast<OpenDDS::DCPS::PublisherImpl*> (pub.in ()); if (0 == pub_impl) { cerr << "Failed to obtain publisher servant" << endl; exit(1); } OpenDDS::DCPS::AttachStatus status = pub_impl->attach_transport(tcp_impl.in()); if (status != OpenDDS::DCPS::ATTACH_OK) { std::string status_str; switch (status) { case OpenDDS::DCPS::ATTACH_BAD_TRANSPORT: status_str = "ATTACH_BAD_TRANSPORT"; break; case OpenDDS::DCPS::ATTACH_ERROR: status_str = "ATTACH_ERROR"; break; case OpenDDS::DCPS::ATTACH_INCOMPATIBLE_QOS: status_str = "ATTACH_INCOMPATIBLE_QOS"; break; default: status_str = "Unknown Status"; break; } cerr << "Failed to attach to the transport. Status == " << status_str.c_str() << endl; exit(1); } // Create the datawriter DDS::DataWriterQos dw_qos; pub->get_default_datawriter_qos (dw_qos); DDS::DataWriter_var dw = pub->create_datawriter(topic.in (), dw_qos, DDS::DataWriterListener::_nil()); if (CORBA::is_nil (dw.in ())) { cerr << "create_datawriter failed." << endl; exit(1); } size_t msg_cnt = 5; size_t sub_cnt = 2; Writer* writer = new Writer(dw.in(), msg_cnt, sub_cnt); writer->start (); while ( !writer->is_finished()) { ACE_Time_Value small(0,250000); ACE_OS::sleep (small); } // Cleanup writer->end (); delete writer; participant->delete_contained_entities(); dpf->delete_participant(participant.in ()); TheTransportFactory->release(); TheServiceParticipant->shutdown (); } catch (CORBA::Exception& e) { cerr << "PUB: Exception caught in main.cpp:" << endl << e << endl; exit(1); } return 0; }
int ACE_TMAIN(int argc, ACE_TCHAR** argv) { parse_args(argc, argv); ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) -> SUBSCRIBER STARTED\n"))); try { DDS::DomainParticipantFactory_var dpf = TheParticipantFactoryWithArgs(argc, argv); // Create Participant DDS::DomainParticipant_var participant = dpf->create_participant(42, PARTICIPANT_QOS_DEFAULT, DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(participant.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_participant failed!\n")), 1); // Create Subscriber DDS::Subscriber_var subscriber = participant->create_subscriber(SUBSCRIBER_QOS_DEFAULT, DDS::SubscriberListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(subscriber.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_subscriber failed!\n")), 2); // Attach Transport OpenDDS::DCPS::TransportImpl_rch transport = TheTransportFactory->create_transport_impl( OpenDDS::DCPS::DEFAULT_SIMPLE_TCP_ID, "SimpleTcp"); OpenDDS::DCPS::SubscriberImpl* subscriber_i = dynamic_cast<OpenDDS::DCPS::SubscriberImpl*>(subscriber.in()); if (subscriber_i == 0) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" dynamic_cast failed!\n")), 3); OpenDDS::DCPS::AttachStatus status = subscriber_i->attach_transport(transport.in()); if (status != OpenDDS::DCPS::ATTACH_OK) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" attach_transport failed!\n")), 4); // Register Type (FooType) FooTypeSupport_var ts = new FooTypeSupportImpl; if (ts->register_type(participant.in(), "") != DDS::RETCODE_OK) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" register_type failed!\n")), 5); // Create Topic (FooTopic) DDS::Topic_var topic = participant->create_topic("FooTopic", ts->get_type_name(), TOPIC_QOS_DEFAULT, DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(topic.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_topic failed!\n")), 6); // Create DataReader ProgressIndicator progress = ProgressIndicator("(%P|%t) SUBSCRIBER %d%% (%d samples received)\n", expected_samples); DDS::DataReaderListener_var listener = new DataReaderListenerImpl(received_samples, progress); DDS::DataReaderQos reader_qos; subscriber->get_default_datareader_qos(reader_qos); reader_qos.history.kind = DDS::KEEP_ALL_HISTORY_QOS; DDS::DataReader_var reader = subscriber->create_datareader(topic.in(), reader_qos, listener.in(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil(reader.in())) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" create_datareader failed!\n")), 7); // Block until Publisher completes DDS::StatusCondition_var cond = reader->get_statuscondition(); cond->set_enabled_statuses(DDS::SUBSCRIPTION_MATCHED_STATUS); DDS::WaitSet_var ws = new DDS::WaitSet; ws->attach_condition(cond); DDS::Duration_t timeout = { DDS::DURATION_INFINITE_SEC, DDS::DURATION_INFINITE_NSEC }; DDS::ConditionSeq conditions; DDS::SubscriptionMatchedStatus matches = {0, 0, 0, 0, 0}; do { if (ws->wait(conditions, timeout) != DDS::RETCODE_OK) ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: main()") ACE_TEXT(" wait failed!\n")), 8); if (reader->get_subscription_matched_status(matches) != ::DDS::RETCODE_OK) { ACE_ERROR ((LM_ERROR, "ERROR: failed to get subscription matched status\n")); return 1; } } while (matches.current_count > 0 || matches.total_count < n_publishers); ws->detach_condition(cond); // Clean-up! participant->delete_contained_entities(); dpf->delete_participant(participant.in()); TheTransportFactory->release(); TheServiceParticipant->shutdown(); } catch (const CORBA::Exception& e) { e._tao_print_exception("caught in main()"); return 9; } ACE_DEBUG((LM_INFO, ACE_TEXT("(%P|%t) <- SUBSCRIBER FINISHED\n"))); if (received_samples != expected_samples) { ACE_DEBUG((LM_DEBUG, ACE_TEXT("(%P|%t) ERROR: subscriber - ") ACE_TEXT("received %d of expected %d samples.\n"), received_samples, expected_samples )); return 10; } return 0; }