diff options
Diffstat (limited to 'TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp')
-rw-r--r-- | TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp b/TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp new file mode 100644 index 00000000000..36e81ffa7c3 --- /dev/null +++ b/TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp @@ -0,0 +1,302 @@ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// TAO/tests/NestedUpCalls/MT_Client_Test +// +// = FILENAME +// local_server.cpp +// +// = DESCRIPTION +// This server will run the ORB briefly and then make +// several calls on the distant MT Object. +// +// = AUTHORS +// Michael Kircher +// +// ============================================================================ + +#include "local_server.h" +#include "tao/debug.h" +#include "ace/Read_Buffer.h" +#include "ace/OS_NS_unistd.h" +#include "ace/OS_NS_fcntl.h" +#include "tao/Utils/ORB_Manager.h" + +ACE_RCSID(MT_Client_Test, local_server, "$Id$") + +MT_Server_Task::MT_Server_Task (ACE_Thread_Manager* thr_mgr_ptr, + int argc, + char **argv, + TAO_ORB_Manager* orb_manager_ptr) + :ACE_Task<ACE_SYNCH> (thr_mgr_ptr), + argc_ (argc), + argv_ (argv), + orb_manager_ptr_ (orb_manager_ptr) +{ +} + +int +MT_Server_Task::svc (void) +{ + if (this->mT_Server_.init (this->argc_, + this->argv_, + this->orb_manager_ptr_) == -1) + return 1; + else + return this->mT_Server_.run_ORB_briefly (); +} + + +MT_Server::MT_Server () + : object_key_ (0), + ior_output_file_ (0), + orb_manager_ptr_ (0), + iterations_ (1) +{ +} + +// Reads the MT Object IOR from a file +int +MT_Server::read_ior (char *filename) +{ + // Open the file for reading. + ACE_HANDLE f_handle = ACE_OS::open (filename,0); + + if (f_handle == ACE_INVALID_HANDLE) + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to open %s for reading: %p\n", + filename), + -1); + + ACE_Read_Buffer ior_buffer (f_handle); + + this->object_key_ = ior_buffer.read (); + if (this->object_key_ == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to allocate memory to read ior: %p\n"), + -1); + + ACE_OS::close (f_handle); + return 0; +} + + + +int +MT_Server::parse_args (void) +{ + ACE_Get_Opt get_opts (argc_, argv_, "d:f:g:h:i:n:s:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'd': // debug flag. + TAO_debug_level++; + break; + case 'h': // read the IOR from the file. + int result; + result = this->read_ior (get_opts.opt_arg ()); + // read IOR for MT Object + if (result < 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to read ior from %s : %p\n", + get_opts.opt_arg ()), + -1); + break; + case 'f': + case 'g': + case 'i': + case 'n': + break; + case 's': this->iterations_ = atoi (get_opts.opt_arg ()); + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s" + " [-d]\n" + " [-f] first server ior file\n" + " [-g] second server ior file\n" + " [-h] third server ior file\n" + " [-i] client iterations\n" + " [-n] number of client threads\n" + " [-s] number of server iterations\n" + "\n", + argv_ [0]), + -1); + } + + // Indicates successful parsing of command line. + return 0; +} + +int +MT_Server::init (int argc, + char** argv, + TAO_ORB_Manager* orb_manager_ptr) +{ + this->argc_ = argc; + this->argv_ = argv; + if ((this->orb_manager_ptr_ = orb_manager_ptr) == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "MT_Server::init: ORB_Manager is nil!\n"), + -1); + + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + // Call the init of TAO_ORB_Manager to create a child POA + // under the root POA. + this->orb_manager_ptr_->init_child_poa (argc, + argv, + "child_poa" + ACE_ENV_ARG_PARAMETER); + + ACE_TRY_CHECK; + + this->parse_args (); + // ~~ check for the return value here + + this->str_ = + this->orb_manager_ptr_->activate_under_child_poa ("MT", + &this->mT_Object_i_ + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + +#if 0 + ACE_DEBUG ((LM_DEBUG, + "The IOR is: <%s>\n", + this->str_.in ())); +#endif /*if 0*/ + + if (this->ior_output_file_) + { + ACE_OS::fprintf (this->ior_output_file_, + "%s", + this->str_.in ()); + ACE_OS::fclose (this->ior_output_file_); + } + + // retrieve the object reference to the distant mt object + if (this->object_key_ == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "The IOR is nil, not able to get the object.\n"), + -1); + + CORBA::ORB_var orb_var = this->orb_manager_ptr_->orb (); + + CORBA::Object_var object_var = + orb_var->string_to_object (this->object_key_ + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (object_var.in())) + ACE_ERROR_RETURN ((LM_ERROR, + "No proper object has been returned.\n"), + -1); + + this->mT_Object_var_ = MT_Object::_narrow (object_var.in() + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (this->mT_Object_var_.in())) + { + ACE_ERROR_RETURN ((LM_ERROR, + "We have no proper reference to the Object.\n"), + -1); + } + + if (TAO_debug_level > 0) + ACE_DEBUG ((LM_DEBUG, "We have a proper reference to the Object.\n")); + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MT_Client::init"); + return -1; + } + ACE_ENDTRY; + + return 0; +} + +int +MT_Server::run () +{ + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + int r = this->orb_manager_ptr_->run (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (r == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "MT_Server::run"), + -1); + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MT_Server::run"); + return -1; + } + ACE_ENDTRY; + return 0; +} + +MT_Server::~MT_Server (void) +{ + if (this->object_key_ != 0) + ACE_OS::free (this->object_key_); + + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + if (this->orb_manager_ptr_) + this->orb_manager_ptr_->deactivate_under_child_poa (this->str_.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MT_Client::~MT_Client"); + } + ACE_ENDTRY; +} + + +int +MT_Server::run_ORB_briefly (void) +{ + if (this->iterations_ > 0) + { + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + ACE_DEBUG ((LM_DEBUG, + "(%P|%t) MT_Server::run: " + "going to call distant MT Object\n")); + + for (unsigned int i = 0; i < this->iterations_; i++) + { + MT_Object_var tmp = + this->mT_Object_i_._this (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + this->mT_Object_var_->yadda (0, + tmp.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, + "MT_Server::run_ORB_briefly"); + return -1; + } + ACE_ENDTRY; + } + return 0; +} |