summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-04-30 17:45:43 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-04-30 17:45:43 +0000
commitdc87f821e1852ae3445f4decd8045e7200633e3b (patch)
tree33827585a026f56d6ffc3e9668aab9e35db37f48 /TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
parent1e8ee5e4cc862cf571231de72c097d63beaae123 (diff)
downloadATCD-dc87f821e1852ae3445f4decd8045e7200633e3b.tar.gz
ChangeLogTag:Fri Apr 30 12:42:06 1999 Carlos O'Ryan <coryan@cs.wustl.edu>
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp98
1 files changed, 76 insertions, 22 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
index ab408795abb..2f6bc8b9a56 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
@@ -14,19 +14,19 @@ ACE_RCSID(Event, EC_ProxyConsumer, "$Id$")
TAO_EC_ProxyPushConsumer::
TAO_EC_ProxyPushConsumer (TAO_EC_Event_Channel* ec)
: event_channel_ (ec),
+ refcount_ (1),
filter_ (0)
{
-}
+ this->lock_ =
+ this->event_channel_->create_consumer_lock ();
-TAO_EC_ProxyPushConsumer::~TAO_EC_ProxyPushConsumer (void)
-{
+ this->default_POA_ =
+ this->event_channel_->consumer_poa ();
}
-void
-TAO_EC_ProxyPushConsumer::set_default_POA (PortableServer::POA_ptr poa)
+TAO_EC_ProxyPushConsumer::~TAO_EC_ProxyPushConsumer (void)
{
- this->default_POA_ =
- PortableServer::POA::_duplicate (poa);
+ this->event_channel_->destroy_consumer_lock (this->lock_);
}
PortableServer::POA_ptr
@@ -63,22 +63,51 @@ TAO_EC_ProxyPushConsumer::disconnected (TAO_EC_ProxyPushConsumer*,
{
}
+CORBA::ULong
+TAO_EC_ProxyPushConsumer::_incr_refcnt (void)
+{
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ return this->refcount_++;
+}
+
+CORBA::ULong
+TAO_EC_ProxyPushConsumer::_decr_refcnt (void)
+{
+ {
+ ACE_GUARD_RETURN (ACE_Lock, ace_mon, *this->lock_, 0);
+ this->refcount_--;
+ if (this->refcount_ != 0)
+ return this->refcount_;
+ }
+
+ // Notify the event channel
+ this->event_channel_->destroy_proxy_push_consumer (this);
+ return 0;
+}
+
void
TAO_EC_ProxyPushConsumer::connect_push_supplier (
RtecEventComm::PushSupplier_ptr push_supplier,
const RtecEventChannelAdmin::SupplierQOS& qos,
CORBA::Environment &ACE_TRY_ENV)
{
- if (this->is_connected ())
- ACE_THROW (RtecEventChannelAdmin::AlreadyConnected ());
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
- this->supplier_ =
- RtecEventComm::PushSupplier::_duplicate (push_supplier);
- this->qos_ = qos;
+ if (this->is_connected_i ())
+ ACE_THROW (RtecEventChannelAdmin::AlreadyConnected ());
- this->filter_ =
- this->event_channel_->supplier_filter_builder ()->create (this->qos_);
- this->filter_->bind (this);
+ this->supplier_ =
+ RtecEventComm::PushSupplier::_duplicate (push_supplier);
+ this->qos_ = qos;
+
+ this->filter_ =
+ this->event_channel_->supplier_filter_builder ()->create (this->qos_);
+ this->filter_->bind (this);
+ }
// Notify the event channel...
this->event_channel_->connected (this, ACE_TRY_ENV);
@@ -91,6 +120,8 @@ TAO_EC_ProxyPushConsumer::push (const RtecEventComm::EventSet& event,
if (this->is_connected () == 0)
return; // @@ THROW something???
+ // No need to keep the lock, the filter_ class is supposed to be
+ // thread safe....
this->filter_->push (event, ACE_TRY_ENV);
}
@@ -98,8 +129,22 @@ void
TAO_EC_ProxyPushConsumer::disconnect_push_consumer (
CORBA::Environment &ACE_TRY_ENV)
{
- this->supplier_ =
- RtecEventComm::PushSupplier::_nil ();
+ {
+ ACE_GUARD_THROW_EX (
+ ACE_Lock, ace_mon, *this->lock_,
+ RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ());
+ ACE_CHECK;
+
+ if (this->is_connected_i () == 0)
+ ACE_THROW (CORBA::BAD_INV_ORDER ());
+
+ this->supplier_ =
+ RtecEventComm::PushSupplier::_nil ();
+
+ this->filter_->unbind (this);
+ this->event_channel_->supplier_filter_builder ()->destroy (this->filter_);
+ this->filter_ = 0;
+ }
PortableServer::POA_var poa =
this->_default_POA (ACE_TRY_ENV);
@@ -110,12 +155,21 @@ TAO_EC_ProxyPushConsumer::disconnect_push_consumer (
poa->deactivate_object (id.in (), ACE_TRY_ENV);
ACE_CHECK;
- this->filter_->unbind (this);
- this->event_channel_->supplier_filter_builder ()->destroy (this->filter_);
- this->filter_ = 0;
-
// Notify the event channel...
this->event_channel_->disconnected (this, ACE_TRY_ENV);
- this->event_channel_->destroy_proxy_push_consumer (this);
+ this->_decr_refcnt ();
}
+
+void
+TAO_EC_ProxyPushConsumer::_add_ref (CORBA::Environment &)
+{
+ this->_incr_refcnt ();
+}
+
+void
+TAO_EC_ProxyPushConsumer::_remove_ref (CORBA::Environment &)
+{
+ this->_decr_refcnt ();
+}
+