summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/ImplRepo_Service/Activator_Loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/ImplRepo_Service/Activator_Loader.cpp')
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/Activator_Loader.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/TAO/orbsvcs/ImplRepo_Service/Activator_Loader.cpp b/TAO/orbsvcs/ImplRepo_Service/Activator_Loader.cpp
new file mode 100644
index 00000000000..6ff03887158
--- /dev/null
+++ b/TAO/orbsvcs/ImplRepo_Service/Activator_Loader.cpp
@@ -0,0 +1,119 @@
+// $Id$
+
+#include "Activator_Loader.h"
+#include "ace/Dynamic_Service.h"
+#include "ace/Task.h"
+
+class ImR_Activator_ORB_Runner : public ACE_Task_Base
+{
+ ImR_Activator_Loader& service_;
+public:
+ ImR_Activator_ORB_Runner(ImR_Activator_Loader& service)
+ : service_(service)
+ {
+ }
+ virtual int svc()
+ {
+ // Block until service_.fini() calls orb->destroy()
+ this->service_.run();
+ return 0;
+ }
+};
+
+ImR_Activator_Loader::ImR_Activator_Loader(void)
+{
+}
+
+// For now, we will assume that it's sufficient to start
+// the service in its own thread. Later, if necessary, we
+// can add a command line option to allow the imr to use
+// the same orb as other tao services, however the imr
+// is currently written with the assumption that it's running
+// in its own orb.
+int
+ImR_Activator_Loader::init (int argc, ACE_TCHAR *argv[] ACE_ENV_ARG_DECL)
+{
+ ACE_TRY
+ {
+ int err = this->opts_.init(argc, argv);
+ if (err != 0)
+ return -1;
+
+ // Creates it's own internal orb, which we must run later
+ err = this->service_.init(this->opts_ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ if (err != 0)
+ return -1;
+
+ // Create a thread in which to run the service
+ ACE_ASSERT(this->runner_.get() == 0);
+ this->runner_.reset(new ImR_Activator_ORB_Runner(*this));
+ this->runner_->activate();
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+int
+ImR_Activator_Loader::fini (void)
+{
+ ACE_ASSERT(this->runner_.get() != 0);
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ int ret = this->service_.fini(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ this->runner_->wait();
+ this->runner_.reset(0);
+ return ret;
+ }
+ ACE_CATCHANY
+ {
+ return -1;
+ }
+ ACE_ENDTRY;
+ return -1;
+}
+
+CORBA::Object_ptr
+ImR_Activator_Loader::create_object (CORBA::ORB_ptr,
+ int,
+ ACE_TCHAR **
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ ACE_THROW_RETURN(CORBA::NO_IMPLEMENT(), CORBA::Object::_nil());
+}
+
+int
+ImR_Activator_Loader::run(void)
+{
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ return this->service_.run(ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHALL
+ {
+ ACE_ERROR((LM_ERROR, "Exception in ImR_Locator_ORB_Runner()\n"));
+ return -1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+ACE_FACTORY_DEFINE (Activator, ImR_Activator_Loader)
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+template class ACE_Dynamic_Service<ImR_Activator_Loader>;
+template class ACE_Auto_Ptr<ImR_Activator_ORB_Runner>;
+#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+#pragma instantiate ACE_Dynamic_Service<ImR_Activator_Loader>
+#pragma instantiate ACE_Auto_Ptr<ImR_Activator_ORB_Runner>
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */