diff options
author | bala <balanatarajan@users.noreply.github.com> | 2002-08-27 23:48:23 +0000 |
---|---|---|
committer | bala <balanatarajan@users.noreply.github.com> | 2002-08-27 23:48:23 +0000 |
commit | e0519ce4faa6102550e43c2c1951c12aadcf46e1 (patch) | |
tree | 8675c6774812eeb9101592f199e9e7a227ebe8f1 /TAO | |
parent | f05aab153dd58f80b67c6087eac1012529d0b58b (diff) | |
download | ATCD-e0519ce4faa6102550e43c2c1951c12aadcf46e1.tar.gz |
ChangeLogTag: Tue Aug 27 18:31:53 2002 Balachandran Natarajan <bala@isis-server.vuse.vanderbilt.edu>
Diffstat (limited to 'TAO')
-rw-r--r-- | TAO/ChangeLog | 16 | ||||
-rw-r--r-- | TAO/tao/Transport.cpp | 17 | ||||
-rw-r--r-- | TAO/tao/Transport_Cache_Manager.cpp | 23 | ||||
-rw-r--r-- | TAO/tao/Transport_Cache_Manager.inl | 25 |
4 files changed, 46 insertions, 35 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index dba79fa12b7..c0d539670cd 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,3 +1,19 @@ +Tue Aug 27 18:31:53 2002 Balachandran Natarajan <bala@isis-server.vuse.vanderbilt.edu> + + * tao/Transport.cpp: Made the methods purge_entry () and make_idle + () more readable. Instead of checking whether the hash_map entry + is available within the transport classes, just defer that + decision to the Transport_Cache_Manager classes. + + * tao/Transport_Cache_Manager.cpp: + * tao/Transport_Cache_Manager.inl: The make_idle () and + purge_entry () methods now use the classical double-checked + locking optimization pattern before calling the actual + implementations. + + This fixes [BUG 1276]. Thanks to Carlos O'Ryan + <coryan@atdesk.com> for supplying the patches. + Tue Aug 27 15:56:05 2002 Ossama Othman <ossama@uci.edu> * orbsvcs/tests/Security/Callback/server_i.cpp (test_request): diff --git a/TAO/tao/Transport.cpp b/TAO/tao/Transport.cpp index b42243d6a09..79d943f8c0a 100644 --- a/TAO/tao/Transport.cpp +++ b/TAO/tao/Transport.cpp @@ -144,10 +144,7 @@ TAO_Transport::~TAO_Transport (void) // Avoid making the call if we can. This may be redundant, unless // someone called handle_close() on the connection handler from // outside the TAO_Transport. - if (this->cache_map_entry_ != 0) - { - this->transport_cache_manager ().purge_entry (this->cache_map_entry_); - } + this->transport_cache_manager ().purge_entry (this->cache_map_entry_); } @@ -369,19 +366,13 @@ TAO_Transport::recache_transport (TAO_Transport_Descriptor_Interface *desc) void TAO_Transport::purge_entry (void) { - if (this->cache_map_entry_ != 0) - { - (void) this->transport_cache_manager ().purge_entry (this->cache_map_entry_); - } + (void) this->transport_cache_manager ().purge_entry (this->cache_map_entry_); } int TAO_Transport::make_idle (void) { - if (this->cache_map_entry_ != 0) - { - return this->transport_cache_manager ().make_idle (this->cache_map_entry_); - } + return this->transport_cache_manager ().make_idle (this->cache_map_entry_); return -1; } @@ -695,7 +686,7 @@ TAO_Transport::close_connection_shared (int disable_purge, ACE_Event_Handler * eh) { // Purge the entry - if (!disable_purge && this->cache_map_entry_ != 0) + if (!disable_purge) { this->transport_cache_manager ().purge_entry (this->cache_map_entry_); } diff --git a/TAO/tao/Transport_Cache_Manager.cpp b/TAO/tao/Transport_Cache_Manager.cpp index 4afe4868fc4..3388cbdbc9d 100644 --- a/TAO/tao/Transport_Cache_Manager.cpp +++ b/TAO/tao/Transport_Cache_Manager.cpp @@ -258,6 +258,9 @@ TAO_Transport_Cache_Manager::find_i (const TAO_Cache_ExtId &key, int TAO_Transport_Cache_Manager::make_idle_i (HASH_MAP_ENTRY *&entry) { + if(entry == 0) + return -1; + // First get the entry again (if at all things had changed in the // cache map in the mean time) @@ -329,13 +332,12 @@ TAO_Transport_Cache_Manager::close_i (ACE_Handle_Set &reactor_registered, int TAO_Transport_Cache_Manager::purge_entry_i (HASH_MAP_ENTRY *&entry) { - int retval = 0; + if (entry == 0) + return 0; - if (entry) - { - // Remove the entry from the Map - retval = this->cache_map_.unbind (entry); - } + // Remove the entry from the Map + int retval = + this->cache_map_.unbind (entry); // Set the entry pointer to zero entry = 0; @@ -346,12 +348,11 @@ TAO_Transport_Cache_Manager::purge_entry_i (HASH_MAP_ENTRY *&entry) void TAO_Transport_Cache_Manager::mark_invalid_i (HASH_MAP_ENTRY *&entry) { - if (entry) - { - // Mark the entry as not usable - entry->int_id_.recycle_state (ACE_RECYCLABLE_PURGABLE_BUT_NOT_IDLE); - } + if (entry == 0) + return; + // Mark the entry as not usable + entry->int_id_.recycle_state (ACE_RECYCLABLE_PURGABLE_BUT_NOT_IDLE); } diff --git a/TAO/tao/Transport_Cache_Manager.inl b/TAO/tao/Transport_Cache_Manager.inl index 601864ade4f..c32192b6998 100644 --- a/TAO/tao/Transport_Cache_Manager.inl +++ b/TAO/tao/Transport_Cache_Manager.inl @@ -51,10 +51,11 @@ TAO_Transport_Cache_Manager::purge (void) ACE_INLINE int TAO_Transport_Cache_Manager::purge_entry (HASH_MAP_ENTRY *&entry) { - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, - guard, - *this->cache_lock_, - -1)); + // Double checked locking + if(entry == 0) + return 0; + + ACE_MT (ACE_GUARD_RETURN (ACE_Lock, guard, *this->cache_lock_, -1)); return this->purge_entry_i (entry); } @@ -62,9 +63,11 @@ TAO_Transport_Cache_Manager::purge_entry (HASH_MAP_ENTRY *&entry) ACE_INLINE void TAO_Transport_Cache_Manager::mark_invalid (HASH_MAP_ENTRY *&entry) { - ACE_MT (ACE_GUARD (ACE_Lock, - guard, - *this->cache_lock_)); + if(entry == 0) + return; + + // Double checked locking + ACE_MT (ACE_GUARD (ACE_Lock, guard, *this->cache_lock_)); this->mark_invalid_i (entry); } @@ -74,10 +77,10 @@ TAO_Transport_Cache_Manager::mark_invalid (HASH_MAP_ENTRY *&entry) ACE_INLINE int TAO_Transport_Cache_Manager::make_idle (HASH_MAP_ENTRY *&entry) { - ACE_MT (ACE_GUARD_RETURN (ACE_Lock, - guard, - *this->cache_lock_, - -1)); + if(entry == 0) + return -1; + + ACE_MT (ACE_GUARD_RETURN (ACE_Lock, guard, *this->cache_lock_, -1)); return this->make_idle_i (entry); } |