summaryrefslogtreecommitdiff
path: root/TAO
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-06-08 23:46:15 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-06-08 23:46:15 +0000
commit6046d7736ee24e64b9ccbab3b1b6460ed6455194 (patch)
tree2f11dc99ec83fc8c147d954990c46edd5723d20b /TAO
parent5de2810d4373e5388e821c2f3ec75d69fd670a9a (diff)
downloadATCD-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-99c7
-rw-r--r--TAO/tao/POA.cpp11
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);