diff options
Diffstat (limited to 'ACE/TAO/examples/AMI/FL_Callback/Peer_i.cpp')
-rw-r--r-- | ACE/TAO/examples/AMI/FL_Callback/Peer_i.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/ACE/TAO/examples/AMI/FL_Callback/Peer_i.cpp b/ACE/TAO/examples/AMI/FL_Callback/Peer_i.cpp new file mode 100644 index 00000000000..60c59f02396 --- /dev/null +++ b/ACE/TAO/examples/AMI/FL_Callback/Peer_i.cpp @@ -0,0 +1,142 @@ +// $Id$ + +#include "Peer_i.h" +#include "ace/OS_NS_unistd.h" + +ACE_RCSID(FL_Callback, Peer_i, "$Id$") + +Peer_Handler_i::Peer_Handler_i (Peer_i *peer) + : peer_ (peer) +{ +} + +void +Peer_Handler_i::request (CORBA::Long retval) +{ + static int i = 0; + i++; + if (i % 100 == 0) + ACE_DEBUG ((LM_DEBUG, "(%P|%t) %d replies received\n", i)); + this->peer_->reply (retval); +} + + +void +Peer_Handler_i::request_excep ( + ::Messaging::ExceptionHolder *) +{ +} + +void +Peer_Handler_i::start (void) +{ +} + +void +Peer_Handler_i::shutdown (void) + +{ +} + +Peer_i::Peer_i (void) + : reply_handler_ (this) +{ +} + +Peer_i::~Peer_i (void) +{ +} + +void +Peer_i::init (CORBA::ORB_ptr orb, + Progress_ptr progress, + const ACE_Time_Value &delay) +{ + this->orb_ = CORBA::ORB::_duplicate (orb); + this->progress_ = Progress::_duplicate (progress); + this->delay_ = delay; + + Peer_var peer = this->_this (); + + ACE_DEBUG ((LM_DEBUG, "Peer (%P|%t) - binding\n")); + this->id_ = this->progress_->bind (peer.in ()); +} + +void +Peer_i::reply (CORBA::Long result) +{ + this->progress_->recv_reply (result); +} + +CORBA::Long +Peer_i::request (CORBA::Long id) +{ + ACE_Time_Value tv = this->delay_; + ACE_OS::sleep (tv); + + return id; +} + +void +Peer_i::start (const PeerSet &the_peers, + CORBA::Long iterations) +{ + AMI_PeerHandler_var handler = + this->reply_handler_._this (); + + // @@ Report errors as exceptions... + Peer_Task *task; + ACE_NEW (task, Peer_Task (the_peers, + iterations, + this->progress_.in (), + handler.in (), + this->id_)); + task->activate (); +} + +void +Peer_i::shutdown (void) +{ + this->orb_->shutdown (0); +} + +// **************************************************************** + +Peer_Task::Peer_Task (const PeerSet& the_peers, + CORBA::Long iterations, + Progress_ptr progress, + AMI_PeerHandler_ptr handler, + CORBA::Long id) + : the_peers_ (the_peers), + iterations_ (iterations), + progress_ (Progress::_duplicate (progress)), + handler_ (AMI_PeerHandler::_duplicate (handler)), + id_ (id) +{ +} + +int +Peer_Task::svc (void) +{ + for (int i = 0; i != this->iterations_; ++i) + { + CORBA::ULong l = this->the_peers_.length (); + for (CORBA::ULong j = 0; j != l; ++j) + { + try + { + this->the_peers_[j]->sendc_request (this->handler_.in (), + this->id_); + + this->progress_->sent_request (this->id_); + } + catch (const CORBA::Exception&) + { + // Ignore exceptions; + } + } + if (i % 100 == 0) + ACE_DEBUG ((LM_DEBUG, "(%P|%t) %d requests sent\n", i)); + } + return 0; +} |