diff options
Diffstat (limited to 'TAO/performance-tests/RTCorba/Multiple_Endpoints/Orb_Per_Priority/server.cpp')
-rw-r--r-- | TAO/performance-tests/RTCorba/Multiple_Endpoints/Orb_Per_Priority/server.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/TAO/performance-tests/RTCorba/Multiple_Endpoints/Orb_Per_Priority/server.cpp b/TAO/performance-tests/RTCorba/Multiple_Endpoints/Orb_Per_Priority/server.cpp new file mode 100644 index 00000000000..c0f42a139b5 --- /dev/null +++ b/TAO/performance-tests/RTCorba/Multiple_Endpoints/Orb_Per_Priority/server.cpp @@ -0,0 +1,272 @@ +// $Id$ + +#include "test_i.h" +#include "tao/RTCORBA/RTCORBA.h" +#include "tao/RTCORBA/Priority_Mapping.h" +#include "tao/RTCORBA/Priority_Mapping_Manager.h" +#include "tao/Strategies/advanced_resource.h" +#include "ace/Get_Opt.h" +#include "ace/Task.h" +#include "ace/Sched_Params.h" +#include "ace/OS_NS_errno.h" + +ACE_RCSID(TPP, server, "$Id$") + +class Server : public ACE_Task_Base +{ + // = TITLE + // Run the server thread, which will create its own orb. + // + // = DESCRIPTION + // Use the ACE_Task_Base class to run the server threads. + // +public: + Server (void); + // ctor + + void set (Test_i *server, int priority, int argc, char *argv[]); + // Set the test attributes. + + // = The ACE_Task_Base methods.... + virtual int svc (void); + +private: + Test_i *server_; + + int priority_; + // Corba priority at which this thread is running. (This number is + // used for creating the name of the orb.) + + int argc_; + char *argv_[256]; +}; + +// **************************************************************** + +int nthreads = 0; +const int MAX_THREADS = 128; +Server servers[MAX_THREADS]; +int priorities[MAX_THREADS]; +const char *ior_output_file_base = "test.ior"; + +int +parse_args (int argc, char *argv[]) +{ + ACE_Get_Opt get_opts (argc, argv, "o:t:"); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'o': + ior_output_file_base = get_opts.opt_arg (); + break; + case 't': + if (nthreads < MAX_THREADS) + { + priorities[nthreads] = ACE_OS::atoi (get_opts.opt_arg ()); + nthreads++; + } + break; + case '?': + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s " + "-o <iorfile_base_name> " + "-t <priority>" + "\n", + argv [0]), + -1); + } + // Indicates sucessful parsing of the command line + return 0; +} + +int +main (int argc, char *argv[]) +{ + int policy = ACE_SCHED_FIFO; + int flags = THR_NEW_LWP|THR_JOINABLE|THR_SCHED_FIFO|THR_BOUND; + int priority = + ACE_Sched_Params::priority_max (policy); + + // Enable FIFO scheduling, e.g., RT scheduling class on Solaris. + if (ACE_OS::sched_params (ACE_Sched_Params (policy, + priority, + ACE_SCOPE_PROCESS)) != 0) + { + if (ACE_OS::last_error () == EPERM) + { + ACE_DEBUG ((LM_DEBUG, + "server (%P|%t): user is not superuser, " + "test runs in time-shared class\n")); + policy = ACE_SCHED_OTHER; + flags = THR_NEW_LWP|THR_JOINABLE|THR_SCHED_DEFAULT; + } + else + ACE_ERROR ((LM_ERROR, + "server (%P|%t): sched_params failed\n")); + } + + // Create a servant. + Test_i server_impl; + + // Create an ORB to obtain Priority Mapping functionality. + CORBA::ORB_var orb; + RTCORBA::PriorityMapping *pm = 0; + + try + { + char *argv_[256]; + int argc_ = argc; + for (int i = 0; i < argc; ++i) + argv_[i] = argv[i]; + orb = CORBA::ORB_init (argc_, argv_, ""); + + // Parse the arguments. + if (parse_args (argc_, argv_) != 0) + return 1; + + // Obtain Priority Mapping used by the ORB. + CORBA::Object_var object = + orb->resolve_initial_references ("PriorityMappingManager"); + + RTCORBA::PriorityMappingManager_var mapping_manager = + RTCORBA::PriorityMappingManager::_narrow (object.in ()); + + if (CORBA::is_nil (mapping_manager.in ())) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Priority Mapping Manager is nil\n"), + 1); + } + + pm = mapping_manager->mapping (); + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ( + "Caught exception in Orb per priority server:"); + return 1; + } + + for (int i = 0; i != nthreads; ++i) + { + CORBA::Short native_priority = 0; + pm->to_native (priorities[i], native_priority); + + servers[i].set (&server_impl, priorities[i], argc, argv); + + if (servers[i].activate (flags, + 1, 1, + native_priority) != 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot activate server threads\n"), + 1); + } + + ACE_Thread_Manager::instance ()->wait (); + + return 0; +} + +// **************************************************************** + +Server::Server (void) +{ +} + +void +Server::set (Test_i *server, + int priority, + int argc, + char *argv[]) +{ + server_ = server; + priority_ = priority; + argc_ = argc; + for (int i = 0; i < argc; ++i) + argv_[i] = argv[i]; +} + +int +Server::svc (void) +{ + ACE_hthread_t current; + ACE_Thread::self (current); + + int native_priority; + ACE_Thread::getprio (current, native_priority); + + ACE_DEBUG ((LM_DEBUG, + "Server orb thread (%t): corba_priority = %d" + " actual native priority = %d\n", + priority_, + native_priority)); + + try + { + char orb_name[64]; + ACE_OS::sprintf (orb_name, "%d", this->priority_); + CORBA::ORB_var orb = + CORBA::ORB_init (argc_, argv_, orb_name); + + CORBA::Object_var poa_object = + 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); + + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (poa_object.in ()); + + PortableServer::POAManager_var poa_manager = + root_poa->the_POAManager (); + + PortableServer::ObjectId_var oid = + root_poa->activate_object (this->server_); + + CORBA::Object_var obj = + root_poa->id_to_reference (oid.in ()); + + CORBA::String_var ior = + orb->object_to_string (obj.in ()); + + ACE_DEBUG ((LM_DEBUG, "Activated as <%s>\n", ior.in ())); + + // Get the file name to store the ior. + char file_name[100]; + ACE_OS::sprintf (file_name, + "%s_%d", + ior_output_file_base, + this->priority_); + + // Output the ior to a file. + FILE *output_file= ACE_OS::fopen (file_name, "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file for writing IOR: %s", + file_name), + 1); + ACE_OS::fprintf (output_file, "%s", ior.in ()); + ACE_OS::fclose (output_file); + + // Start orb event loop. + poa_manager->activate (); + + orb->run (); + + } + catch (const CORBA::Exception& ex) + { + char message[100]; + ACE_OS::sprintf (message, + "ORB_per_Priority::server: Exception in thread with priority = %d", + this->priority_); + ex._tao_print_exception (message); + } + + return 0; +} |