summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-01-06 05:45:33 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-01-06 05:45:33 +0000
commit040e7b7c861701668ccfbd7d93ac48d63c165594 (patch)
tree68d94dfa3e82cb54a69cec4c19e48cfca73a7d88
parente41359dad83f395022dd4b87df3919eab7373fd4 (diff)
downloadATCD-040e7b7c861701668ccfbd7d93ac48d63c165594.tar.gz
*** empty log message ***
-rw-r--r--ChangeLog-98b13
-rw-r--r--ace/Strategies_T.cpp8
2 files changed, 20 insertions, 1 deletions
diff --git a/ChangeLog-98b b/ChangeLog-98b
index a4e920a09b9..b4e833cd394 100644
--- a/ChangeLog-98b
+++ b/ChangeLog-98b
@@ -1,3 +1,16 @@
+Tue Jan 05 22:55:07 1999 Irfan Pyarali <irfan@cs.wustl.edu>
+
+ * ace/Strategies_T.cpp (cleanup_hint_i and check_hint_i): Since we
+ are holding the connection cache lock in these methods, the
+ Svc_Handler should not call purge(). If it does, a deadlock
+ will occur (unless we have recursive locks) since we are already
+ the connection cache lock. Therefore, we zero out the recycler
+ before calling svc_handler->close() and purge out the
+ svc_handler entry ourself (through purge_i()).
+
+ Thanks to Mark L. Boriack <mboriack@std.saic.com> for providing
+ a precise example illustrating this bug.
+
Tue Jan 5 18:48:47 James CE Johnson <jcej@lads.com>
* docs/tutorials/templates.html:
diff --git a/ace/Strategies_T.cpp b/ace/Strategies_T.cpp
index 5337a47e56c..79f23090f06 100644
--- a/ace/Strategies_T.cpp
+++ b/ace/Strategies_T.cpp
@@ -481,6 +481,8 @@ ACE_Cached_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2, MUTEX>::check_hin
if (possible_entry->ext_id_.decrement () == 0)
{
// If refcount goes to zero, close down the svc_handler
+ possible_entry->int_id_->recycler (0, 0);
+ this->purge_i (possible_entry);
possible_entry->int_id_->close ();
}
@@ -762,7 +764,11 @@ ACE_Cached_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2, MUTEX>::cleanup_h
// close() on svc_handler.
if (entry->ext_id_.state () == ACE_Recyclable::CLOSED &&
refcount == 0)
- entry->int_id_->close ();
+ {
+ entry->int_id_->recycler (0, 0);
+ this->purge_i (entry);
+ entry->int_id_->close ();
+ }
return 0;
}