diff options
Diffstat (limited to 'TAO/tao/PortableServer/POA_Guard.cpp')
-rw-r--r-- | TAO/tao/PortableServer/POA_Guard.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/TAO/tao/PortableServer/POA_Guard.cpp b/TAO/tao/PortableServer/POA_Guard.cpp new file mode 100644 index 00000000000..a2943714015 --- /dev/null +++ b/TAO/tao/PortableServer/POA_Guard.cpp @@ -0,0 +1,49 @@ +// $Id$ + +#include "tao/PortableServer/POA_Guard.h" +#include "tao/PortableServer/Root_POA.h" +#include "tao/ORB_Constants.h" + +ACE_RCSID(PortableServer, + POA_Guard, + "$Id$") + + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +namespace TAO +{ + namespace Portable_Server + { + POA_Guard::POA_Guard (::TAO_Root_POA &poa + ACE_ENV_ARG_DECL, + int check_for_destruction) + : guard_ (poa.lock ()) + { + if (!this->guard_.locked ()) + ACE_THROW ( + CORBA::INTERNAL ( + CORBA::SystemException::_tao_minor_code ( + TAO_GUARD_FAILURE, + 0), + CORBA::COMPLETED_NO)); + + // Check if a non-servant upcall is in progress. If a non-servant + // upcall is in progress, wait for it to complete. Unless of + // course, the thread making the non-servant upcall is this thread. + poa.object_adapter ().wait_for_non_servant_upcalls_to_complete (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + if (check_for_destruction && + poa.cleanup_in_progress ()) + ACE_THROW ( + CORBA::BAD_INV_ORDER ( + CORBA::SystemException::_tao_minor_code ( + TAO_POA_BEING_DESTROYED, + 0), + CORBA::COMPLETED_NO)); + } + } +} + +TAO_END_VERSIONED_NAMESPACE_DECL |