diff options
Diffstat (limited to 'ACE/TAO/orbsvcs/tests/RTCosScheduling/server.cpp')
-rw-r--r-- | ACE/TAO/orbsvcs/tests/RTCosScheduling/server.cpp | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/tests/RTCosScheduling/server.cpp b/ACE/TAO/orbsvcs/tests/RTCosScheduling/server.cpp new file mode 100644 index 00000000000..b69c973ccd1 --- /dev/null +++ b/ACE/TAO/orbsvcs/tests/RTCosScheduling/server.cpp @@ -0,0 +1,228 @@ +/* -*- C++ -*- */ + +//============================================================================= +/** + * @file server.cpp + * + * $Id$ + * + * @author Matt Murphy <murphym@cs.uri.edu> + */ +//============================================================================= + +#include "Object1_i.h" +#include <orbsvcs/RTCosScheduling/RTCosScheduling_ServerScheduler_i.h> + +#include "tao/Version.h" + +// FUZZ: disable check_for_streams_include +#include "ace/streams.h" +#include "ace/Task.h" +#include "ace/Get_Opt.h" +#include "tao/ORB_Core.h" +#include "ace/OS_main.h" +#include "ace/OS_NS_stdio.h" + +const ACE_TCHAR *ior_output_file = ACE_TEXT("server.ior"); +char *node_ = 0; +char *file_ = 0; +char *shared_file_ = 0; +char *object_ = 0; +int num_threads_ = 5; +int use_realtime_ = 1; + +// ORB Thread + +class ORB_Thread : public ACE_Task<ACE_SYNCH> +{ +public: + +ORB_Thread(CORBA::ORB_var orb) : orb_(orb) +{ +} + +int +svc(void) +{ + + try + { + orb_->run(); + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ("svc"); + return 1; + } + + ACE_OS::exit(0); + return 0; +} + + +private: + CORBA::ORB_var orb_; +}; + + +int +parse_args (int argc, ACE_TCHAR *argv[]) +{ + // We set the '-' flag for getopts because we have to do + // this parsing before the ORB does it's + //parsing, and we'd confuse it to reorder + ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("-:N:F:S:T:A:X:")); + int c; + + while ((c = get_opts ()) != -1) + { + switch (c) + { + case 'N': + node_ = get_opts.opt_arg (); + break; + case 'F': + file_ = get_opts.opt_arg (); + break; + case 'S': + shared_file_ = get_opts.opt_arg (); + break; + case 'T': + num_threads_ = ACE_OS::atoi (get_opts.opt_arg ()); + break; + case 'A': + object_ = ACE_OS::strdup(get_opts.opt_arg ()); + break; + case 'X': + use_realtime_ = ACE_OS::atoi(get_opts.opt_arg ()); + break; + + } + } + if (node_ == 0) + node_ = ACE_OS::strdup("1"); + if (file_ == 0) + file_ = ACE_OS::strdup("schedule.cfg"); + if (shared_file_ == 0) + shared_file_ = ACE_OS::strdup("Scheduling_Service_Shared_Memory"); + if (object_ == 0) + object_ = ACE_OS::strdup("Server2"); + + return 0; +} + + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { + try + { + if (parse_args (argc, argv) != 0) + { + return 1; + } + + CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "testORB"); + + /// get the root poa + CORBA::Object_var object= orb->resolve_initial_references ("RootPOA"); + + PortableServer::POA_var rootPOA = + PortableServer::POA::_narrow (object.in ()); + + /// Create a manager for the POA + PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager (); + + CORBA::PolicyList poa_policy_list; + poa_policy_list.length (1); + + poa_policy_list[0] = + rootPOA->create_lifespan_policy(PortableServer::TRANSIENT); + + // Create the RT Scheduling service + TAO::RTCosScheduling_ServerScheduler_i *server_sched = 0; + ACE_NEW_THROW_EX(server_sched, + TAO::RTCosScheduling_ServerScheduler_i( + node_, + file_, + shared_file_, + num_threads_ ), + CORBA::NO_MEMORY()); + + /// Create the POA so RT Policies are set + PortableServer::POA_var RTPOA = + server_sched->create_POA(rootPOA.in(), + "my_RT_POA", + poa_manager.in(), + poa_policy_list); + + + Object1_impl * servant = 0; + ACE_NEW_THROW_EX(servant, + Object1_impl(), + CORBA::NO_MEMORY()); + + PortableServer::ObjectId_var id = + RTPOA->activate_object(servant); + + CORBA::Object_var testObject = + RTPOA->id_to_reference(id.in()); + + CORBA::String_var testObject_IORString = + orb->object_to_string (testObject.in ()); + + // If the ior_output_file exists, output the ior to it + FILE *output_file= ACE_OS::fopen (ior_output_file, "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file for writing IOR: %s", + ior_output_file), + 1); + ACE_OS::fprintf (output_file, "%s", testObject_IORString.in ()); + ACE_OS::fclose (output_file); + + if (use_realtime_) + { + /// Schedule the object + try + { + server_sched->schedule_object(testObject.inout(), + object_); + } + catch (const RTCosScheduling::UnknownName& ex) + { + ex._tao_print_exception ( + "Unknown object passed to schedule_object\n"); + } + } + + // Activate the manager and run the event loop + poa_manager->activate (); + + // Need to set the main thread pthread scope and pthread policy to + // the values that are specified in svc.conf. This change was + // recommended by irfan@oomworks.com + long flags = THR_NEW_LWP | THR_JOINABLE | + + orb->orb_core ()->orb_params ()->thread_creation_flags (); + + ORB_Thread ot(orb); + ot.activate(flags); + ot.wait(); + + ACE_DEBUG((LM_DEBUG, + "Server is shutting down\n\n")); + + delete server_sched; + + /// clean up + rootPOA->destroy (1, 1); + orb->destroy (); + } + catch (const CORBA::Exception& ex) + { + ex._tao_print_exception ("Exception caught:"); + return -1; + } + + return 0; +} |