2 #include "ace/Get_Opt.h"
3 #include "ace/OS_NS_unistd.h"
4 #include "tao/ORB_Core.h"
6 #include "tao/RTPortableServer/RTPortableServer.h"
7 #include "../check_supported_priorities.cpp"
9 const ACE_TCHAR
*ior_output_file
= ACE_TEXT("ior");
11 CORBA::ULong static_threads
= 1;
12 CORBA::ULong dynamic_threads
= 25;
16 parse_args (int argc
, ACE_TCHAR
*argv
[])
18 ACE_Get_Opt
get_opts (argc
, argv
, ACE_TEXT("o:s:d:t:h"));
21 while ((c
= get_opts ()) != -1)
25 ior_output_file
= get_opts
.opt_arg ();
29 static_threads
= ACE_OS::atoi (get_opts
.opt_arg ());
33 dynamic_threads
= ACE_OS::atoi (get_opts
.opt_arg ());
37 nap_time
= ACE_OS::atoi (get_opts
.opt_arg ());
41 ACE_ERROR_RETURN ((LM_ERROR
,
44 "-s <static_threads> "
45 "-d <dynamic_threads> "
52 // Indicates successful parsing of the command line
57 write_ior_to_file (CORBA::ORB_ptr orb
,
60 CORBA::String_var ior
=
61 orb
->object_to_string (test
);
63 char filename
[BUFSIZ
];
64 ACE_OS::sprintf (filename
,
66 ACE_TEXT_ALWAYS_CHAR (ior_output_file
),
70 ACE_OS::fopen (filename
,
74 ACE_ERROR_RETURN ((LM_ERROR
,
75 "Cannot open output file for writing IOR: %s",
79 ACE_OS::fprintf (output_file
,
83 ACE_OS::fclose (output_file
);
89 create_POA_and_register_servant (CORBA::Policy_ptr threadpool_policy
,
91 PortableServer::POAManager_ptr poa_manager
,
92 PortableServer::POA_ptr root_poa
,
94 RTCORBA::RTORB_ptr rt_orb
)
96 // Policies for the firstPOA to be created.
97 CORBA::PolicyList
policies (3); policies
.length (3);
99 // Implicit_activation policy.
101 root_poa
->create_implicit_activation_policy
102 (PortableServer::IMPLICIT_ACTIVATION
);
104 // Thread pool policy.
106 CORBA::Policy::_duplicate (threadpool_policy
);
108 // Priority Model policy.
110 rt_orb
->create_priority_model_policy (RTCORBA::CLIENT_PROPAGATED
,
113 // Create the POA under the RootPOA.
114 PortableServer::POA_var poa
=
115 root_poa
->create_POA (poa_name
,
119 // Creation of POAs is over. Destroy the Policy objects.
120 for (CORBA::ULong i
= 0;
121 i
< policies
.length ();
124 policies
[i
]->destroy ();
132 PortableServer::ServantBase_var
safe_servant (servant
);
133 ACE_UNUSED_ARG (safe_servant
);
135 PortableServer::ObjectId_var id
=
136 poa
->activate_object (servant
);
138 CORBA::Object_var object
= poa
->id_to_reference (id
.in ());
141 test::_narrow (object
.in ());
144 write_ior_to_file (orb
,
150 class Task
: public ACE_Task_Base
153 Task (ACE_Thread_Manager
&thread_manager
,
161 Task::Task (ACE_Thread_Manager
&thread_manager
,
163 : ACE_Task_Base (&thread_manager
),
164 orb_ (CORBA::ORB::_duplicate (orb
))
173 CORBA::Object_var object
=
174 this->orb_
->resolve_initial_references ("RootPOA");
176 PortableServer::POA_var root_poa
=
177 PortableServer::POA::_narrow (object
.in ());
179 PortableServer::POAManager_var poa_manager
=
180 root_poa
->the_POAManager ();
183 this->orb_
->resolve_initial_references ("RTORB");
185 RTCORBA::RTORB_var rt_orb
=
186 RTCORBA::RTORB::_narrow (object
.in ());
189 this->orb_
->resolve_initial_references ("RTCurrent");
191 RTCORBA::Current_var current
=
192 RTCORBA::Current::_narrow (object
.in ());
194 RTCORBA::Priority default_thread_priority
=
195 get_implicit_thread_CORBA_priority (this->orb_
.in ());
197 test_i
servant (this->orb_
.in (),
200 PortableServer::ObjectId_var id
=
201 root_poa
->activate_object (&servant
);
203 CORBA::Object_var object_act
= root_poa
->id_to_reference (id
.in ());
206 test::_narrow (object_act
.in ());
209 write_ior_to_file (this->orb_
.in (),
215 poa_manager
->activate ();
217 CORBA::ULong stacksize
= 0;
218 CORBA::Boolean allow_request_buffering
= 0;
219 CORBA::ULong max_buffered_requests
= 0;
220 CORBA::ULong max_request_buffer_size
= 0;
222 RTCORBA::ThreadpoolId threadpool_id_1
=
223 rt_orb
->create_threadpool (stacksize
,
226 default_thread_priority
,
227 allow_request_buffering
,
228 max_buffered_requests
,
229 max_request_buffer_size
);
231 CORBA::Policy_var threadpool_policy_1
=
232 rt_orb
->create_threadpool_policy (threadpool_id_1
);
234 CORBA::Boolean allow_borrowing
= 0;
235 RTCORBA::ThreadpoolLanes
lanes (1);
238 lanes
[0].lane_priority
= default_thread_priority
;
239 lanes
[0].static_threads
= static_threads
;
240 lanes
[0].dynamic_threads
= dynamic_threads
;
242 RTCORBA::ThreadpoolId threadpool_id_2
=
243 rt_orb
->create_threadpool_with_lanes (stacksize
,
246 allow_request_buffering
,
247 max_buffered_requests
,
248 max_request_buffer_size
);
250 CORBA::Policy_var threadpool_policy_2
=
251 rt_orb
->create_threadpool_policy (threadpool_id_2
);
254 create_POA_and_register_servant (threadpool_policy_1
.in (),
264 create_POA_and_register_servant (threadpool_policy_2
.in (),
275 this->orb_
->destroy ();
277 catch (const CORBA::Exception
& ex
)
279 ex
._tao_print_exception ("Exception caught:");
287 ACE_TMAIN(int argc
, ACE_TCHAR
*argv
[])
292 CORBA::ORB_init (argc
, argv
);
295 parse_args (argc
, argv
);
299 // Make sure we can support multiple priorities that are required
301 if (!check_supported_priorities (orb
.in ()))
304 // Thread Manager for managing task.
305 ACE_Thread_Manager thread_manager
;
308 Task
task (thread_manager
,
311 // Task activation flags.
315 orb
->orb_core ()->orb_params ()->thread_creation_flags ();
319 task
.activate (flags
);
324 ACE_ERROR_RETURN ((LM_ERROR
,
325 "Cannot create thread with scheduling policy %s\n"
326 "because the user does not have the appropriate privileges, terminating program....\n"
327 "Check svc.conf options and/or run as root\n",
328 sched_policy_name (orb
->orb_core ()->orb_params ()->ace_sched_policy ())),
336 // Wait for task to exit.
338 thread_manager
.wait ();
339 ACE_ASSERT (result
!= -1);
341 catch (const CORBA::Exception
& ex
)
343 ex
._tao_print_exception ("Exception caught");