summaryrefslogtreecommitdiff
path: root/ACE/TAO/orbsvcs/performance-tests/RTEvent/lib/Low_Priority_Setup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/orbsvcs/performance-tests/RTEvent/lib/Low_Priority_Setup.cpp')
-rw-r--r--ACE/TAO/orbsvcs/performance-tests/RTEvent/lib/Low_Priority_Setup.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/performance-tests/RTEvent/lib/Low_Priority_Setup.cpp b/ACE/TAO/orbsvcs/performance-tests/RTEvent/lib/Low_Priority_Setup.cpp
new file mode 100644
index 00000000000..4ca093c4c0d
--- /dev/null
+++ b/ACE/TAO/orbsvcs/performance-tests/RTEvent/lib/Low_Priority_Setup.cpp
@@ -0,0 +1,118 @@
+/**
+ * @file Low_Priority_Setup.cpp
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan <coryan@uci.edu>
+ */
+
+#ifndef TAO_PERF_RTEC_LOW_PRIORITY_SETUP_CPP
+#define TAO_PERF_RTEC_LOW_PRIORITY_SETUP_CPP
+
+#include "Low_Priority_Setup.h"
+
+#include "ace/Basic_Stats.h"
+#include "ace/Sample_History.h"
+
+template<class Client_Type> Low_Priority_Setup<Client_Type>::
+Low_Priority_Setup (int consumer_count,
+ int iterations,
+ int use_different_types,
+ CORBA::Long experiment_id,
+ CORBA::Long base_event_type,
+ int workload,
+ ACE_UINT32 gsf,
+ int nthreads,
+ int thread_priority,
+ int thread_sched_class,
+ int per_thread_period,
+ PortableServer::POA_ptr supplier_poa,
+ PortableServer::POA_ptr consumer_poa,
+ RtecEventChannelAdmin::EventChannel_ptr ec,
+ ACE_Barrier *barrier)
+ : consumer_count_ (consumer_count)
+ , clients_ (consumer_count ? new Client_Type[consumer_count] : 0)
+ , disconnect_ (consumer_count ? new Client_Auto_Disconnect[consumer_count] : 0)
+ , nthreads_ (nthreads)
+ , tasks_ (nthreads ? new Send_Task[nthreads] : 0)
+ , stoppers_ (nthreads ? new Auto_Send_Task_Stopper[nthreads] : 0)
+{
+ for (int i = 0; i != consumer_count; ++i)
+ {
+ int per_consumer_workload =
+ workload / this->consumer_count_;
+ if (workload != 0 && per_consumer_workload == 0)
+ per_consumer_workload = 1;
+
+ CORBA::Long event_type =
+ base_event_type;
+ if (use_different_types)
+ event_type = base_event_type + 2 * i;
+
+ this->clients_[i].init (experiment_id,
+ event_type,
+ iterations,
+ per_consumer_workload,
+ gsf,
+ supplier_poa,
+ consumer_poa);
+ this->clients_[i].connect (ec);
+ // Automatically disconnect the group if the connection was
+ // successful
+ this->disconnect_[i] = &this->clients_[i];
+ }
+
+ for (int j = 0; j != nthreads; ++j)
+ {
+ CORBA::Long event_type =
+ base_event_type;
+ if (use_different_types)
+ event_type = base_event_type + 2 * j;
+
+ this->tasks_[j].init (0,
+ per_thread_period,
+ j * per_thread_period,
+ event_type,
+ experiment_id,
+ this->clients_[j].supplier (),
+ barrier);
+ this->tasks_[j].thr_mgr (&this->thr_mgr_);
+ ACE_AUTO_PTR_RESET (this->stoppers_[j],
+ new Send_Task_Stopper (thread_priority,
+ thread_sched_class,
+ &this->tasks_[j]),
+ Send_Task_Stopper);
+ }
+}
+
+template<class Client_Type> void
+Low_Priority_Setup<Client_Type>::stop_all_threads (void)
+{
+ ACE_DEBUG ((LM_DEBUG, "Stopping:"));
+ for (int i = 0; i != this->nthreads_; ++i)
+ {
+ this->tasks_[i].stop ();
+ ACE_DEBUG ((LM_DEBUG, " %d", i));
+ }
+ ACE_DEBUG ((LM_DEBUG, "\n"));
+ this->thr_mgr_.wait ();
+
+ /// Resetting the auto_ptr<> destroys all the objects. The
+ /// destructors automatically stop and wait for all the threads.
+ /// Depending on your personal bias this is either "super neat" or
+ /// "a horrible kludge", IMHO is just good use of the language :-)
+ this->stoppers_.reset (0);
+}
+
+template<class Client_Type> void
+Low_Priority_Setup<Client_Type>::collect_basic_stats (ACE_Basic_Stats &stats)
+{
+ for (int i = 0; i != this->consumer_count_; ++i)
+ {
+ ACE_Sample_History &history =
+ this->clients_[i].consumer ()->sample_history ();
+ history.collect_basic_stats (stats);
+ }
+}
+
+#endif /* TAO_PERF_RTEC_LOW_PRIORITY_SETUP_CPP */