summaryrefslogtreecommitdiff
path: root/TAO/performance-tests/Cubit/TAO/MT_Cubit/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/performance-tests/Cubit/TAO/MT_Cubit/server.cpp')
-rw-r--r--TAO/performance-tests/Cubit/TAO/MT_Cubit/server.cpp691
1 files changed, 0 insertions, 691 deletions
diff --git a/TAO/performance-tests/Cubit/TAO/MT_Cubit/server.cpp b/TAO/performance-tests/Cubit/TAO/MT_Cubit/server.cpp
deleted file mode 100644
index 0e7b12bb461..00000000000
--- a/TAO/performance-tests/Cubit/TAO/MT_Cubit/server.cpp
+++ /dev/null
@@ -1,691 +0,0 @@
-// $Id$
-
-// ============================================================================
-//
-// = LIBRARY
-// TAO/tests
-//
-// = FILENAME
-// server.cpp
-//
-// = AUTHOR
-// Andy Gokhale, Sumedh Mungee, and Sergio Flores-Gaitan
-//
-// ============================================================================
-
-#include "server.h"
-#include "ace/Sched_Params.h"
-
-#if defined (ACE_QUANTIFY)
-#include "quantify.h"
-#endif /* ACE_QUANTIFY */
-
-// Global options used to configure various parameters.
-static char hostname[BUFSIZ];
-static char *ior_file = 0;
-static int base_port = ACE_DEFAULT_SERVER_PORT;
-static int num_of_objs = 2;
-static u_int use_name_service = 1;
-static u_int thread_per_rate = 0;
-
-Cubit_Task::Cubit_Task (void)
-{
- // No-op.
-}
-
-Cubit_Task::Cubit_Task (const char *args,
- const char *orbname,
- u_int num_of_objs,
- ACE_Barrier *barrier,
- u_int task_id)
- : key_ ("Cubit"),
- orbname_ ((char *) orbname),
- orbargs_ ((char *) args),
- num_of_objs_ (num_of_objs),
- servants_ (0),
- barrier_ (barrier),
- servants_iors_ (0),
- task_id_ (task_id)
-{
-}
-
-int
-Cubit_Task::svc (void)
-{
- ACE_DEBUG ((LM_DEBUG,
- "(%P|%t) Beginning Cubit task with args = '%s'\n",
- orbargs_));
-
- int rc = this->initialize_orb ();
- if (rc == -1)
- ACE_ERROR_RETURN ((LM_ERROR,
- "ORB initialization failed.\n"),
- -1);
-
- rc = this->create_servants ();
- if (rc == -1)
- ACE_ERROR_RETURN ((LM_ERROR,
- "Create Servants failed.\n"),
- -1);
-
- TAO_TRY
- {
- this->poa_manager_->activate (TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- this->barrier_->wait ();
-
- // Handle requests for this object until we're killed, or one of
- // the methods asks us to exit.
- if (this->orb_->run () == -1)
- ACE_ERROR_RETURN ((LM_ERROR,
- "%p\n",
- "run"),
- -1);
-
- // Shut down the OA.
- this->poa_->destroy (CORBA::B_TRUE,
- CORBA::B_TRUE,
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
- }
- TAO_CATCHANY
- {
- TAO_TRY_ENV.print_exception ("poa->destroy()");
- }
- TAO_ENDTRY;
-
- // Need to clean up and do a CORBA::release on everything we've
- // created!
-
- for (u_int i = 0; i < num_of_objs_; i++)
- delete servants_ [i];
-
- return 0;
-}
-
-int
-Cubit_Task::initialize_orb (void)
-{
- TAO_TRY
- {
- ACE_ARGV args (this->orbargs_);
-
- int argc = args.argc ();
- char **argv = args.argv ();
-
- // Initialize the ORB.
- this->orb_ = CORBA::ORB_init (argc,
- argv,
- this->orbname_,
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- // Initialize the Object Adapter.
- CORBA::Object_var poa_object =
- this->orb_->resolve_initial_references("RootPOA");
- if (CORBA::is_nil (poa_object.in ()))
- ACE_ERROR_RETURN ((LM_ERROR,
- " (%P|%t) Unable to initialize the POA.\n"),
- 1);
-
- this->root_poa_ =
- PortableServer::POA::_narrow (poa_object.in(),
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- this->poa_manager_ =
- this->root_poa_->the_POAManager (TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- CORBA::PolicyList policies (2);
- policies.length (2);
-
- // Id Assignment policy
- policies[0] =
- this->root_poa_->create_id_assignment_policy (PortableServer::USER_ID,
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- // Lifespan policy
- policies[1] =
- this->root_poa_->create_lifespan_policy (PortableServer::PERSISTENT,
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- // We use a different POA, otherwise the user would have to
- // change the object key each time it invokes the server.
- this->poa_ =
- this->root_poa_->create_POA ("Persistent_POA",
- this->poa_manager_.in (),
- policies,
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- // Creation of the new POAs over, so destroy the Policy_ptr's.
- for (CORBA::ULong i = 0;
- i < policies.length () && TAO_TRY_ENV.exception () == 0;
- ++i)
- {
- CORBA::Policy_ptr policy = policies[i];
- policy->destroy (TAO_TRY_ENV);
- }
- TAO_CHECK_ENV;
-
- if (use_name_service == 0)
- return 0;
-
- CORBA::Object_var naming_obj =
- this->orb_->resolve_initial_references ("NameService");
- if (CORBA::is_nil (naming_obj.in ()))
- ACE_ERROR_RETURN ((LM_ERROR,
- " (%P|%t) Unable to resolve the Name Service.\n"),
- 1);
-
- this->naming_context_ =
- CosNaming::NamingContext::_narrow (naming_obj.in (),
- TAO_TRY_ENV);
-
- // Check the environment and return 1 if exception occurred or
- // nil pointer.
- if (TAO_TRY_ENV.exception () != 0 ||
- CORBA::is_nil (this->naming_context_.in ())==CORBA::B_TRUE )
- return 1;
-
- // Register the servant with the Naming Context....
- CosNaming::Name cubit_context_name (1);
- cubit_context_name.length (1);
- cubit_context_name[0].id =
- CORBA::string_dup ("MT_Cubit");
-
- TAO_TRY_ENV.clear ();
- CORBA::Object_var objref =
- this->naming_context_->bind_new_context (cubit_context_name,
- TAO_TRY_ENV);
-
- if (TAO_TRY_ENV.exception() != 0)
- {
- CosNaming::NamingContext::AlreadyBound_ptr ex =
- CosNaming::NamingContext::AlreadyBound::_narrow (TAO_TRY_ENV.exception());
- if (ex != 0)
- {
- TAO_TRY_ENV.clear ();
- objref = this->naming_context_->resolve (cubit_context_name,
- TAO_TRY_ENV);
- printf("NamingContext::AlreadyBound\n");
- }
- else
- TAO_TRY_ENV.print_exception ("bind() Cubit context object\n");
- }
- TAO_CHECK_ENV;
-
- this->mt_cubit_context_ =
- CosNaming::NamingContext::_narrow (objref.in (),
- TAO_TRY_ENV);
-
- TAO_CHECK_ENV;
- }
- TAO_CATCHANY
- {
- TAO_TRY_ENV.print_exception ("orb_init");
- return -1;
- }
- TAO_ENDTRY;
-
- return 0;
-}
-
-CORBA::String
-Cubit_Task::get_servant_ior (u_int index)
-{
- if (index >= num_of_objs_)
- return 0;
-
- return ACE_OS::strdup (this->servants_iors_[index]);
-}
-
-int
-Cubit_Task::create_servants ()
-{
- TAO_TRY
- {
- // Create the array of cubit implementations.
- ACE_NEW_RETURN (this->servants_,
- Cubit_i *[this->num_of_objs_],
- -1);
-
- // Create the array of strings.
- ACE_NEW_RETURN (this->servants_iors_,
- CORBA::String [this->num_of_objs_],
- -1);
-
- char *buffer;
- int l = ACE_OS::strlen (this->key_) + 3;
-
- ACE_NEW_RETURN (buffer,
- char[l],
- -1);
-
- // This loop creates multiple servants, and prints out their
- // IORs.
- for (u_int i = 0;
- i < this->num_of_objs_;
- i++)
- {
- ACE_OS::sprintf (buffer,
- "%s%02d",
- (char *) this->key_,
- this->task_id_);
-
- PortableServer::ObjectId_var id =
- PortableServer::string_to_ObjectId (buffer);
-
- ACE_NEW_RETURN (this->servants_[i],
- Cubit_i,
- -1);
-
- if (this->servants_[i] == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- " (%P|%t) Unable to create "
- "implementation object #%d\n",
- i),
- 2);
-
- this->poa_->activate_object_with_id (id.in (),
- this->servants_[i],
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- // Stringify the objref we'll be implementing, and print it
- // to stdout. Someone will take that string and give it to
- // some client. Then release the object.
-
- Cubit_var cubit =
- this->servants_[i]->_this (TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- CORBA::String_var str =
- this->orb_->object_to_string (cubit.in (),
- TAO_TRY_ENV);
- TAO_CHECK_ENV;
-
- this->servants_iors_[i] = ACE_OS::strdup (str.in ());
-
- // Register the servant with the Naming Context....
- CosNaming::Name cubit_name (1);
- cubit_name.length (1);
- cubit_name[0].id =
- CORBA::string_dup (buffer);
-
- if (CORBA::is_nil (this->mt_cubit_context_.in ()) == CORBA::B_FALSE)
- {
- this->mt_cubit_context_->bind (cubit_name,
- cubit.in (),
- TAO_TRY_ENV);
- if (TAO_TRY_ENV.exception () != 0)
- TAO_TRY_ENV.print_exception ("Attempt to bind() a cubit object to the name service Failed!\n");
- else
- ACE_DEBUG ((LM_DEBUG,
- " (%t) Cubit object bound to the name \"%s\".\n",
- buffer));
- }
-
-#if 0 /* The IOR gets printout out later, so we don't need this. */
- ACE_DEBUG ((LM_DEBUG,
- " (%t) Object <%s> created\n",
- this->servants_iors_[i]));
-#endif /* 0 */
- }
- delete [] buffer;
- }
- TAO_CATCHANY
- {
- TAO_TRY_ENV.print_exception ("print IOR");
- return -1;
- }
- TAO_ENDTRY;
- return 0;
-}
-
-// Parses the command line arguments and returns an error status.
-// @@ This method should be integrated into one of the classes
-// (preferably into an Options singleton) rather than kept as a
-// stand-alone function.
-
-static int
-parse_args (int argc, char *argv[])
-{
- ACE_Get_Opt opts (argc, argv, "sh:p:t:f:r");
- int c;
-
- if (ACE_OS::hostname (hostname, BUFSIZ) != 0)
- {
- perror ("gethostname");
- return -1;
- }
-
- while ((c = opts ()) != -1)
- switch (c)
- {
- case 'r':
- thread_per_rate = 1;
- break;
- case 's':
- use_name_service = 0;
- break;
- case 'f':
- ior_file = opts.optarg;
- break;
- case 'h':
- ACE_OS::strcpy (hostname, opts.optarg);
- ACE_DEBUG ((LM_DEBUG, "h\n"));
- break;
- case 'p':
- base_port = ACE_OS::atoi (opts.optarg);
- ACE_DEBUG ((LM_DEBUG, "p\n"));
- break;
- case 't':
- num_of_objs = ACE_OS::atoi (opts.optarg);
- break;
- case '?':
- default:
- ACE_ERROR_RETURN ((LM_ERROR,
- "usage: %s"
- " [-s Means NOT to use the name service] "
- " [-p <port>]"
- " [-h <my_hostname>]"
- " [-t <num_objects>]"
- " [-f <ior_file>]"
- " [-r Use thread per rate]"
- "\n", argv [0]),
- 1);
- }
-
- if (thread_per_rate == 1)
- num_of_objs = 5;
-
- // Indicates successful parsing of command line
- return 0;
-}
-
-// @@ This method should be integrated into one of the classes rather
-// than kept as a stand-alone function.
-
-static int
-initialize (int argc, char **argv)
-{
-#if defined (VXWORKS)
-#if defined (VME_DRIVER)
- STATUS status = vmeDrv ();
-
- if (status != OK)
- printf ("ERROR on call to vmeDrv()\n");
-
- status = vmeDevCreate ("/vme");
-
- if (status != OK)
- printf ("ERROR on call to vmeDevCreate()\n");
-#endif /* defined (VME_DRIVER) */
-
-#if defined (FORCE_ARGS)
- int argc = 4;
- char *argv[] = { "server",
- "-s",
- "-f",
- "ior.txt" };
-
-#endif /* defined (FORCE_ARGS) */
-#endif /* defined (VXWORKS) */
-
- // Standard command line parsing utilities used.
- if (parse_args (argc, argv) != 0) return 1;
-
- if (hostname == 0 || base_port == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "usage: %s"
- " [-s Means NOT to use the name service] "
- " [-p port]"
- " [-h my_hostname]"
- " [-t num_objects]"
- " [-f <ior_file>]"
- " [-r Use thread per rate]"
- "\n", argv [0]),
- 1);
-
- // Make sure we've got plenty of socket handles. This call will use
- // the default maximum.
- ACE::set_handle_limit ();
-
- return 0;
-}
-
-// Starts up the servants
-
-// @@ This method should be integrated into one of the classes rather
-// than kept as a stand-alone function.
-
-static int
-start_servants (ACE_Barrier &start_barrier)
-{
- char *args1;
-
- ACE_NEW_RETURN (args1,
- char[BUFSIZ],
- -1);
- int i;
-
- // Create an array to hold pointers to the Cubit objects.
- CORBA::String *cubits;
-
- ACE_NEW_RETURN (cubits,
- CORBA::String [num_of_objs],
- -1);
-
- ACE_OS::sprintf (args1,
- "rate20 -ORBport %d "
- "-ORBhost %s "
- "-ORBobjrefstyle URL "
- "-ORBsndsock 32768 "
- "-ORBrcvsock 32768 ",
- base_port,
- hostname);
-
- Cubit_Task *high_priority_task;
-
- ACE_NEW_RETURN (high_priority_task,
- Cubit_Task (args1,
- "internet",
- 1,
- &start_barrier,
- 0), //task id 0.
- -1);
-
-#if defined (VXWORKS)
- ACE_Sched_Priority priority = ACE_THR_PRI_FIFO_DEF;
-#elif defined (ACE_WIN32)
- ACE_Sched_Priority priority = ACE_Sched_Params::priority_max (ACE_SCHED_FIFO,
- ACE_SCOPE_THREAD);
-#else
- ACE_Sched_Priority priority = ACE_THR_PRI_FIFO_DEF + 25;
-#endif /* VXWORKS */
-
- ACE_DEBUG ((LM_DEBUG,
- "Creating servant with high priority %d\n",
- priority));
-
- // Make the high priority task an active object.
- if (high_priority_task->activate (THR_BOUND | ACE_SCHED_FIFO,
- 1,
- 0,
- priority) == -1)
- {
- ACE_ERROR ((LM_ERROR, "(%P|%t) %p\n",
- "high_priority_task->activate"));
- }
-
- // Create an array to hold pointers to the low priority tasks.
- Cubit_Task **low_priority_task;
-
- ACE_NEW_RETURN (low_priority_task,
- Cubit_Task *[num_of_objs],
- -1);
-
- // Drop the priority
- priority = ACE_Sched_Params::previous_priority (ACE_SCHED_FIFO,
- priority,
- ACE_SCOPE_THREAD);
-
- ACE_DEBUG ((LM_DEBUG,
- "Creating %d servants with priority %d\n",
- num_of_objs - 1,
- priority));
-
- // Create the low priority servants.
-
- for (i = num_of_objs - 2; i >= 0; i--)
- {
- char *args;
-
- ACE_NEW_RETURN (args,
- char [BUFSIZ],
- -1);
-
- ACE_OS::sprintf (args,
- "rate10 -ORBport %d "
- "-ORBhost %s "
- "-ORBobjrefstyle URL "
- "-ORBsndsock 32768 "
- "-ORBrcvsock 32768 ",
- base_port + 1 + i,
- hostname);
-
- ACE_NEW_RETURN (low_priority_task [i],
- Cubit_Task (args, "internet", 1, &start_barrier, i+1),
- -1);
-
- // Make the low priority task an active object.
- if (low_priority_task [i]->activate (THR_BOUND | ACE_SCHED_FIFO,
- 1,
- 0,
- priority) == -1)
- {
- ACE_ERROR ((LM_ERROR, "(%P|%t; %p\n",
- "low_priority_task[i]->activate"));
- }
-
- // use different priorities on thread per rate.
- if (thread_per_rate == 1)
- priority = ACE_Sched_Params::previous_priority (ACE_SCHED_FIFO,
- priority,
- ACE_SCOPE_THREAD);
-
- ACE_DEBUG ((LM_DEBUG,
- "Created servant %d\n",
- i));
-
- }
-
- start_barrier.wait ();
-
-
- // Write the ior's to a file so the client can read them.
- {
- cubits[0] = high_priority_task->get_servant_ior (0);
-
- for (i = 0; i < num_of_objs-1; ++i)
- cubits[i + 1] = low_priority_task[i]->get_servant_ior (0);
-
- FILE *ior_f = 0;
-
- if (ior_file != 0)
- ior_f = ACE_OS::fopen (ior_file, "w+");
-
- for (i = 0; i < num_of_objs; ++i)
- {
- if (ior_f != 0)
- {
- ACE_OS::fprintf (ior_f, "%s\n", cubits[i]);
- }
- ACE_OS::printf ("cubits[%d] ior = %s\n",
- i,
- cubits[i]);
- }
-
- if (ior_f != 0)
- ACE_OS::fclose (ior_f);
- }
- return 0;
-}
-
-// main routine.
-
-#if defined (VXWORKS)
- // Rename main to server to make it easier to run both client and
- // server on one target.
-extern "C"
-int
-server (int argc, char *argv[])
-{
- ACE_Object_Manager ace_object_manager;
-#else
-int
-main (int argc, char *argv[])
-{
-#endif
-
-#if defined (ACE_HAS_THREADS)
- // Enable FIFO scheduling, e.g., RT scheduling class on Solaris.
- if (ACE_OS::sched_params (
- ACE_Sched_Params (
- ACE_SCHED_FIFO,
-#if defined (__Lynx__)
- 30,
-#else /* ! __Lynx__ */
- ACE_THR_PRI_FIFO_DEF, //ACE_Sched_Params::priority_min (ACE_SCHED_FIFO),
-#endif /* ! __Lynx__ */
- ACE_SCOPE_PROCESS)) != 0)
- {
- if (ACE_OS::last_error () == EPERM)
- ACE_DEBUG ((LM_MAX, "preempt: user is not superuser, "
- "so remain in time-sharing class\n"));
- else
- ACE_ERROR_RETURN ((LM_ERROR, "%n: ACE_OS::sched_params failed\n%a"),
- -1);
- }
-
- if (initialize (argc, argv) != 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "Error in Initialization\n"),
- 1);
-
- // Barrier for the multiple clients to synchronize after binding to
- // the servants.
- ACE_Barrier start_barrier (num_of_objs + 1);
-
- if (start_servants (start_barrier) != 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "Error creating the servants\n"),
- 1);
-
- ACE_DEBUG ((LM_DEBUG,
- "Wait for all the threads to exit\n"));
-
-#if defined (ACE_QUANTIFY)
- quantify_stop_recording_data();
- quantify_clear_data ();
- quantify_start_recording_data();
-#endif /* ACE_QUANTIFY */
-
- // Wait for all the threads to exit.
- ACE_Thread_Manager::instance ()->wait ();
-
-#if defined (ACE_QUANTIFY)
- quantify_stop_recording_data();
-#endif /* ACE_QUANTIFY */
-
-#else
- ACE_DEBUG ((LM_DEBUG,
- "Test not run. This platform doesn't seem to have threads.\n"));
-#endif /* ACE_HAS_THREADS */
- return 0;
-}