00001 // Locator_Loader.cpp,v 1.5 2006/03/16 15:53:35 sjiang Exp 00002 00003 #include "Locator_Loader.h" 00004 #include "ace/Dynamic_Service.h" 00005 #include "ace/Task.h" 00006 00007 class ImR_Locator_ORB_Runner : public ACE_Task_Base 00008 { 00009 public: 00010 ImR_Locator_ORB_Runner (ImR_Locator_Loader& service) 00011 : service_ (service) 00012 { 00013 } 00014 virtual int svc () 00015 { 00016 // Block until service_.fini () calls orb->destroy () 00017 this->service_.run (); 00018 return 0; 00019 } 00020 private: 00021 ImR_Locator_Loader& service_; 00022 }; 00023 00024 ImR_Locator_Loader::ImR_Locator_Loader() 00025 { 00026 } 00027 00028 int 00029 ImR_Locator_Loader::init (int argc, ACE_TCHAR *argv[]) 00030 { 00031 ACE_DECLARE_NEW_CORBA_ENV; 00032 ACE_TRY 00033 { 00034 int err = this->opts_.init (argc, argv); 00035 if (err != 0) 00036 return -1; 00037 00038 err = this->service_.init (this->opts_ ACE_ENV_ARG_PARAMETER); 00039 ACE_TRY_CHECK; 00040 if (err != 0) 00041 return -1; 00042 00043 // Create a thread in which to run the service 00044 ACE_ASSERT(this->runner_.get () == 0); 00045 this->runner_.reset(new ImR_Locator_ORB_Runner (*this)); 00046 this->runner_->activate (); 00047 } 00048 ACE_CATCHANY 00049 { 00050 return -1; 00051 } 00052 ACE_ENDTRY; 00053 return 0; 00054 } 00055 00056 int 00057 ImR_Locator_Loader::fini (void) 00058 { 00059 ACE_ASSERT(this->runner_.get () != 0); 00060 ACE_DECLARE_NEW_CORBA_ENV; 00061 ACE_TRY 00062 { 00063 int ret = this->service_.fini (ACE_ENV_SINGLE_ARG_PARAMETER); 00064 ACE_TRY_CHECK; 00065 00066 this->runner_->wait (); 00067 this->runner_.reset (0); 00068 return ret; 00069 } 00070 ACE_CATCHANY 00071 { 00072 } 00073 ACE_ENDTRY; 00074 return -1; 00075 } 00076 00077 CORBA::Object_ptr 00078 ImR_Locator_Loader::create_object (CORBA::ORB_ptr, 00079 int, 00080 ACE_TCHAR** 00081 ACE_ENV_ARG_DECL) 00082 ACE_THROW_SPEC ((CORBA::SystemException)) 00083 { 00084 ACE_THROW_RETURN (CORBA::NO_IMPLEMENT(), CORBA::Object::_nil ()); 00085 } 00086 00087 int 00088 ImR_Locator_Loader::run(void) 00089 { 00090 ACE_DECLARE_NEW_CORBA_ENV; 00091 ACE_TRY 00092 { 00093 return this->service_.run (ACE_ENV_SINGLE_ARG_PARAMETER); 00094 ACE_TRY_CHECK; 00095 } 00096 ACE_CATCHALL 00097 { 00098 ACE_ERROR((LM_ERROR, "Exception in ImR_Locator_ORB_Runner ()\n")); 00099 return -1; 00100 } 00101 ACE_ENDTRY; 00102 } 00103 00104 00105 ACE_FACTORY_DEFINE (Locator, ImR_Locator_Loader)