summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/CosEvent/lib/Counting_Supplier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/CosEvent/lib/Counting_Supplier.cpp')
-rw-r--r--TAO/orbsvcs/tests/CosEvent/lib/Counting_Supplier.cpp257
1 files changed, 257 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/CosEvent/lib/Counting_Supplier.cpp b/TAO/orbsvcs/tests/CosEvent/lib/Counting_Supplier.cpp
new file mode 100644
index 00000000000..b1f8e946266
--- /dev/null
+++ b/TAO/orbsvcs/tests/CosEvent/lib/Counting_Supplier.cpp
@@ -0,0 +1,257 @@
+// $Id$
+
+#include "Counting_Supplier.h"
+#include "ace/OS_NS_unistd.h"
+
+ACE_RCSID(CEC_Tests, CEC_Count_Supplier, "$Id$")
+
+CEC_Counting_Supplier::CEC_Counting_Supplier (void)
+ : event_count (0),
+ disconnect_count (0)
+{
+}
+
+void
+CEC_Counting_Supplier::connect (
+ CosEventChannelAdmin::SupplierAdmin_ptr supplier_admin
+ ACE_ENV_ARG_DECL)
+{
+ CosEventComm::PushSupplier_var supplier =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ {
+ this->consumer_proxy_ =
+ supplier_admin->obtain_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ this->consumer_proxy_->connect_push_supplier (supplier.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+CEC_Counting_Supplier::disconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->consumer_proxy_.in ()))
+ {
+ this->consumer_proxy_->disconnect_push_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ PortableServer::POA_var supplier_poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ PortableServer::ObjectId_var supplier_id =
+ supplier_poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ supplier_poa->deactivate_object (supplier_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_proxy_ =
+ CosEventChannelAdmin::ProxyPushConsumer::_nil ();
+}
+
+void
+CEC_Counting_Supplier::push (const CORBA::Any&
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ return;
+
+ CORBA::Any event;
+ event <<= CORBA::Long(0);
+
+ this->consumer_proxy_->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ this->event_count++;
+}
+
+void
+CEC_Counting_Supplier::disconnect_push_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->disconnect_count++;
+ this->consumer_proxy_ =
+ CosEventChannelAdmin::ProxyPushConsumer::_nil ();
+}
+
+// ****************************************************************
+
+CEC_Counting_Supplier_Task::
+ CEC_Counting_Supplier_Task (CEC_Counting_Supplier *s,
+ int milliseconds)
+ : supplier_ (s),
+ stop_flag_ (0),
+ push_count_ (0),
+ milliseconds_ (milliseconds)
+{
+}
+
+int
+CEC_Counting_Supplier_Task::svc ()
+{
+ ACE_TRY_NEW_ENV
+ {
+ this->run (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+void
+CEC_Counting_Supplier_Task::stop (void)
+{
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+ this->stop_flag_ = 1;
+}
+
+CORBA::ULong
+CEC_Counting_Supplier_Task::push_count (void)
+{
+ return this->push_count_;
+}
+
+void
+CEC_Counting_Supplier_Task::run (ACE_ENV_SINGLE_ARG_DECL)
+{
+ CORBA::Any event;
+ event <<= CORBA::Long(0);
+
+ int stop = 0;
+ do {
+ this->supplier_->push (event ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->milliseconds_ != 0)
+ {
+ ACE_Time_Value tv (0, 1000 * this->milliseconds_);
+ ACE_OS::sleep (tv);
+ }
+ else
+ {
+ // Sleep for a short time to avoid spinning... kind of klugy
+ ACE_OS::sleep (0);
+ }
+
+ ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock_);
+
+ this->push_count_++;
+
+ stop = this->stop_flag_;
+ } while (stop == 0);
+}
+
+// ****************************************************************
+
+CEC_Pull_Counting_Supplier::CEC_Pull_Counting_Supplier (void)
+ : event_count (0),
+ disconnect_count (0)
+{
+}
+
+void
+CEC_Pull_Counting_Supplier::connect (
+ CosEventChannelAdmin::SupplierAdmin_ptr supplier_admin
+ ACE_ENV_ARG_DECL)
+{
+ CosEventComm::PullSupplier_var supplier =
+ this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ {
+ this->consumer_proxy_ =
+ supplier_admin->obtain_pull_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ this->consumer_proxy_->connect_pull_supplier (supplier.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+}
+
+void
+CEC_Pull_Counting_Supplier::disconnect (ACE_ENV_SINGLE_ARG_DECL)
+{
+ if (!CORBA::is_nil (this->consumer_proxy_.in ()))
+ {
+ this->consumer_proxy_->disconnect_pull_consumer (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ PortableServer::POA_var supplier_poa =
+ this->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+ PortableServer::ObjectId_var supplier_id =
+ supplier_poa->servant_to_id (this ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ supplier_poa->deactivate_object (supplier_id.in () ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->consumer_proxy_ =
+ CosEventChannelAdmin::ProxyPullConsumer::_nil ();
+}
+
+CORBA::Any*
+CEC_Pull_Counting_Supplier::pull (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected))
+{
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ ACE_THROW_RETURN (CosEventComm::Disconnected (), 0);
+
+ if (this->event_count % 2)
+ {
+ // Sleep for 1 second, to simulate blocking calls.
+ ACE_OS::sleep (1);
+ }
+
+ this->event_count++;
+ CORBA::Any event;
+ event <<= CORBA::Long(0);
+
+ return new CORBA::Any (event);
+}
+
+CORBA::Any*
+CEC_Pull_Counting_Supplier::try_pull (CORBA::Boolean_out has_event
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected))
+{
+ if (CORBA::is_nil (this->consumer_proxy_.in ()))
+ ACE_THROW_RETURN (CosEventComm::Disconnected (), 0);
+
+ if (this->event_count % 2)
+ {
+ // No event
+ has_event = 0;
+ }
+ else
+ {
+ // We have an event
+ has_event = 1;
+ this->event_count++;
+ }
+
+ CORBA::Any event;
+ event <<= CORBA::Long(0);
+
+ return new CORBA::Any (event);
+}
+
+void
+CEC_Pull_Counting_Supplier::disconnect_pull_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->disconnect_count++;
+ this->consumer_proxy_ =
+ CosEventChannelAdmin::ProxyPullConsumer::_nil ();
+}