diff options
author | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-06-08 23:46:15 +0000 |
---|---|---|
committer | irfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-06-08 23:46:15 +0000 |
commit | 6046d7736ee24e64b9ccbab3b1b6460ed6455194 (patch) | |
tree | 2f11dc99ec83fc8c147d954990c46edd5723d20b /TAO | |
parent | 5de2810d4373e5388e821c2f3ec75d69fd670a9a (diff) | |
download | ATCD-6046d7736ee24e64b9ccbab3b1b6460ed6455194.tar.gz |
Tue Jun 08 18:17:38 1999 Irfan Pyarali <irfan@cs.wustl.edu>
Diffstat (limited to 'TAO')
-rw-r--r-- | TAO/ChangeLog-99c | 7 | ||||
-rw-r--r-- | TAO/tao/POA.cpp | 11 |
2 files changed, 17 insertions, 1 deletions
diff --git a/TAO/ChangeLog-99c b/TAO/ChangeLog-99c index aed43bda2df..423f74fe8c1 100644 --- a/TAO/ChangeLog-99c +++ b/TAO/ChangeLog-99c @@ -1,4 +1,9 @@ -Tue Jun 08 18:06:43 1999 Irfan Pyarali <irfan@cs.wustl.edu> +Tue Jun 08 18:17:38 1999 Irfan Pyarali <irfan@cs.wustl.edu> + + * tao/POA.cpp (find_POA): Must release the Object Adapter lock + before calling the Adapter Activators which may call back into + the POA (create_POA) causing a deadlock. Thanks to Carlos for + pointing this out. * performance-tests/POA/Object_Creation_And_Registration/svc.conf: Changed ORBTableSize to ORBActiveObjectMapSize. Also, removed diff --git a/TAO/tao/POA.cpp b/TAO/tao/POA.cpp index 605d225a281..79925667d4b 100644 --- a/TAO/tao/POA.cpp +++ b/TAO/tao/POA.cpp @@ -280,6 +280,17 @@ TAO_POA::find_POA (const char *adapter_name, // Lock access for the duration of this transaction. TAO_POA_GUARD_RETURN (ACE_Lock, monitor, this->lock (), 0, ACE_TRY_ENV); + // A recursive thread lock without using a recursive thread + // lock. Non_Servant_Upcall has a magic constructor and + // destructor. We unlock the Object_Adapter lock for the + // duration of the servant activator upcalls; reacquiring + // once the upcalls complete. Even though we are releasing + // the lock, other threads will not be able to make progress + // since <Object_Adapter::non_servant_upcall_in_progress_> + // has been set. + TAO_Object_Adapter::Non_Servant_Upcall non_servant_upcall (*this->orb_core_.object_adapter ()); + ACE_UNUSED_ARG (non_servant_upcall); + TAO_POA *child = this->find_POA_i (adapter_name, activate_it, ACE_TRY_ENV); |