diff options
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp')
-rw-r--r-- | TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp | 128 |
1 files changed, 91 insertions, 37 deletions
diff --git a/TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp b/TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp index 20f27590825..80799fd09d2 100644 --- a/TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp +++ b/TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp @@ -5,21 +5,29 @@ #include "tao/corba.h" #include "tao/TAO.h" #include "ace/Get_Opt.h" +#include "ace/High_Res_Timer.h" +#include "ace/Stats.h" ACE_RCSID(Latency, ping, "$Id$") const char *ior_output_file = "ping.ior"; const char *protocol = "RTP/UDP"; int milliseconds = 100; -AVStreams::protocolSpec recv_protocols; -AVStreams::protocolSpec send_protocols; +int respond = 1; +AVStreams::protocolSpec ping_protocols; +AVStreams::protocolSpec pong_protocols; Pong_Send_Callback pong_callback; +ACE_hrtime_t recv_base = 0; +ACE_Throughput_Stats recv_latency; + +CORBA::ORB_ptr the_orb = 0; + int parse_args (int argc, char *argv[]) { - ACE_Get_Opt get_opts (argc, argv, "o:s:r:t:"); + ACE_Get_Opt get_opts (argc, argv, "xo:s:r:t:"); int c; while ((c = get_opts ()) != -1) @@ -31,17 +39,17 @@ parse_args (int argc, char *argv[]) case 'r': { - CORBA::ULong l = recv_protocols.length (); - recv_protocols.length (l + 1); - recv_protocols[l] = CORBA::string_dup (get_opts.optarg); + CORBA::ULong l = ping_protocols.length (); + ping_protocols.length (l + 1); + ping_protocols[l] = CORBA::string_dup (get_opts.optarg); } break; case 's': { - CORBA::ULong l = send_protocols.length (); - send_protocols.length (l + 1); - send_protocols[l] = CORBA::string_dup (get_opts.optarg); + CORBA::ULong l = pong_protocols.length (); + pong_protocols.length (l + 1); + pong_protocols[l] = CORBA::string_dup (get_opts.optarg); } break; @@ -49,6 +57,10 @@ parse_args (int argc, char *argv[]) milliseconds = ACE_OS::atoi (get_opts.optarg); break; + case 'x': + respond = 0; + break; + case '?': default: ACE_ERROR_RETURN ((LM_ERROR, @@ -64,16 +76,16 @@ parse_args (int argc, char *argv[]) // If no protocols are specified use the default... - if (recv_protocols.length () == 0) + if (ping_protocols.length () == 0) { - recv_protocols.length (1); - recv_protocols[0] = CORBA::string_dup ("UDP=224.9.9.2:12345"); + ping_protocols.length (1); + ping_protocols[0] = CORBA::string_dup ("UDP=224.9.9.2:12345"); } - if (send_protocols.length () == 0) + if (pong_protocols.length () == 0) { - send_protocols.length (1); - send_protocols[0] = CORBA::string_dup ("UDP=224.9.9.2:23456"); + pong_protocols.length (1); + pong_protocols[0] = CORBA::string_dup ("UDP=224.9.9.2:23456"); } // Indicates sucessful parsing of the command line @@ -94,6 +106,9 @@ int main (int argc, char *argv[]) av_core->orb_manager (); CORBA::ORB_var orb = orb_manager->orb (); + the_orb = orb.in (); + // No copying, because the global variable is not used after the + // event loop finishes... CORBA::Object_var poa_object = orb->resolve_initial_references("RootPOA", ACE_TRY_ENV); @@ -112,10 +127,17 @@ int main (int argc, char *argv[]) // Register the video mmdevice object with the ORB - Reactive_Strategy reactive_strategy (orb_manager); - TAO_MMDevice mmdevice_impl (&reactive_strategy); + Reactive_Strategy *reactive_strategy; + ACE_NEW_RETURN (reactive_strategy, + Reactive_Strategy (orb_manager), + 1); + TAO_MMDevice *mmdevice_impl; + ACE_NEW_RETURN (mmdevice_impl, + TAO_MMDevice (reactive_strategy), + 1); + AVStreams::MMDevice_var mmdevice = - mmdevice_impl._this (ACE_TRY_ENV); + mmdevice_impl->_this (ACE_TRY_ENV); ACE_TRY_CHECK; CORBA::String_var ior = @@ -137,27 +159,44 @@ int main (int argc, char *argv[]) ACE_OS::fclose (output_file); } - Ping_Recv_FDev ping_fdev_impl ("Ping"); - Pong_Send_FDev pong_fdev_impl ("Pong"); + Ping_Recv_FDev* ping_fdev_impl; + ACE_NEW_RETURN (ping_fdev_impl, + Ping_Recv_FDev ("Ping"), + 1); + Pong_Send_FDev* pong_fdev_impl; + ACE_NEW_RETURN (pong_fdev_impl, + Pong_Send_FDev ("Pong"), + 1); AVStreams::FDev_var ping_fdev = - ping_fdev_impl._this (ACE_TRY_ENV); + ping_fdev_impl->_this (ACE_TRY_ENV); ACE_TRY_CHECK; AVStreams::FDev_var pong_fdev = - pong_fdev_impl._this (ACE_TRY_ENV); + pong_fdev_impl->_this (ACE_TRY_ENV); ACE_TRY_CHECK; mmdevice->add_fdev (ping_fdev.in (), ACE_TRY_ENV); ACE_TRY_CHECK; - mmdevice->add_fdev (pong_fdev.in (), ACE_TRY_ENV); - ACE_TRY_CHECK; - if (orb->run () == -1) + if (respond == 1) + { + mmdevice->add_fdev (pong_fdev.in (), ACE_TRY_ENV); + ACE_TRY_CHECK; + } + + ACE_Time_Value tv (120, 0); + if (orb->run (tv) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "orb->run"), -1); ACE_DEBUG ((LM_DEBUG, "event loop finished\n")); - root_poa->destroy (1, 1, ACE_TRY_ENV); - ACE_TRY_CHECK; + ACE_DEBUG ((LM_DEBUG, "Calibrating scale factory . . . ")); + ACE_UINT32 gsf = ACE_High_Res_Timer::global_scale_factor (); + ACE_DEBUG ((LM_DEBUG, "done\n")); + + recv_latency.dump_results ("Receive", gsf); + + // root_poa->destroy (1, 1, ACE_TRY_ENV); + // ACE_TRY_CHECK; } ACE_CATCHANY { @@ -174,7 +213,7 @@ int main (int argc, char *argv[]) Ping_Recv::Ping_Recv (void) : TAO_FlowConsumer ("Ping", - recv_protocols, + ping_protocols, "UNS:ping") { } @@ -183,7 +222,7 @@ int Ping_Recv::get_callback (const char *, TAO_AV_Callback *&callback) { - ACE_DEBUG ((LM_DEBUG,"Ping_Recv::get_callback\n")); + // ACE_DEBUG ((LM_DEBUG,"Ping_Recv::get_callback\n")); callback = &this->callback_; return 0; } @@ -192,6 +231,8 @@ int Ping_Recv_Callback::handle_stop (void) { ACE_DEBUG ((LM_DEBUG,"Ping_Recv_Callback::stop")); + the_orb->shutdown (); + return 0; } @@ -200,7 +241,7 @@ Ping_Recv_Callback::receive_frame (ACE_Message_Block *frame, TAO_AV_frame_info *, const ACE_Addr &) { - ACE_DEBUG ((LM_DEBUG,"Ping_Recv_Callback::receive_frame\n")); + // ACE_DEBUG ((LM_DEBUG,"Ping_Recv_Callback::receive_frame\n")); for (const ACE_Message_Block *i = frame; frame != 0; @@ -213,7 +254,19 @@ Ping_Recv_Callback::receive_frame (ACE_Message_Block *frame, ACE_OS::memcpy (&stamp, frame->rd_ptr (), sizeof(stamp)); - pong_callback.send_response (stamp); + ACE_hrtime_t now = ACE_OS::gethrtime (); + if (recv_base == 0) + { + recv_base = now; + } + else + { + recv_latency.sample (now - recv_base, + now - stamp); + } + + if (respond == 1) + pong_callback.send_response (stamp); } return 0; } @@ -221,7 +274,7 @@ Ping_Recv_Callback::receive_frame (ACE_Message_Block *frame, int Ping_Recv_Callback::handle_destroy (void) { - ACE_DEBUG ((LM_DEBUG,"Ping_Recv_Callback::destroy\n")); + // ACE_DEBUG ((LM_DEBUG,"Ping_Recv_Callback::destroy\n")); return 0; } @@ -229,7 +282,7 @@ Ping_Recv_Callback::handle_destroy (void) Pong_Send::Pong_Send (void) : TAO_FlowProducer ("Pong", - send_protocols, + pong_protocols, "UNS:pong") { } @@ -238,7 +291,7 @@ int Pong_Send::get_callback (const char *, TAO_AV_Callback *&callback) { - ACE_DEBUG ((LM_DEBUG,"Pong_Send::get_callback\n")); + // ACE_DEBUG ((LM_DEBUG,"Pong_Send::get_callback\n")); callback = &pong_callback; return 0; } @@ -254,7 +307,7 @@ Pong_Send_Callback::get_timeout (ACE_Time_Value *&tv, int Pong_Send_Callback::handle_timeout (void *arg) { - ACE_DEBUG ((LM_DEBUG, "pong timeout (ignored)\n")); + // ACE_DEBUG ((LM_DEBUG, "pong timeout (ignored)\n")); return 0; } @@ -267,15 +320,16 @@ Pong_Send_Callback::handle_end_stream (void) int Pong_Send_Callback::send_response (ACE_hrtime_t stamp) { - ACE_DEBUG ((LM_DEBUG, "pong send response)\n")); + // ACE_DEBUG ((LM_DEBUG, "pong send response)\n")); ACE_hrtime_t buf[2]; - buf[0] = stamp; ACE_Message_Block mb (ACE_reinterpret_cast (char*,buf), sizeof(buf)); + buf[0] = stamp; buf[1] = ACE_OS::gethrtime (); + mb.wr_ptr (sizeof(buf)); int result = this->protocol_object_->send_frame (&mb); if (result < 0) |