diff options
author | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-01-06 05:45:33 +0000 |
---|---|---|
committer | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-01-06 05:45:33 +0000 |
commit | 040e7b7c861701668ccfbd7d93ac48d63c165594 (patch) | |
tree | 68d94dfa3e82cb54a69cec4c19e48cfca73a7d88 | |
parent | e41359dad83f395022dd4b87df3919eab7373fd4 (diff) | |
download | ATCD-040e7b7c861701668ccfbd7d93ac48d63c165594.tar.gz |
*** empty log message ***
-rw-r--r-- | ChangeLog-98b | 13 | ||||
-rw-r--r-- | ace/Strategies_T.cpp | 8 |
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; } |