summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp')
-rw-r--r--TAO/orbsvcs/tests/AVStreams/Latency/ping.cpp128
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)