summaryrefslogtreecommitdiff
path: root/TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp')
-rw-r--r--TAO/tests/NestedUpcall/MT_Client_Test/local_server.cpp302
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;
+}