summaryrefslogtreecommitdiff
path: root/CIAO/connectors/dds4ccm/impl/ndds
diff options
context:
space:
mode:
authorJohnny Willemsen <jwillemsen@remedy.nl>2011-08-11 07:01:07 +0000
committerJohnny Willemsen <jwillemsen@remedy.nl>2011-08-11 07:01:07 +0000
commit64df30bd4c72cc77e0273d027e9000dd311f3040 (patch)
treee9ba57f58d815b6b4c57ec82827a7cc9dd0deef7 /CIAO/connectors/dds4ccm/impl/ndds
parent19b32e660182bf6436d0be6ff08e987984ccfcd2 (diff)
downloadATCD-64df30bd4c72cc77e0273d027e9000dd311f3040.tar.gz
Thu Aug 11 06:54:09 UTC 2011 Johnny Willemsen <jwillemsen@remedy.nl>
* connectors/dds4ccm/impl/ndds/DataReader_T.h: * connectors/dds4ccm/impl/ndds/DataReader_T.cpp: * connectors/dds4ccm/impl/ndds/DataWriter_T.cpp: * connectors/dds4ccm/impl/ndds/DomainParticipant.cpp: * connectors/dds4ccm/impl/ndds/Publisher.cpp: * connectors/dds4ccm/impl/ndds/Subscriber.cpp: * connectors/dds4ccm/impl/ndds/Topic.cpp: Fixed possible race condition in the set_listener methods
Diffstat (limited to 'CIAO/connectors/dds4ccm/impl/ndds')
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.cpp33
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.h3
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/DataWriter_T.cpp28
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/DomainParticipant.cpp27
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/Publisher.cpp29
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/Subscriber.cpp26
-rw-r--r--CIAO/connectors/dds4ccm/impl/ndds/Topic.cpp28
7 files changed, 119 insertions, 55 deletions
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.cpp b/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.cpp
index 6c4d8e0af9c..d1713594839 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.cpp
+++ b/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.cpp
@@ -38,7 +38,6 @@ namespace CIAO
: rti_entity_ (0)
, dp_ (::DDS::DomainParticipant::_duplicate (dp))
, sub_ (::DDS::Subscriber::_duplicate (sub))
- , lst_mask_ (0)
{
DDS4CCM_TRACE ("CIAO::NDDS::DataReader_T::DataReader_T");
if (dr)
@@ -757,11 +756,10 @@ namespace CIAO
{
DDS4CCM_TRACE ("CIAO::NDDS::DataReader_T <TYPED_DDS_READER, TYPED_READER_TYPE, VALUE_TYPE, SEQ_TYPE, RTI_SEQ_TYPE>::set_listener");
- // Delete the previously set listener
- DDSDataReaderListener *listener = this->rti_entity ()->get_listener ();
- delete listener;
- listener = 0;
+ // Retrieve the previously set listener
+ DDSDataReaderListener *old_listener = this->rti_entity ()->get_listener ();
+ DDSDataReaderListener *listener = 0;
if (! ::CORBA::is_nil (a_listener))
{
ACE_NEW_THROW_EX (listener,
@@ -770,8 +768,20 @@ namespace CIAO
this),
::CORBA::NO_MEMORY ());
}
- this->lst_mask_ = mask;
- return this->rti_entity ()->set_listener (listener, mask);
+
+ ::DDS::ReturnCode_t const retcode =
+ this->rti_entity ()->set_listener (listener, mask);
+
+ if (retcode != ::DDS::RETCODE_OK)
+ {
+ delete listener;
+ }
+ else
+ {
+ delete old_listener;
+ }
+
+ return retcode;
}
template <typename TYPED_DDS_READER, typename TYPED_READER_TYPE, typename VALUE_TYPE, typename SEQ_TYPE, typename RTI_SEQ_TYPE>
@@ -961,15 +971,6 @@ namespace CIAO
}
template <typename TYPED_DDS_READER, typename TYPED_READER_TYPE, typename VALUE_TYPE, typename SEQ_TYPE, typename RTI_SEQ_TYPE>
- ::DDS::StatusMask
- DataReader_T <TYPED_DDS_READER, TYPED_READER_TYPE, VALUE_TYPE, SEQ_TYPE, RTI_SEQ_TYPE>::get_mask (void)
- {
- DDS4CCM_TRACE ("CIAO::NDDS::DataReader_T::get_mask");
-
- return this->lst_mask_;
- }
-
- template <typename TYPED_DDS_READER, typename TYPED_READER_TYPE, typename VALUE_TYPE, typename SEQ_TYPE, typename RTI_SEQ_TYPE>
void
DataReader_T <TYPED_DDS_READER, TYPED_READER_TYPE, VALUE_TYPE, SEQ_TYPE, RTI_SEQ_TYPE>::set_rti_entity (
::DDSDataReader* dr, ::DDS::DomainParticipant_ptr dp)
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.h b/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.h
index 78af1eab6b8..33d06b6e171 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.h
+++ b/CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.h
@@ -206,15 +206,12 @@ namespace CIAO
void set_rti_entity (::DDSDataReader* dr, ::DDS::DomainParticipant_ptr dp);
- ::DDS::StatusMask get_mask (void);
-
::DDSDataReader * get_rti_entity (void);
private:
TYPED_DDS_READER * rti_entity_;
::DDS::DomainParticipant_var dp_;
::DDS::Subscriber_var sub_;
- ::DDS::StatusMask lst_mask_;
TYPED_DDS_READER * rti_entity (void);
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/DataWriter_T.cpp b/CIAO/connectors/dds4ccm/impl/ndds/DataWriter_T.cpp
index 2847b2fa402..ffc0bd86343 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/DataWriter_T.cpp
+++ b/CIAO/connectors/dds4ccm/impl/ndds/DataWriter_T.cpp
@@ -67,18 +67,32 @@ namespace CIAO
{
DDS4CCM_TRACE ("DataWriter_T<TYPED_DDS_WRITER, TYPED_WRITER_TYPE, VALUE_TYPE>::set_listener");
- // Delete the previously set listener
- DDSDataWriterListener *listener = this->rti_entity ()->get_listener ();
- delete listener;
+ // Retrieve the previously set listener
+ DDSDataWriterListener *old_listener = this->rti_entity ()->get_listener ();
- DDS_DataWriterListener_i * ccm_dds_impl_list = 0;
+ DDSDataWriterListener *listener = 0;
if (! ::CORBA::is_nil (a_listener))
{
- ACE_NEW_THROW_EX (ccm_dds_impl_list,
- DDS_DataWriterListener_i (a_listener, this),
+ ACE_NEW_THROW_EX (listener,
+ DDS_DataWriterListener_i (
+ a_listener,
+ this),
::CORBA::NO_MEMORY ());
}
- return this->rti_entity ()->set_listener (ccm_dds_impl_list, mask);
+
+ ::DDS::ReturnCode_t const retcode =
+ this->rti_entity ()->set_listener (listener, mask);
+
+ if (retcode != ::DDS::RETCODE_OK)
+ {
+ delete listener;
+ }
+ else
+ {
+ delete old_listener;
+ }
+
+ return retcode;
}
template <typename TYPED_DDS_WRITER, typename TYPED_WRITER_TYPE, typename VALUE_TYPE>
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/DomainParticipant.cpp b/CIAO/connectors/dds4ccm/impl/ndds/DomainParticipant.cpp
index b00150c6e91..723c1824697 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/DomainParticipant.cpp
+++ b/CIAO/connectors/dds4ccm/impl/ndds/DomainParticipant.cpp
@@ -872,20 +872,33 @@ namespace CIAO
::DDS::DomainParticipantListener_ptr a_listener,
::DDS::StatusMask mask)
{
- // Delete the previously set listener
- DDSDomainParticipantListener *listener = this->rti_entity ()->get_listener ();
- delete listener;
+ DDS4CCM_TRACE ("DDS_DomainParticipant_i::set_listener");
- ::DDSDomainParticipantListener * ccm_dds_impl_list = 0;
+ // Retrieve the previously set listener
+ DDSDomainParticipantListener *old_listener = this->rti_entity ()->get_listener ();
+
+ DDSDomainParticipantListener *listener = 0;
if (! ::CORBA::is_nil (a_listener))
{
- ACE_NEW_THROW_EX (ccm_dds_impl_list,
+ ACE_NEW_THROW_EX (listener,
DDS_DomainParticipantListener_i (a_listener),
::CORBA::NO_MEMORY ());
}
- return this->rti_entity ()->set_listener (ccm_dds_impl_list, mask);
- }
+ ::DDS::ReturnCode_t const retcode =
+ this->rti_entity ()->set_listener (listener, mask);
+
+ if (retcode != ::DDS::RETCODE_OK)
+ {
+ delete listener;
+ }
+ else
+ {
+ delete old_listener;
+ }
+
+ return retcode;
+ }
::DDS::DomainParticipantListener_ptr
DDS_DomainParticipant_i::get_listener (void)
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/Publisher.cpp b/CIAO/connectors/dds4ccm/impl/ndds/Publisher.cpp
index c86e024c3d8..1bbf621046e 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/Publisher.cpp
+++ b/CIAO/connectors/dds4ccm/impl/ndds/Publisher.cpp
@@ -251,19 +251,32 @@ namespace CIAO
{
DDS4CCM_TRACE ("DDS_Publisher_i::set_listener");
- // Delete the previously set listener
- DDSPublisherListener *listener = this->rti_entity ()->get_listener ();
- delete listener;
- listener = 0;
+ // Retrieve the previously set listener
+ DDSPublisherListener *old_listener = this->rti_entity ()->get_listener ();
- DDS_PublisherListener_i * ccm_dds_impl_list = 0;
+ DDSPublisherListener *listener = 0;
if (! ::CORBA::is_nil (a_listener))
{
- ACE_NEW_THROW_EX (ccm_dds_impl_list,
- DDS_PublisherListener_i (a_listener, this->dp_.in ()),
+ ACE_NEW_THROW_EX (listener,
+ DDS_PublisherListener_i (
+ a_listener,
+ this->dp_.in ()),
::CORBA::NO_MEMORY ());
}
- return this->rti_entity ()->set_listener (ccm_dds_impl_list, mask);
+
+ ::DDS::ReturnCode_t const retcode =
+ this->rti_entity ()->set_listener (listener, mask);
+
+ if (retcode != ::DDS::RETCODE_OK)
+ {
+ delete listener;
+ }
+ else
+ {
+ delete old_listener;
+ }
+
+ return retcode;
}
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/Subscriber.cpp b/CIAO/connectors/dds4ccm/impl/ndds/Subscriber.cpp
index 7cbadb6f59d..8433c84a3c9 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/Subscriber.cpp
+++ b/CIAO/connectors/dds4ccm/impl/ndds/Subscriber.cpp
@@ -430,18 +430,32 @@ namespace CIAO
{
DDS4CCM_TRACE ("DDS_Subscriber_i::set_listener");
- // Delete the previously set listener
- DDSSubscriberListener *listener = this->rti_entity ()->get_listener ();
- delete listener;
- listener = 0;
+ // Retrieve the previously set listener
+ DDSSubscriberListener *old_listener = this->rti_entity ()->get_listener ();
+ DDSSubscriberListener *listener = 0;
if (! ::CORBA::is_nil (a_listener))
{
ACE_NEW_THROW_EX (listener,
- DDS_SubscriberListener_i (a_listener, this->dp_.in ()),
+ DDS_SubscriberListener_i (
+ a_listener,
+ this->dp_.in ()),
::CORBA::NO_MEMORY ());
}
- return this->rti_entity ()->set_listener (listener, mask);
+
+ ::DDS::ReturnCode_t const retcode =
+ this->rti_entity ()->set_listener (listener, mask);
+
+ if (retcode != ::DDS::RETCODE_OK)
+ {
+ delete listener;
+ }
+ else
+ {
+ delete old_listener;
+ }
+
+ return retcode;
}
diff --git a/CIAO/connectors/dds4ccm/impl/ndds/Topic.cpp b/CIAO/connectors/dds4ccm/impl/ndds/Topic.cpp
index 43589f2e77a..cbeb07e6b6e 100644
--- a/CIAO/connectors/dds4ccm/impl/ndds/Topic.cpp
+++ b/CIAO/connectors/dds4ccm/impl/ndds/Topic.cpp
@@ -49,21 +49,33 @@ namespace CIAO
{
DDS4CCM_TRACE ("DDS_Topic_i::set_listener");
- // Delete the previously set listener
- DDSTopicListener *listener = this->rti_entity ()->get_listener ();
- delete listener;
- listener = 0;
-
- this->topic_listener_ = ::DDS::TopicListener::_duplicate (a_listener);
+ // Retrieve the previously set listener
+ DDSTopicListener *old_listener = this->rti_entity ()->get_listener ();
+ DDSTopicListener *listener = 0;
if (! ::CORBA::is_nil (a_listener))
{
ACE_NEW_THROW_EX (listener,
- DDS_TopicListener_i (this, a_listener),
+ DDS_TopicListener_i (
+ this,
+ a_listener),
::CORBA::NO_MEMORY ());
+ }
+ ::DDS::ReturnCode_t const retcode =
+ this->rti_entity ()->set_listener (listener, mask);
+
+ if (retcode != ::DDS::RETCODE_OK)
+ {
+ delete listener;
}
- return this->rti_entity ()->set_listener (listener, mask);
+ else
+ {
+ this->topic_listener_ = ::DDS::TopicListener::_duplicate (a_listener);
+ delete old_listener;
+ }
+
+ return retcode;
}
::DDS::TopicListener_ptr