summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbala <balanatarajan@users.noreply.github.com>2002-08-27 23:48:23 +0000
committerbala <balanatarajan@users.noreply.github.com>2002-08-27 23:48:23 +0000
commite0519ce4faa6102550e43c2c1951c12aadcf46e1 (patch)
tree8675c6774812eeb9101592f199e9e7a227ebe8f1
parentf05aab153dd58f80b67c6087eac1012529d0b58b (diff)
downloadATCD-e0519ce4faa6102550e43c2c1951c12aadcf46e1.tar.gz
ChangeLogTag: Tue Aug 27 18:31:53 2002 Balachandran Natarajan <bala@isis-server.vuse.vanderbilt.edu>
-rw-r--r--TAO/ChangeLog16
-rw-r--r--TAO/tao/Transport.cpp17
-rw-r--r--TAO/tao/Transport_Cache_Manager.cpp23
-rw-r--r--TAO/tao/Transport_Cache_Manager.inl25
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);
}