summaryrefslogtreecommitdiff
path: root/TAO/tests/Smart_Proxies/Benchmark/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Smart_Proxies/Benchmark/client.cpp')
-rw-r--r--TAO/tests/Smart_Proxies/Benchmark/client.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/TAO/tests/Smart_Proxies/Benchmark/client.cpp b/TAO/tests/Smart_Proxies/Benchmark/client.cpp
new file mode 100644
index 00000000000..34732cdac90
--- /dev/null
+++ b/TAO/tests/Smart_Proxies/Benchmark/client.cpp
@@ -0,0 +1,263 @@
+// $Id$
+
+//========================================================================
+//
+// = LIBRARY
+// TAO/tests/Smart_Proxies/Benchmark
+//
+// = FILENAME
+// client.cpp
+//
+// = DESCRIPTION
+// This is the client program that tests TAO's Smart Proxy extension.
+//
+// = AUTHOR
+// Kirthika Parameswaran <kirthika@cs.wustl.edu>
+//
+//=========================================================================
+
+#include "testC.h"
+#include "Smart_Proxy_Impl.h"
+#include "tao/debug.h"
+#include "ace/High_Res_Timer.h"
+#include "ace/Sched_Params.h"
+#include "ace/Stats.h"
+#include "ace/Get_Opt.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_errno.h"
+
+ACE_RCSID (Benchmark,
+ client,
+ "$Id$")
+
+const char *ior = "file://test.ior";
+int niterations = 5;
+int register_smart_proxy = 1;
+
+class Marker
+{
+ public:
+
+ void accumulate_into (ACE_Throughput_Stats &throughput) const
+ {
+ // Accumulate the throughput statistics into <throughput>
+ throughput.accumulate (this->throughput_);
+ }
+ void dump_stats (const char* msg,
+ ACE_UINT32 gsf)
+ {
+ // Print stats
+ this->throughput_.dump_results (msg, gsf);
+ }
+ void sample (ACE_hrtime_t throughput_diff,
+ ACE_hrtime_t latency_diff)
+ {
+ // get the sample.
+ this->throughput_.sample (throughput_diff,
+ latency_diff);
+
+ }
+ private:
+ ACE_Throughput_Stats throughput_;
+ // Keep throughput statistics on a per-thread basis
+};
+
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "i:n:r:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'i':
+ ior = ACE_OS::strdup (get_opts.opt_arg ());
+ break;
+ case 'n':
+ niterations = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+ case 'r':
+ register_smart_proxy = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-i -n"
+ "\n",
+ argv [0]),
+ -1);
+ }
+ return 0;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ int priority =
+ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO)
+ + ACE_Sched_Params::priority_max (ACE_SCHED_FIFO)) / 2;
+ // Enable FIFO scheduling, e.g., RT scheduling class on Solaris.
+
+ if (ACE_OS::sched_params (ACE_Sched_Params (ACE_SCHED_FIFO,
+ priority,
+ ACE_SCOPE_PROCESS)) != 0)
+ {
+ if (ACE_OS::last_error () == EPERM)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "client (%P|%t): user is not superuser, "
+ "test runs in time-shared class\n"));
+ }
+ else
+ ACE_ERROR ((LM_ERROR,
+ "client (%P|%t): sched_params failed\n"));
+ }
+
+ ACE_TRY_NEW_ENV
+ {
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc,
+ argv,
+ ""
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ CORBA::Object_var object =
+ orb->string_to_object (ior
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (register_smart_proxy == 1)
+ {
+ // To use the smart proxy it is necessary to allocate the
+ // user-defined smart factory on the heap as the smart proxy
+ // generated classes take care of destroying the object. This
+ // way it a win situation for the application developer who
+ // doesnt have to make sure to destoy it and also for the smart
+ // proxy designer who now can manage the lifetime of the object
+ // much surely.
+
+ Smart_Test_Factory *test_factory = 0;
+ ACE_NEW_RETURN (test_factory,
+ Smart_Test_Factory,
+ -1);
+
+ ACE_UNUSED_ARG (test_factory);
+ }
+
+ Test_var server =
+ Test::_narrow (object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (server.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Object reference <%s> is nil\n",
+ ior),
+ 1);
+ Marker marker;
+ ACE_Throughput_Stats throughput;
+ int i=0;
+ ACE_DEBUG ((LM_DEBUG, "High res. timer calibration...."));
+ ACE_UINT32 gsf = ACE_High_Res_Timer::global_scale_factor ();
+ ACE_DEBUG ((LM_DEBUG, "done\n"));
+
+ marker.accumulate_into (throughput);
+ CORBA::Short price =0;
+ CORBA::Long cost =0;
+ ACE_hrtime_t throughput_base = ACE_OS::gethrtime ();
+ for (i = 0; i < niterations ; ++i)
+ {
+ // Record current time.
+ ACE_hrtime_t latency_base = ACE_OS::gethrtime ();
+
+ price = server->box_prices (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (price < 300)
+ cost = server->tickets (5);
+
+ // Grab timestamp again.
+ ACE_hrtime_t now = ACE_OS::gethrtime ();
+
+ // Record statistics.
+ marker.sample (now - throughput_base,
+ now - latency_base);
+
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0 && i % 100 == 0)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) iteration = %d\n", i));
+ }
+
+ marker.dump_stats ("buying tickets ", gsf);
+
+ server->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ /*
+
+ Test_var server1 =
+ Test::_narrow (object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil (server1.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Object reference <%s> is nil\n",
+ ior),
+ 1);
+ Marker marker1;
+ ACE_Throughput_Stats throughput1;
+
+ ACE_DEBUG ((LM_DEBUG, "High res. timer calibration...."));
+ ACE_UINT32 gsf1 = ACE_High_Res_Timer::global_scale_factor ();
+ ACE_DEBUG ((LM_DEBUG, "done\n"));
+
+ marker1.accumulate_into (throughput1);
+ CORBA::Short price1 =0;
+ CORBA::Long cost1 =0;
+ ACE_hrtime_t throughput_base1 = ACE_OS::gethrtime ();
+ for (i = 0; i < niterations ; ++i)
+ {
+ // Record current time.
+ ACE_hrtime_t latency_base = ACE_OS::gethrtime ();
+
+ price1 = server1->box_prices (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (price1 < 300)
+ cost = server1->tickets (5);
+
+ // Grab timestamp again.
+ ACE_hrtime_t now = ACE_OS::gethrtime ();
+
+ // Record statistics.
+ marker.sample (now - throughput_base1,
+ now - latency_base);
+
+ ACE_TRY_CHECK;
+ if (TAO_debug_level > 0 && i % 100 == 0)
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) iteration = %d\n", i));
+ }
+
+ marker1.dump_stats ("buying tickets using a default proxy ", gsf1);
+
+ server1->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ */
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Client-side exception:");
+ return 1;
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}