int ACE_TMAIN(int argc, ACE_TCHAR *argv[]) { ::DDS::DomainParticipantFactory_var dpf; ::DDS::DomainParticipant_var participant; int status = 0; try { ACE_DEBUG((LM_INFO,"(%P|%t) %T subscriber main\n")); dpf = TheParticipantFactoryWithArgs(argc, argv); // let the Service_Participant (in above line) strip out -DCPSxxx parameters // and then get application specific parameters. parse_args (argc, argv); results.init (); participant = dpf->create_participant(MY_DOMAIN, PARTICIPANT_QOS_DEFAULT, ::DDS::DomainParticipantListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (participant.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) create_participant failed.\n"))); return 1 ; } if (no_key) { ::Xyz::FooNoKeyTypeSupportImpl* nokey_fts_servant = new ::Xyz::FooNoKeyTypeSupportImpl(); OpenDDS::DCPS::LocalObject_var safe_servant = nokey_fts_servant; if (::DDS::RETCODE_OK != nokey_fts_servant->register_type(participant.in (), MY_TYPE)) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to register the FooTypeSupport."))); throw TestException (); } } else { ::Xyz::FooTypeSupportImpl* fts_servant = new ::Xyz::FooTypeSupportImpl(); OpenDDS::DCPS::LocalObject_var safe_servant = fts_servant; if (::DDS::RETCODE_OK != fts_servant->register_type(participant.in (), MY_TYPE)) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to register the FooNoTypeTypeSupport."))); throw TestException (); } } if (mixed_trans) { ::Xyz::FooTypeSupportImpl* fts_servant = new ::Xyz::FooTypeSupportImpl(); OpenDDS::DCPS::LocalObject_var safe_servant = fts_servant; if (::DDS::RETCODE_OK != fts_servant->register_type(participant.in (), MY_TYPE_FOR_UDP)) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) register_type failed.\n"))); throw TestException (); } } ::DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); ::DDS::Topic_var topic = participant->create_topic(MY_TOPIC, MY_TYPE, topic_qos, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to create_topic."))); throw TestException (); } ::DDS::TopicDescription_var description = participant->lookup_topicdescription(MY_TOPIC); if (CORBA::is_nil (description.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to lookup_topicdescription."))); throw TestException (); } ::DDS::Topic_var topic1; ::DDS::TopicDescription_var description1; if (mixed_trans) { topic1 = participant->create_topic (MY_TOPIC_FOR_UDP, MY_TYPE_FOR_UDP, topic_qos, ::DDS::TopicListener::_nil(), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (topic1.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) create_topic failed.\n"))); throw TestException (); } description1 = participant->lookup_topicdescription(MY_TOPIC_FOR_UDP); if (CORBA::is_nil (description1.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to lookup_topicdescription."))); throw TestException (); } } int attach_to_udp = using_udp; int attach_to_multicast = using_multicast; // Create the subscriber and attach to the corresponding // transport. DDS::Subscriber_var sub = create_subscriber(participant, attach_to_udp, attach_to_multicast, using_rtps_transport, using_shmem); if (CORBA::is_nil (sub.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to create_subscriber."))); throw TestException (); } ::DDS::Subscriber_var sub1; if (mixed_trans) { // Create the subscriber with a different transport from previous // subscriber. sub1 = create_subscriber(participant, !attach_to_udp, attach_to_multicast, false /*rtps*/, false); if (CORBA::is_nil (sub1.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to create_subscriber."))); throw TestException (); } } // Create the Datareaders ::DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); // Make it KEEP_ALL history so we can verify the received // data without dropping. dr_qos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; dr_qos.reliability.kind = (using_udp || mixed_trans) ? ::DDS::BEST_EFFORT_RELIABILITY_QOS : ::DDS::RELIABLE_RELIABILITY_QOS; dr_qos.resource_limits.max_samples_per_instance = max_samples_per_instance ; // The history depth is only used for KEEP_LAST. //dr_qos.history.depth = history_depth ; // activate the listener ::DDS::DataReaderListener_var listener (new DataReaderListenerImpl); if (CORBA::is_nil (listener.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) listener is nil."))); throw TestException (); } ::DDS::DataReader_var * drs = new ::DDS::DataReader_var[num_datareaders]; // Create one datareader or multiple datareaders belonging to the same // subscriber. for (int i = 0; i < num_datareaders; i ++) { int attach_to_udp = using_udp; ::DDS::Subscriber_var the_sub = sub; ::DDS::TopicDescription_var the_description = description; // The first datawriter would be using a different transport // from others for the diff trans test case. if (mixed_trans && i == 0) { attach_to_udp = ! attach_to_udp; the_sub = sub1; the_description = description1; } // create the datareader. drs[i] = the_sub->create_datareader(the_description.in (), dr_qos, listener.in (), ::OpenDDS::DCPS::DEFAULT_STATUS_MASK); if (CORBA::is_nil (drs[i].in ())) { ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT("(%P|%t) create_datareader failed.\n")), 1); } } // Indicate that the subscriber is ready ACE_DEBUG((LM_INFO, "(%P|%t) subscriber signaling ready\n")); FILE* readers_ready = ACE_OS::fopen (sub_ready_filename.c_str (), ACE_TEXT("w")); if (readers_ready == 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Unable to create subscriber completed file\n"))); } // Wait for the publisher to be ready FILE* writers_ready = 0; do { ACE_Time_Value small_time(0,250000); ACE_OS::sleep (small_time); ACE_DEBUG((LM_INFO, "(%P|%t) subscriber checking for pub ready\n")); writers_ready = ACE_OS::fopen (pub_ready_filename.c_str (), ACE_TEXT("r")); } while (0 == writers_ready); ACE_OS::fclose(readers_ready); ACE_OS::fclose(writers_ready); int num_associations = mixed_trans ? num_datawriters : num_datareaders * num_datawriters; int expected = num_associations * num_instances_per_writer * num_samples_per_instance; FILE* writers_completed = 0; int timeout_writes = 0; while ( num_reads < expected) { // 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) { ACE_DEBUG((LM_INFO, "(%P|%t) subscriber checking for pub finished\n")); writers_completed = ACE_OS::fopen (pub_finished_filename.c_str (), ACE_TEXT("r")); if (writers_completed != 0) { //writers_completed = ACE_OS::fopen (pub_finished_filename.c_str (), ACE_TEXT("r")); if (std::fscanf (writers_completed, "%d\n", &timeout_writes) != 1) { //if fscanf return 0 or EOF(-1), failed to read a matching line format to populate in timeout_writes ACE_DEBUG ((LM_DEBUG, ACE_TEXT("(%P|%t) Warning: subscriber could not read timeout_writes\n"))); } else if (timeout_writes) { expected -= timeout_writes; ACE_DEBUG((LM_DEBUG, ACE_TEXT ("(%P|%t) %d timed out writes, adjusted we expected to %d\n"), timeout_writes, expected)); } // After we got the number of timed out writes, we should speed the // receiving. op_interval_ms = 0; } ACE_DEBUG((LM_DEBUG, ACE_TEXT ("(%P|%t) received %d of expected %d\n"), num_reads.value(), expected)); } ACE_OS::sleep (1); } // Indicate that the subscriber is done ACE_DEBUG((LM_INFO, "(%P|%t) subscriber signaling finished\n")); FILE* readers_completed = ACE_OS::fopen (sub_finished_filename.c_str (), ACE_TEXT("w")); if (readers_completed == 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: Unable to create subscriber completed file\n"))); } // Wait for the publisher to finish while (writers_completed == 0) { ACE_Time_Value small_time(0,250000); ACE_OS::sleep (small_time); ACE_DEBUG((LM_INFO, "(%P|%t) subscriber checking for pub finished\n")); writers_completed = ACE_OS::fopen (pub_finished_filename.c_str (), ACE_TEXT("r")); } ACE_OS::fclose(readers_completed); ACE_OS::fclose(writers_completed); if (results.test_passed (expected) == false) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) Verify received samples - not passed \n"))); status = 1; } delete [] drs; } catch (const TestException&) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) TestException caught in main (). "))); status = 1; } catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught in main ():"); status = 1; } catch (const OpenDDS::DCPS::Transport::MiscProblem &) { ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) Transport::MiscProblem exception caught during processing.\n") )); status = 1; } ACE_DEBUG((LM_INFO, "(%P|%t) subscriber starting shutdown\n")); try { if (! CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (! CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); participant = 0; dpf = 0; } } catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught in cleanup."); status = 1; } ACE_DEBUG((LM_INFO, "(%P|%t) subscriber shutdown of ServiceParticipant\n")); TheServiceParticipant->shutdown (); ACE_DEBUG((LM_INFO, "(%P|%t) subscriber exiting with status %d\n", status)); return status; }
int main (int argc, char *argv[]) { ::DDS::DomainParticipantFactory_var dpf; ::DDS::DomainParticipant_var participant; int status = 0; try { ACE_DEBUG((LM_INFO,"(%P|%t) %T subscriber main\n")); dpf = TheParticipantFactoryWithArgs(argc, argv); // let the Service_Participant (in above line) strip out -DCPSxxx parameters // and then get application specific parameters. parse_args (argc, argv); results.init (); participant = dpf->create_participant(MY_DOMAIN, PARTICIPANT_QOS_DEFAULT, ::DDS::DomainParticipantListener::_nil()); if (CORBA::is_nil (participant.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) create_participant failed.\n"))); return 1 ; } if (no_key) { ::Mine::FooNoKeyTypeSupportImpl* nokey_fts_servant = new ::Mine::FooNoKeyTypeSupportImpl(); PortableServer::ServantBase_var safe_servant = nokey_fts_servant; if (::DDS::RETCODE_OK != nokey_fts_servant->register_type(participant.in (), MY_TYPE)) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to register the FooTypeSupport."))); throw TestException (); } } else { ::Mine::FooTypeSupportImpl* fts_servant = new ::Mine::FooTypeSupportImpl(); PortableServer::ServantBase_var safe_servant = fts_servant; if (::DDS::RETCODE_OK != fts_servant->register_type(participant.in (), MY_TYPE)) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to register the FooNoTypeTypeSupport."))); throw TestException (); } } if (mixed_trans) { ::Mine::FooTypeSupportImpl* fts_servant = new ::Mine::FooTypeSupportImpl(); PortableServer::ServantBase_var safe_servant = fts_servant; if (::DDS::RETCODE_OK != fts_servant->register_type(participant.in (), MY_TYPE_FOR_UDP)) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) register_type failed.\n"))); throw TestException (); } } ::DDS::TopicQos topic_qos; participant->get_default_topic_qos(topic_qos); ::DDS::Topic_var topic = participant->create_topic(MY_TOPIC, MY_TYPE, topic_qos, ::DDS::TopicListener::_nil()); if (CORBA::is_nil (topic.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to create_topic."))); throw TestException (); } ::DDS::TopicDescription_var description = participant->lookup_topicdescription(MY_TOPIC); if (CORBA::is_nil (description.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to lookup_topicdescription."))); throw TestException (); } ::DDS::Topic_var topic1; ::DDS::TopicDescription_var description1; if (mixed_trans) { topic1 = participant->create_topic (MY_TOPIC_FOR_UDP, MY_TYPE_FOR_UDP, topic_qos, ::DDS::TopicListener::_nil()); if (CORBA::is_nil (topic1.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) create_topic failed.\n"))); throw TestException (); } description1 = participant->lookup_topicdescription(MY_TOPIC_FOR_UDP); if (CORBA::is_nil (description1.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to lookup_topicdescription."))); throw TestException (); } } // Initialize the transport if (0 != ::init_reader_transport() ) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to init_reader_transport."))); throw TestException (); } int attach_to_udp = using_udp; int attach_to_mcast = using_mcast; int attach_to_reliable_multicast = using_reliable_multicast; // Create the subscriber and attach to the corresponding // transport. ::DDS::Subscriber_var sub = create_subscriber(participant.in (), attach_to_udp, attach_to_mcast, attach_to_reliable_multicast); if (CORBA::is_nil (sub.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to create_subscriber."))); throw TestException (); } ::DDS::Subscriber_var sub1; if (mixed_trans) { // Create the subscriber with a different transport from previous // subscriber. sub1 = create_subscriber(participant.in (), ! attach_to_udp, attach_to_mcast, attach_to_reliable_multicast); if (CORBA::is_nil (sub1.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("Failed to create_subscriber."))); throw TestException (); } } // Create the Datareaders ::DDS::DataReaderQos dr_qos; sub->get_default_datareader_qos (dr_qos); // Make it KEEP_ALL history so we can verify the received // data without dropping. dr_qos.history.kind = ::DDS::KEEP_ALL_HISTORY_QOS; dr_qos.reliability.kind = ::DDS::RELIABLE_RELIABILITY_QOS; dr_qos.resource_limits.max_samples_per_instance = max_samples_per_instance ; // The history depth is only used for KEEP_LAST. //dr_qos.history.depth = history_depth ; // activate the listener DataReaderListenerImpl* listener_servant = new DataReaderListenerImpl(); ::DDS::DataReaderListener_var listener = ::TAO::DCPS::servant_to_reference(listener_servant); if (CORBA::is_nil (listener.in ())) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P|%t) listener is nil."))); throw TestException (); } ::DDS::DataReader_var * drs = new ::DDS::DataReader_var[num_datareaders]; // Create one datareader or multiple datareaders belonging to the same // subscriber. for (int i = 0; i < num_datareaders; i ++) { int attach_to_udp = using_udp; ::DDS::Subscriber_var the_sub = sub; ::DDS::TopicDescription_var the_description = description; // The first datawriter would be using a different transport // from others for the diff trans test case. if (mixed_trans && i == 0) { attach_to_udp = ! attach_to_udp; the_sub = sub1; the_description = description1; } // create the datareader. drs[i] = the_sub->create_datareader(the_description.in (), dr_qos, listener.in ()); if (CORBA::is_nil (drs[i].in ())) { ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT("(%P|%t) create_datareader failed.\n")), 1); } } // Indicate that the subscriber is ready FILE* readers_ready = ACE_OS::fopen (sub_ready_filename.c_str (), ACE_LIB_TEXT("w")); if (readers_ready == 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ERROR Unable to create subscriber completed file\n"))); } // Wait for the publisher to be ready FILE* writers_ready = 0; do { ACE_Time_Value small(0,250000); ACE_OS::sleep (small); writers_ready = ACE_OS::fopen (pub_ready_filename.c_str (), ACE_LIB_TEXT("r")); } while (0 == writers_ready); ACE_OS::fclose(readers_ready); ACE_OS::fclose(writers_ready); int expected = num_datawriters * num_instances_per_writer * num_samples_per_instance; FILE* writers_completed = 0; int timeout_writes = 0; while ( num_reads < expected) { // 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.c_str (), ACE_LIB_TEXT("r")); if (writers_completed != 0) { //writers_completed = ACE_OS::fopen (pub_finished_filename.c_str (), ACE_LIB_TEXT("r")); fscanf (writers_completed, "%d\n", &timeout_writes); // After we got the number of timed out writes, we should speed the // receiving. op_interval_ms = 0; expected -= timeout_writes; ACE_DEBUG((LM_DEBUG, ACE_TEXT ("(%P|%t) timed out writes %d, we expect %d\n"), timeout_writes, expected)); } } ACE_OS::sleep (1); } // Indicate that the subscriber is done FILE* readers_completed = ACE_OS::fopen (sub_finished_filename.c_str (), ACE_LIB_TEXT("w")); if (readers_completed == 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) ERROR Unable to create subscriber completed file\n"))); } // Wait for the publisher to finish while (writers_completed == 0) { ACE_Time_Value small(0,250000); ACE_OS::sleep (small); writers_completed = ACE_OS::fopen (pub_finished_filename.c_str (), ACE_LIB_TEXT("r")); } ACE_OS::fclose(readers_completed); ACE_OS::fclose(writers_completed); if (results.test_passed (expected) == false) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) Verify received samples - not passed \n"))); status = 1; } delete [] drs; } catch (const TestException&) { ACE_ERROR ((LM_ERROR, ACE_TEXT("(%P|%t) TestException caught in main (). "))); status = 1; } catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught in main ():"); status = 1; } try { if (! CORBA::is_nil (participant.in ())) { participant->delete_contained_entities(); } if (! CORBA::is_nil (dpf.in ())) { dpf->delete_participant(participant.in ()); } } catch (const CORBA::Exception& ex) { ex._tao_print_exception ("Exception caught in cleanup."); status = 1; } TheTransportFactory->release(); TheServiceParticipant->shutdown (); // Note: The TransportImpl reference SHOULD be deleted before exit from // main if the concrete transport libraries are loaded dynamically. // Otherwise cleanup after main() will encount access vilation. reader_tcp_impl = 0; reader_udp_impl = 0; reader_mcast_impl = 0; reader_reliable_multicast_impl = 0; return status; }