diff options
author | Johnny Willemsen <jwillemsen@remedy.nl> | 2011-08-11 07:01:07 +0000 |
---|---|---|
committer | Johnny Willemsen <jwillemsen@remedy.nl> | 2011-08-11 07:01:07 +0000 |
commit | 64df30bd4c72cc77e0273d027e9000dd311f3040 (patch) | |
tree | e9ba57f58d815b6b4c57ec82827a7cc9dd0deef7 /CIAO/connectors/dds4ccm | |
parent | 19b32e660182bf6436d0be6ff08e987984ccfcd2 (diff) | |
download | ATCD-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')
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.cpp | 33 | ||||
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/DataReader_T.h | 3 | ||||
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/DataWriter_T.cpp | 28 | ||||
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/DomainParticipant.cpp | 27 | ||||
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/Publisher.cpp | 29 | ||||
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/Subscriber.cpp | 26 | ||||
-rw-r--r-- | CIAO/connectors/dds4ccm/impl/ndds/Topic.cpp | 28 |
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 |