summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/performance-tests/RTEvent/Federated_Roundtrip/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/performance-tests/RTEvent/Federated_Roundtrip/client.cpp')
-rw-r--r--TAO/orbsvcs/performance-tests/RTEvent/Federated_Roundtrip/client.cpp273
1 files changed, 273 insertions, 0 deletions
diff --git a/TAO/orbsvcs/performance-tests/RTEvent/Federated_Roundtrip/client.cpp b/TAO/orbsvcs/performance-tests/RTEvent/Federated_Roundtrip/client.cpp
new file mode 100644
index 00000000000..0870f02aded
--- /dev/null
+++ b/TAO/orbsvcs/performance-tests/RTEvent/Federated_Roundtrip/client.cpp
@@ -0,0 +1,273 @@
+// $Id$
+
+#include "RT_Class.h"
+#include "ORB_Holder.h"
+#include "Servant_var.h"
+#include "RIR_Narrow.h"
+#include "RTServer_Setup.h"
+#include "Peer_Base.h"
+#include "Auto_Disconnect.h"
+#include "Send_Task.h"
+#include "Task_Activator.h"
+#include "Client_Pair.h"
+
+#include "orbsvcs/Event_Service_Constants.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+
+#include "tao/Messaging/Messaging.h"
+#include "tao/Strategies/advanced_resource.h"
+#include "tao/RTCORBA/Priority_Mapping_Manager.h"
+#include "tao/RTCORBA/Continuous_Priority_Mapping.h"
+#include "tao/RTPortableServer/RTPortableServer.h"
+#include "ace/Get_Opt.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/High_Res_Timer.h"
+#include "ace/Sample_History.h"
+#include "ace/Basic_Stats.h"
+#include "ace/Stats.h"
+#include "ace/Sched_Params.h"
+#include "ace/Barrier.h"
+
+ACE_RCSID(TAO_RTEC_PERF_Roundtrip, client, "$Id$")
+
+const char *ior = "file://test.ior";
+int nthreads = 0;
+int high_priority_period = 0;
+int high_priority_workload = 0;
+int low_priority_period = 0;
+int low_priority_workload = 0;
+int disable_low_priority = 0;
+int use_rt_corba = 0;
+
+class Roundtrip_Peer : public Peer_Base
+{
+public:
+ Roundtrip_Peer (CORBA::ORB_ptr orb,
+ RTServer_Setup &rtserver_setup,
+ RT_Class &rt_class)
+ : Peer_Base (orb, rtserver_setup)
+ , rt_class_ (&rt_class)
+ {
+ }
+
+ //@{
+ /** @name The Federated_Test::Peer methods
+ */
+ virtual Federated_Test::Experiment_Results *
+ run_experiment (CORBA::Long experiment_id,
+ CORBA::Long iterations);
+ //@}
+
+private:
+ RT_Class *rt_class_;
+};
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "k:n:l:h:w:v:zr");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'k':
+ ior = get_opts.opt_arg ();
+ break;
+
+ case 'n':
+ nthreads = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case 'h':
+ high_priority_period = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case 'l':
+ low_priority_period = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case 'w':
+ high_priority_workload = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case 'v':
+ low_priority_workload = ACE_OS::atoi (get_opts.opt_arg ());
+ break;
+
+ case 'z':
+ disable_low_priority = 1;
+ break;
+
+ case 'r':
+ use_rt_corba = 1;
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-k <IOR> "
+ "-i iterations (iterations) "
+ "-h high_priority_period (usecs) "
+ "-l low_priority_period (usecs) "
+ "-w high_priority_workload (usecs) "
+ "-v low_priority_workload (usecs) "
+ "-r (enable RT-CORBA) "
+ "-n nthreads (low priority thread) "
+ "-z (disable low priority) "
+ "\n",
+ argv [0]),
+ -1);
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+int main (int argc, char *argv[])
+{
+ TAO_EC_Default_Factory::init_svcs();
+ RT_Class rt_class;
+
+ try
+ {
+ ORB_Holder orb (argc, argv, "");
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ RTServer_Setup rtserver_setup (use_rt_corba,
+ orb,
+ rt_class,
+ nthreads);
+
+ PortableServer::POA_var root_poa =
+ RIR_Narrow<PortableServer::POA>::resolve (orb,
+ "RootPOA");
+
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager ();
+
+ poa_manager->activate ();
+
+ ACE_DEBUG ((LM_DEBUG, "Finished ORB and POA configuration\n"));
+
+ Servant_var<Roundtrip_Peer> peer_impl (
+ new Roundtrip_Peer (orb,
+ rtserver_setup,
+ rt_class)
+ );
+
+ Federated_Test::Peer_var peer =
+ peer_impl->_this ();
+
+ ACE_DEBUG ((LM_DEBUG, "Finished peer configuration and activation\n"));
+
+ CORBA::Object_var object =
+ orb->string_to_object (ior);
+
+ Federated_Test::Control_var control =
+ Federated_Test::Control::_narrow (object.in ());
+
+ control->join (peer.in ());
+
+ orb->run ();
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Exception caught:");
+ return 1;
+ }
+
+ return 0;
+}
+
+Federated_Test::Experiment_Results *
+Roundtrip_Peer::run_experiment (CORBA::Long experiment_id,
+ CORBA::Long iterations)
+{
+ int thread_count = 1;
+#if 0
+ if (disable_low_priority == 0)
+ thread_count += nthreads;
+#endif
+
+ ACE_Barrier the_barrier (thread_count);
+
+ ACE_DEBUG ((LM_DEBUG, "Calibrating high res timer ...."));
+ ACE_High_Res_Timer::calibrate ();
+
+ ACE_UINT32 gsf = ACE_High_Res_Timer::global_scale_factor ();
+ ACE_DEBUG ((LM_DEBUG, "Done (%d)\n", gsf));
+
+#if 0
+ Low_Priority_Setup<Client_Pair> low_priority_setup (
+ nthreads,
+ 0, // no limit on the number of iterations
+ 1, // each client gets its own type
+ experiment_id,
+ ACE_ES_EVENT_UNDEFINED + 2,
+ low_priority_workload,
+ gsf,
+ disable_low_priority ? 0 : 1,
+ this->rt_class_.priority_low (),
+ this->rt_class_.thr_sched_class (),
+ low_priority_period,
+ this->poa_.in (),
+ this->poa_.in (),
+ this->event_channel_.in (),
+ &the_barrier);
+#endif
+
+ Client_Pair high_priority_group;
+ high_priority_group.init (experiment_id,
+ ACE_ES_EVENT_UNDEFINED,
+ iterations,
+ high_priority_workload,
+ gsf,
+ this->poa_.in (),
+ this->poa_.in ());
+ high_priority_group.connect (this->event_channel_.in ());
+ Auto_Disconnect<Client_Pair> high_priority_disconnect (&high_priority_group);
+
+ Send_Task high_priority_task;
+ high_priority_task.init (iterations,
+ high_priority_period,
+ 0,
+ ACE_ES_EVENT_UNDEFINED,
+ experiment_id,
+ high_priority_group.supplier (),
+ &the_barrier);
+ {
+ // Artificial scope to wait for the high priority task...
+ Task_Activator<Send_Task> high_priority_act (this->rt_class_->priority_high (),
+ this->rt_class_->thr_sched_class (),
+ 1,
+ &high_priority_task);
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) client - high priority task completed\n"));
+
+#if 0
+ if (disable_low_priority == 0)
+ {
+ low_priority_setup.stop_all_threads ();
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) client - low priority task(s) stopped\n"));
+#endif
+
+ ACE_Sample_History &history =
+ high_priority_group.consumer ()->sample_history ();
+
+ Federated_Test::Experiment_Results_var results (
+ new Federated_Test::Experiment_Results (iterations)
+ );
+ results->length (iterations);
+ for (CORBA::ULong i = 0; i != results->length (); ++i)
+ {
+ results[i] = history.get_sample (i) / gsf;
+ }
+
+ return results._retn ();
+}