diff options
Diffstat (limited to 'TAO/orbsvcs/performance-tests/RTEvent/lib/Control.cpp')
-rw-r--r-- | TAO/orbsvcs/performance-tests/RTEvent/lib/Control.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/TAO/orbsvcs/performance-tests/RTEvent/lib/Control.cpp b/TAO/orbsvcs/performance-tests/RTEvent/lib/Control.cpp new file mode 100644 index 00000000000..b35d809551c --- /dev/null +++ b/TAO/orbsvcs/performance-tests/RTEvent/lib/Control.cpp @@ -0,0 +1,179 @@ +/** + * @file Control.cpp + * + * $Id$ + * + * @author Carlos O'Ryan <coryan@uci.edu> + */ + +#include "Control.h" +#include "ORB_Shutdown.h" +#include "Shutdown.h" +#include "Auto_Disconnect.h" + +#include "orbsvcs/Event_Service_Constants.h" + +#include "ace/High_Res_Timer.h" +#include "ace/Sample_History.h" +#include "ace/Basic_Stats.h" +#include "ace/Auto_Ptr.h" + +ACE_RCSID (TAO_RTEC_Perf, + Control, + "$Id$") + +Control::Control (size_t peers_expected, + size_t iterations, + int do_dump_history, + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa) + : peers_expected_ (peers_expected) + , iterations_ (iterations) + , do_dump_history_ (do_dump_history) + , orb_ (CORBA::ORB::_duplicate (orb)) + , poa_ (PortableServer::POA::_duplicate (poa)) + , peers_count_ (0) + , peers_ (new Federated_Test::Peer_var[this->peers_expected_]) +{ +} + +Control::~Control (void) +{ + delete[] this->peers_; +} + +void +Control::join (Federated_Test::Peer_ptr peer + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + { + ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_); + if (this->peers_count_ == this->peers_expected_) + return; + + this->peers_[this->peers_count_++] = + Federated_Test::Peer::_duplicate (peer); + + if (this->peers_count_ < this->peers_expected_) + return; + } + + /// Automatically shutdown the ORB + ACE_Utils::Auto_Functor<CORBA::ORB,ORB_Shutdown> orb_shutdown (this->orb_.in ()); + + /// Automatically shutdown the peers + typedef ACE_Utils::Auto_Functor<Federated_Test::Peer,Shutdown<Federated_Test::Peer> > Peer_Shutdown; + ACE_Auto_Basic_Array_Ptr<Peer_Shutdown> peer_shutdown ( + new Peer_Shutdown[this->peers_count_] + ); + + size_t i; + for (i = 0; i != this->peers_count_; ++i) + { + peer_shutdown[i].reset(this->peers_[i].in()); + } + + ACE_DEBUG ((LM_DEBUG, + "Control (%P|%t) Building the federation\n")); + + /// Build the EC federation + for (i = 0; i != this->peers_count_; ++i) + { + for (size_t j = 0; j != this->peers_count_; ++j) + { + if (i != j) + { + this->peers_[j]->connect (this->peers_[i].in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + } + } + } + + /// ... run the test(s) ... + for (i = 0; i != this->peers_count_; ++i) + { + /// ... automatically release the object references ... + ACE_Auto_Basic_Array_Ptr<Federated_Test::Loopback_var> loopbacks ( + new Federated_Test::Loopback_var[2*this->peers_count_] + ); + + /// ... and automatically disconnect the loopbacks ... + typedef Auto_Disconnect<Federated_Test::Loopback> Loopback_Disconnect; + ACE_Auto_Basic_Array_Ptr<auto_ptr<Loopback_Disconnect> > disconnects ( + new auto_ptr<Loopback_Disconnect>[2*this->peers_count_] + ); + + ACE_DEBUG ((LM_DEBUG, + "Control (%P|%t) Running test for peer %d\n", + i)); + CORBA::Long experiment_id = 128 + i; + CORBA::Long base_event_type = ACE_ES_EVENT_UNDEFINED; + + size_t lcount = 0; + + size_t j; + for (j = 0; j != this->peers_count_; ++j) + { + if (j != i) + { + loopbacks[lcount] = + this->peers_[j]->setup_loopback (experiment_id, + base_event_type + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + ACE_AUTO_PTR_RESET (disconnects[lcount], + new Loopback_Disconnect ( + loopbacks[lcount].in ()), + Loopback_Disconnect + ); + lcount++; + + loopbacks[lcount] = + this->peers_[j]->setup_loopback (experiment_id, + base_event_type + 2 + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + ACE_AUTO_PTR_RESET (disconnects[lcount], + new Loopback_Disconnect ( + loopbacks[lcount].in ()), + Loopback_Disconnect + ); + lcount++; + } + } + + Federated_Test::Experiment_Results_var results = + this->peers_[i]->run_experiment (experiment_id, + this->iterations_ + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + ACE_Sample_History history (results->length ()); + for (CORBA::ULong k = 0; k != results->length (); ++k) + history.sample (results[k]); + + // We use a fake scale factor because the peer already converted + // to microseconds... + const ACE_UINT32 fake_scale_factor = 1; + + ACE_Basic_Stats stats; + history.collect_basic_stats (stats); + stats.dump_results ("Total", fake_scale_factor); + + if (this->do_dump_history_) + { + history.dump_samples ("HISTORY", fake_scale_factor); + } + } +} + +PortableServer::POA_ptr +Control::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + return PortableServer::POA::_duplicate (this->poa_.in ()); +} |