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
= 2;
12 CORBA::ULong dynamic_threads
= 2;
16 parse_args (int argc
, ACE_TCHAR
*argv
[])
18 ACE_Get_Opt
get_opts (argc
, argv
, ACE_TEXT("o:s:d:t:"));
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 ());
42 ACE_ERROR_RETURN ((LM_ERROR
,
45 "-s <static_threads> "
46 "-d <dynamic_threads> "
53 // Indicates successful parsing of the command line
58 write_ior_to_file (CORBA::ORB_ptr orb
,
61 CORBA::String_var ior
=
62 orb
->object_to_string (test
);
64 char filename
[BUFSIZ
];
65 ACE_OS::sprintf (filename
,
67 ACE_TEXT_ALWAYS_CHAR (ior_output_file
),
71 ACE_OS::fopen (filename
,
75 ACE_ERROR_RETURN ((LM_ERROR
,
76 "Cannot open output file for writing IOR: %s",
80 ACE_OS::fprintf (output_file
,
84 ACE_OS::fclose (output_file
);
90 create_POA_and_register_servant (CORBA::Policy_ptr threadpool_policy
,
92 PortableServer::POAManager_ptr poa_manager
,
93 PortableServer::POA_ptr root_poa
,
95 RTCORBA::RTORB_ptr rt_orb
)
97 // Policies for the firstPOA to be created.
98 CORBA::PolicyList
policies (3); policies
.length (3);
100 // Implicit_activation policy.
102 root_poa
->create_implicit_activation_policy
103 (PortableServer::IMPLICIT_ACTIVATION
);
105 // Thread pool policy.
107 CORBA::Policy::_duplicate (threadpool_policy
);
109 // Priority Model policy.
111 rt_orb
->create_priority_model_policy (RTCORBA::CLIENT_PROPAGATED
, 0);
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 ());
140 test_var test
= test::_narrow (object
.in ());
142 int const result
= write_ior_to_file (orb
, test
.in ());
147 class Task
: public ACE_Task_Base
150 Task (ACE_Thread_Manager
&thread_manager
,
158 Task::Task (ACE_Thread_Manager
&thread_manager
,
160 : ACE_Task_Base (&thread_manager
),
161 orb_ (CORBA::ORB::_duplicate (orb
))
170 CORBA::Object_var object
=
171 this->orb_
->resolve_initial_references ("RootPOA");
173 PortableServer::POA_var root_poa
=
174 PortableServer::POA::_narrow (object
.in ());
176 PortableServer::POAManager_var poa_manager
=
177 root_poa
->the_POAManager ();
180 this->orb_
->resolve_initial_references ("RTORB");
182 RTCORBA::RTORB_var rt_orb
=
183 RTCORBA::RTORB::_narrow (object
.in ());
186 this->orb_
->resolve_initial_references ("RTCurrent");
188 RTCORBA::Current_var current
=
189 RTCORBA::Current::_narrow (object
.in ());
191 RTCORBA::Priority default_thread_priority
=
192 get_implicit_thread_CORBA_priority (this->orb_
.in ());
194 test_i
servant (this->orb_
.in (),
197 PortableServer::ObjectId_var id
=
198 root_poa
->activate_object (&servant
);
200 CORBA::Object_var object_act
= root_poa
->id_to_reference (id
.in ());
203 test::_narrow (object_act
.in ());
206 write_ior_to_file (this->orb_
.in (),
212 poa_manager
->activate ();
214 CORBA::ULong stacksize
= 0;
215 CORBA::Boolean allow_request_buffering
= 0;
216 CORBA::ULong max_buffered_requests
= 0;
217 CORBA::ULong max_request_buffer_size
= 0;
219 RTCORBA::ThreadpoolId threadpool_id_1
=
220 rt_orb
->create_threadpool (stacksize
,
223 default_thread_priority
,
224 allow_request_buffering
,
225 max_buffered_requests
,
226 max_request_buffer_size
);
228 CORBA::Policy_var threadpool_policy_1
=
229 rt_orb
->create_threadpool_policy (threadpool_id_1
);
231 CORBA::Boolean allow_borrowing
= 0;
232 RTCORBA::ThreadpoolLanes
lanes (1);
235 lanes
[0].lane_priority
= default_thread_priority
;
236 lanes
[0].static_threads
= static_threads
;
237 lanes
[0].dynamic_threads
= dynamic_threads
;
239 RTCORBA::ThreadpoolId threadpool_id_2
=
240 rt_orb
->create_threadpool_with_lanes (stacksize
,
243 allow_request_buffering
,
244 max_buffered_requests
,
245 max_request_buffer_size
);
247 CORBA::Policy_var threadpool_policy_2
=
248 rt_orb
->create_threadpool_policy (threadpool_id_2
);
251 create_POA_and_register_servant (threadpool_policy_1
.in (),
261 create_POA_and_register_servant (threadpool_policy_2
.in (),
272 this->orb_
->destroy ();
274 catch (const CORBA::Exception
& ex
)
276 ex
._tao_print_exception ("Exception caught:");
284 ACE_TMAIN(int argc
, ACE_TCHAR
*argv
[])
288 CORBA::ORB_var orb
= CORBA::ORB_init (argc
, argv
);
291 parse_args (argc
, argv
);
295 // Make sure we can support multiple priorities that are required
297 if (!check_supported_priorities (orb
.in ()))
300 // Thread Manager for managing task.
301 ACE_Thread_Manager thread_manager
;
304 Task
task (thread_manager
,
307 // Task activation flags.
311 orb
->orb_core ()->orb_params ()->thread_creation_flags ();
315 task
.activate (flags
);
320 ACE_ERROR_RETURN ((LM_ERROR
,
321 "Cannot create thread with scheduling policy %s\n"
322 "because the user does not have the appropriate privileges, terminating program....\n"
323 "Check svc.conf options and/or run as root\n",
324 sched_policy_name (orb
->orb_core ()->orb_params ()->ace_sched_policy ())),
332 // Wait for task to exit.
334 thread_manager
.wait ();
335 ACE_ASSERT (result
!= -1);
337 catch (const CORBA::Exception
& ex
)
339 ex
._tao_print_exception ("Exception caught");