00001 #include "tao/RTCORBA/RT_ORB_Loader.h"
00002
00003 #if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
00004
00005 #include "tao/RTCORBA/RT_ORBInitializer.h"
00006
00007 #include "tao/debug.h"
00008 #include "tao/ORB_Constants.h"
00009 #include "tao/ORBInitializer_Registry.h"
00010 #include "tao/SystemException.h"
00011 #include "ace/OS_NS_strings.h"
00012 #include "ace/Arg_Shifter.h"
00013
00014 ACE_RCSID (RTCORBA,
00015 RT_ORB_Loader,
00016 "RT_ORB_Loader.cpp,v 1.25 2006/03/16 15:53:36 sjiang Exp")
00017
00018 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00019
00020 TAO_RT_ORB_Loader::~TAO_RT_ORB_Loader (void)
00021 {
00022 }
00023
00024 int
00025 TAO_RT_ORB_Loader::init (int argc,
00026 ACE_TCHAR* argv[])
00027 {
00028 ACE_TRACE ("TAO_RT_ORB_Loader::init");
00029
00030 static bool initialized = false;
00031
00032
00033 if (initialized)
00034 return 0;
00035
00036 initialized = true;
00037
00038
00039 int priority_mapping_type =
00040 TAO_RT_ORBInitializer::TAO_PRIORITY_MAPPING_DIRECT;
00041 int network_priority_mapping_type =
00042 TAO_RT_ORBInitializer::TAO_NETWORK_PRIORITY_MAPPING_LINEAR;
00043 int ace_sched_policy = ACE_SCHED_OTHER;
00044 long sched_policy = THR_SCHED_DEFAULT;
00045 long scope_policy = THR_SCOPE_PROCESS;
00046 int curarg = 0;
00047 ACE_Time_Value dynamic_thread_idle_timeout;
00048
00049 ACE_Arg_Shifter arg_shifter (argc, argv);
00050
00051
00052 while (arg_shifter.is_anything_left ())
00053 {
00054 const ACE_TCHAR *current_arg = 0;
00055 if (0 != (current_arg = arg_shifter.get_the_parameter
00056 (ACE_TEXT("-ORBPriorityMapping"))))
00057 {
00058 const ACE_TCHAR *name = current_arg;
00059 if (ACE_OS::strcasecmp (name,
00060 ACE_TEXT("continuous")) == 0)
00061 priority_mapping_type =
00062 TAO_RT_ORBInitializer::TAO_PRIORITY_MAPPING_CONTINUOUS;
00063 else if (ACE_OS::strcasecmp (name,
00064 ACE_TEXT("linear")) == 0)
00065 priority_mapping_type =
00066 TAO_RT_ORBInitializer::TAO_PRIORITY_MAPPING_LINEAR;
00067 else if (ACE_OS::strcasecmp (name,
00068 ACE_TEXT("direct")) == 0)
00069 priority_mapping_type =
00070 TAO_RT_ORBInitializer::TAO_PRIORITY_MAPPING_DIRECT;
00071 else
00072 ACE_DEBUG ((LM_DEBUG,
00073 ACE_TEXT("RT_ORB_Loader - unknown argument")
00074 ACE_TEXT(" <%s> for -ORBPriorityMapping\n"),
00075 name));
00076 arg_shifter.consume_arg ();
00077 }
00078 else if (0 != (current_arg = arg_shifter.get_the_parameter
00079 (ACE_TEXT("-ORBSchedPolicy"))))
00080 {
00081 const ACE_TCHAR *name = current_arg;
00082 if (ACE_OS::strcasecmp (name,
00083 ACE_TEXT("SCHED_OTHER")) == 0)
00084 {
00085 ace_sched_policy = ACE_SCHED_OTHER;
00086 sched_policy = THR_SCHED_DEFAULT;
00087 }
00088 else if (ACE_OS::strcasecmp (name,
00089 ACE_TEXT("SCHED_FIFO")) == 0)
00090 {
00091 ace_sched_policy = ACE_SCHED_FIFO;
00092 sched_policy = THR_SCHED_FIFO;
00093 }
00094 else if (ACE_OS::strcasecmp (name,
00095 ACE_TEXT("SCHED_RR")) == 0)
00096 {
00097 ace_sched_policy = ACE_SCHED_RR;
00098 sched_policy = THR_SCHED_RR;
00099 }
00100 else
00101 ACE_DEBUG ((LM_DEBUG,
00102 ACE_TEXT("RT_ORB_Loader - unknown argument")
00103 ACE_TEXT(" <%s> for -ORBSchedPolicy\n"),
00104 name));
00105 arg_shifter.consume_arg ();
00106 }
00107 else if (0 != (current_arg = arg_shifter.get_the_parameter
00108 (ACE_TEXT("-ORBScopePolicy"))))
00109 {
00110 const ACE_TCHAR *name = current_arg;
00111 if (ACE_OS::strcasecmp (name,
00112 ACE_TEXT("SYSTEM")) == 0)
00113 scope_policy = THR_SCOPE_SYSTEM;
00114 else if (ACE_OS::strcasecmp (name,
00115 ACE_TEXT("PROCESS")) == 0)
00116 scope_policy = THR_SCOPE_PROCESS;
00117 else
00118 ACE_DEBUG ((LM_DEBUG,
00119 ACE_TEXT("RT_ORB_Loader - unknown argument")
00120 ACE_TEXT(" <%s> for -ORBScopePolicy\n"),
00121 name));
00122 arg_shifter.consume_arg ();
00123 }
00124 else if (0 != (current_arg = arg_shifter.get_the_parameter
00125 (ACE_TEXT("-RTORBNetworkPriorityMapping"))))
00126 {
00127 const ACE_TCHAR *name = current_arg;
00128 if (ACE_OS::strcasecmp (name,
00129 ACE_TEXT("linear")) == 0)
00130 network_priority_mapping_type =
00131 TAO_RT_ORBInitializer::TAO_NETWORK_PRIORITY_MAPPING_LINEAR;
00132 arg_shifter.consume_arg ();
00133 }
00134 else if (0 != (current_arg = arg_shifter.get_the_parameter
00135 (ACE_TEXT("-RTORBDynamicThreadIdleTimeout"))))
00136 {
00137 const ACE_TCHAR *name = current_arg;
00138 int timeout = ACE_OS::atoi (name);
00139 dynamic_thread_idle_timeout = ACE_Time_Value (0, timeout);
00140 arg_shifter.consume_arg ();
00141 }
00142 else
00143 {
00144 arg_shifter.ignore_arg ();
00145 if (TAO_debug_level > 0)
00146 {
00147 ACE_ERROR ((LM_ERROR,
00148 ACE_TEXT("RT_ORB_Loader: Unknown option ")
00149 ACE_TEXT("<%s>.\n"),
00150 argv[curarg]));
00151 }
00152 }
00153 }
00154
00155
00156 ACE_TRY_NEW_ENV
00157 {
00158 PortableInterceptor::ORBInitializer_ptr temp_orb_initializer =
00159 PortableInterceptor::ORBInitializer::_nil ();
00160
00161
00162 ACE_NEW_THROW_EX (temp_orb_initializer,
00163 TAO_RT_ORBInitializer (priority_mapping_type,
00164 network_priority_mapping_type,
00165 ace_sched_policy,
00166 sched_policy,
00167 scope_policy,
00168 dynamic_thread_idle_timeout),
00169 CORBA::NO_MEMORY (
00170 CORBA::SystemException::_tao_minor_code (
00171 TAO::VMCID,
00172 ENOMEM),
00173 CORBA::COMPLETED_NO));
00174 ACE_TRY_CHECK;
00175
00176 PortableInterceptor::ORBInitializer_var orb_initializer;
00177 orb_initializer = temp_orb_initializer;
00178
00179 PortableInterceptor::register_orb_initializer (orb_initializer.in ()
00180 ACE_ENV_ARG_PARAMETER);
00181 ACE_TRY_CHECK;
00182 }
00183 ACE_CATCHANY
00184 {
00185 ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
00186 "Unexpected exception caught while "
00187 "initializing the RTORB");
00188 return 1;
00189 }
00190 ACE_ENDTRY;
00191
00192 return 0;
00193 }
00194
00195 TAO_END_VERSIONED_NAMESPACE_DECL
00196
00197
00198
00199 ACE_FACTORY_DEFINE (TAO_RTCORBA, TAO_RT_ORB_Loader)
00200 ACE_STATIC_SVC_DEFINE (TAO_RT_ORB_Loader,
00201 ACE_TEXT ("RT_ORB_Loader"),
00202 ACE_SVC_OBJ_T,
00203 &ACE_SVC_NAME (TAO_RT_ORB_Loader),
00204 ACE_Service_Type::DELETE_THIS
00205 | ACE_Service_Type::DELETE_OBJ,
00206 0)
00207
00208 #endif