1 #include "orbsvcs/Log_Macros.h"
2 #include "Notify_Service.h"
4 #include "orbsvcs/Daemon_Utilities.h"
6 #include "orbsvcs/Notify/Service.h"
7 #include "orbsvcs/Notify/EventChannelFactory.h"
10 #include "tao/IORTable/IORTable.h"
11 #include "tao/ORB_Core.h"
13 #if defined (TAO_HAS_NOTIFICATION_MONITOR_CONTROL) && defined (TAO_AS_STATIC_LIBS)
14 // for static builds, be sure the library is included
15 #include "orbsvcs/orbsvcs/Notify/MonitorControlExt/MC_Notify_Service.h"
16 #include "orbsvcs/orbsvcs/Notify/MonitorControl/MonitorManager.h"
19 #if defined (TAO_EXPLICIT_NEGOTIATE_CODESETS)
20 #include "tao/Codeset/Codeset.h"
21 #endif /* TAO_EXPLICIT_NEGOTIATE_CODESETS */
23 #if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
24 #include "tao/Messaging/Messaging.h"
25 #endif /* TAO_HAS_CORBA_MESSAGING != 0 */
27 #include "ace/Arg_Shifter.h"
28 #include "ace/Get_Opt.h"
29 #include "ace/Sched_Params.h"
30 #include "ace/Synch.h"
31 #include "ace/Argv_Type_Converter.h"
32 #include "ace/Logging_Strategy.h"
34 TAO_Notify_Service_Driver::TAO_Notify_Service_Driver (void)
37 , use_name_svc_ (true)
38 , ior_output_file_name_ (0)
39 , notify_factory_name_ (NOTIFY_KEY
)
40 , register_event_channel_ (false)
42 , separate_dispatching_orb_ (false)
44 , logging_worker_(this)
45 , shutdown_orb_ (true)
46 , shutdown_dispatching_orb_ (true)
50 TAO_Notify_Service_Driver::~TAO_Notify_Service_Driver (void)
55 TAO_Notify_Service_Driver::init_ORB (int& argc
, ACE_TCHAR
*argv
[])
57 this->orb_
= CORBA::ORB_init (argc
, argv
);
60 (argv
[0], ACE_Log_Msg::SYSLOG
, ACE_TEXT ("TAO Notify"));
62 this->apply_timeout (this->orb_
.in ());
64 CORBA::Object_var object
=
65 this->orb_
->resolve_initial_references("RootPOA");
67 if (CORBA::is_nil (object
.in ()))
68 ORBSVCS_ERROR_RETURN ((LM_ERROR
,
69 " (%P|%t) Unable to resolve the RootPOA.\n"),
73 PortableServer::POA::_narrow (object
.in ());
75 PortableServer::POAManager_var poa_manager
=
76 this->poa_
->the_POAManager ();
78 poa_manager
->activate ();
84 TAO_Notify_Service_Driver::init_dispatching_ORB (int& argc
, ACE_TCHAR
*argv
[])
86 this->dispatching_orb_
= CORBA::ORB_init (argc
, argv
, "dispatcher");
88 this->apply_timeout (this->dispatching_orb_
.in ());
94 TAO_Notify_Service_Driver::apply_timeout (CORBA::ORB_ptr orb
)
96 #if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
97 if (this->timeout_
!= 0)
99 // convert from msec to "TimeT"
101 TimeBase::TimeT value
= 10000 * this->timeout_
;
104 CORBA::Object_var object
=
105 orb
->resolve_initial_references ("ORBPolicyManager");
106 CORBA::PolicyManager_var policy_manager
=
107 CORBA::PolicyManager::_narrow (object
.in ());
108 if (CORBA::is_nil (policy_manager
.in ()))
109 throw CORBA::INTERNAL ();
111 CORBA::PolicyList
policy_list (1);
112 policy_list
.length (1);
113 policy_list
[0] = orb
->create_policy (
114 Messaging::RELATIVE_RT_TIMEOUT_POLICY_TYPE
,
116 policy_manager
->set_policy_overrides (policy_list
, CORBA::SET_OVERRIDE
);
117 policy_list
[0]->destroy ();
120 ACE_UNUSED_ARG (orb
);
121 #endif /* TAO_HAS_CORBA_MESSAGING != 0 */
125 TAO_Notify_Service_Driver::init (int argc
, ACE_TCHAR
*argv
[])
127 // Check if -ORBDaemon is specified and if so, daemonize at this moment,
128 // -ORBDaemon in the ORB core is faulty, see bugzilla 3335
129 TAO_Daemon_Utility::check_for_daemon (argc
, argv
);
131 if (this->parse_args(argc
, argv
) != 0)
134 // initalize the ORB.
135 if (this->init_ORB (argc
, argv
) != 0)
138 this->notify_service_
= TAO_Notify_Service::load_default ();
140 if (this->notify_service_
== 0)
142 if (TAO_debug_level
> 0)
144 ORBSVCS_ERROR ((LM_ERROR
,
145 ACE_TEXT ("Service not found. Check service ")
146 ACE_TEXT ("configurator file.\n")));
151 if (this->separate_dispatching_orb_
)
153 if (this->init_dispatching_ORB (argc
, argv
) != 0)
158 this->notify_service_
->init_service2 (this->orb_
.in (), this->dispatching_orb_
.in());
162 this->notify_service_
->init_service (this->orb_
.in ());
165 this->logging_worker_
.start();
167 if (this->nthreads_
> 0) // we have chosen to run in a thread pool.
169 if (TAO_debug_level
> 0)
171 ORBSVCS_DEBUG ((LM_DEBUG
,
172 ACE_TEXT("Running %d ORB threads\n"),
175 worker_
.orb (this->orb_
.in ());
177 // Task activation flags.
181 this->orb_
->orb_core ()->orb_params ()->thread_creation_flags ();
184 ACE_Sched_Params::priority_min (ACE_Utils::truncate_cast
<ACE_Sched_Params::Policy
> (this->orb_
->orb_core ()->orb_params ()->sched_policy ()),
185 ACE_Utils::truncate_cast
<int> (this->orb_
->orb_core ()->orb_params ()->scope_policy ()));
187 if (worker_
.activate (flags
,
188 this->nthreads_
, 0, priority
) != 0)
190 ORBSVCS_ERROR_RETURN ((LM_ERROR
,
191 "Cannot activate client threads\n"), -1);
195 // Check first if the naming service
196 if (this->use_name_svc_
)
198 // Resolve the naming service.
199 int const ns_ret
= this->resolve_naming_service ();
205 if (TAO_debug_level
> 0)
207 ORBSVCS_DEBUG ((LM_DEBUG
,
208 ACE_TEXT("\nStarting up the Notification Service...\n")));
211 // Activate the factory
212 this->notify_factory_
=
213 notify_service_
->create (this->poa_
.in (),
214 this->notify_factory_name_
.c_str ());
216 ACE_ASSERT (!CORBA::is_nil (this->notify_factory_
.in ()));
218 if (this->bootstrap_
) // Enable corbaloc usage
220 CORBA::Object_var table_object
=
221 this->orb_
->resolve_initial_references ("IORTable");
223 IORTable::Table_var adapter
=
224 IORTable::Table::_narrow (table_object
.in ());
226 if (CORBA::is_nil (adapter
.in ()))
228 if (TAO_debug_level
> 0)
230 ORBSVCS_ERROR ((LM_ERROR
,
231 "Nil IORTable. corbaloc support not enabled.\n"));
236 CORBA::String_var ior
=
237 this->orb_
->object_to_string (this->notify_factory_
.in ());
238 adapter
->bind (this->notify_factory_name_
.c_str (), ior
.in ());
242 // Register with the Name service, if asked
243 if (this->use_name_svc_
&& !CORBA::is_nil (this->naming_
.in ()))
245 CosNaming::Name_var name
=
246 this->naming_
->to_name (this->notify_factory_name_
.c_str ());
248 this->naming_
->rebind (name
.in (),
249 this->notify_factory_
.in ());
251 if (TAO_debug_level
> 0)
253 ORBSVCS_DEBUG ((LM_DEBUG
,
254 "Registered with the naming service as: %C\n",
255 this->notify_factory_name_
.c_str()));
258 if (this->register_event_channel_
)
260 // If we don't have any name configured, default to the standard name
261 if (this->notify_channel_name_
.is_empty ())
263 notify_channel_name_
.insert (NOTIFY_CHANNEL_NAME
);
266 for (ACE_Unbounded_Set
<ACE_CString
>::const_iterator
ci (
267 this->notify_channel_name_
); !ci
.done(); ci
++)
269 // create an event channel
270 CosNotifyChannelAdmin::ChannelID id
;
272 CosNotification::QoSProperties initial_qos
;
273 CosNotification::AdminProperties initial_admin
;
275 CosNotifyChannelAdmin::EventChannel_var ec
;
276 TAO_Notify_EventChannelFactory
* factory_impl
=
277 dynamic_cast<TAO_Notify_EventChannelFactory
*> (
278 this->notify_factory_
->_servant ());
279 if (factory_impl
== 0)
281 ec
= this->notify_factory_
->create_channel (initial_qos
,
287 ec
= factory_impl
->create_named_channel (
288 initial_qos
, initial_admin
,id
,
292 name
= this->naming_
->to_name ((*ci
).c_str ());
294 this->naming_
->rebind (name
.in (), ec
.in ());
296 if (TAO_debug_level
> 0)
298 ORBSVCS_DEBUG ((LM_DEBUG
,
299 "Registered an Event Channel with the naming "
307 // Write IOR to a file, if asked.
308 // Note: do this last to ensure that we're up and running before the file is written
309 CORBA::String_var str
=
310 this->orb_
->object_to_string (this->notify_factory_
.in ());
312 if (this->ior_output_file_name_
)
314 FILE* ior_output_file
= ACE_OS::fopen (ior_output_file_name_
,
316 if (ior_output_file
== 0)
318 ORBSVCS_ERROR_RETURN ((LM_ERROR
,
319 "Unable to open %s for writing: %p\n",
320 this->ior_output_file_name_
, "Notify_Service"),
324 ACE_OS::fprintf (ior_output_file
, "%s", str
.in ());
325 ACE_OS::fclose (ior_output_file
);
327 else if (TAO_debug_level
> 0)
329 ORBSVCS_DEBUG ((LM_DEBUG
,
330 ACE_TEXT ("The Notification Event Channel Factory IOR is <%C>\n"),
338 TAO_Notify_Service_Driver::resolve_naming_service (void)
342 CORBA::Object_var naming_obj
=
343 this->orb_
->resolve_initial_references ("NameService");
345 // Need to check return value for errors.
346 if (CORBA::is_nil (naming_obj
.in ()))
347 ORBSVCS_ERROR_RETURN ((LM_ERROR
,
348 " (%P|%t) Unable to resolve the Naming Service.\n"),
351 this->naming_
= CosNaming::NamingContextExt::_narrow (naming_obj
.in ());
353 catch (const CORBA::Exception
&)
355 ORBSVCS_ERROR_RETURN ((LM_ERROR
,
356 " (%P|%t) Unable to resolve the Naming Service.\n"),
361 ORBSVCS_ERROR_RETURN ((LM_ERROR
,
362 " (%P|%t) Unable to resolve the Naming Service.\n"),
369 TAO_Notify_Service_Driver::run (void)
371 if (TAO_debug_level
> 0 )
372 ORBSVCS_DEBUG ((LM_DEBUG
,
373 ACE_TEXT ("%C: Running the Notification Service\n"),
376 if (this->nthreads_
> 0)
378 this->worker_
.wait ();
386 this->logging_worker_
.end();
391 TAO_Notify_Service_Driver::fini (void)
393 /// Release all the _vars as the ORB about to go away.
394 CosNotifyChannelAdmin::EventChannelFactory_var factory
=
395 this->notify_factory_
._retn ();
396 CORBA::ORB_var orb
= this->orb_
._retn ();
397 CORBA::ORB_var dispatching_orb
= this->dispatching_orb_
._retn ();
398 PortableServer::POA_var poa
= this->poa_
._retn ();
399 CosNaming::NamingContextExt_var naming
= this->naming_
._retn ();
401 // This must be called to ensure that all services shut down
402 // correctly. Depending upon the type of service loaded, it may
403 // or may not actually perform any actions.
404 this->notify_service_
->finalize_service (factory
.in ());
405 factory
= CosNotifyChannelAdmin::EventChannelFactory::_nil ();
407 this->notify_service_
->fini ();
410 if (this->use_name_svc_
&& !CORBA::is_nil (naming
.in ()))
412 // Unbind all event channels from the naming service
413 if (this->register_event_channel_
)
415 for (ACE_Unbounded_Set
<ACE_CString
>::const_iterator
ci (
416 this->notify_channel_name_
); !ci
.done(); ci
++)
418 CosNaming::Name_var name
= naming
->to_name ((*ci
).c_str ());
419 naming
->unbind (name
.in ());
423 // Unbind from the naming service.
424 CosNaming::Name_var name
=
425 naming
->to_name (this->notify_factory_name_
.c_str ());
427 naming
->unbind (name
.in ());
429 naming
= CosNaming::NamingContextExt::_nil ();
432 if (!CORBA::is_nil (poa
.in ()))
434 poa
->destroy (true, true);
435 poa
= PortableServer::POA::_nil ();
438 if (this->shutdown_dispatching_orb_
&& !CORBA::is_nil (dispatching_orb_
.in ()))
440 dispatching_orb
->shutdown ();
444 if (this->shutdown_orb_
&& !CORBA::is_nil (orb
.in ()))
449 // Make sure all worker threads are gone.
450 this->worker_
.wait ();
451 this->logging_worker_
.wait ();
454 if (this->shutdown_dispatching_orb_
&& !CORBA::is_nil (dispatching_orb_
.in ()))
456 dispatching_orb
->destroy ();
460 if (this->shutdown_orb_
&& !CORBA::is_nil (orb
.in ()))
465 dispatching_orb_
= CORBA::ORB::_nil ();
467 worker_
.orb (CORBA::ORB::_nil ());
469 orb
= CORBA::ORB::_nil ();
475 TAO_Notify_Service_Driver::parse_args (int argc
, ACE_TCHAR
*argv
[])
477 ACE_Arg_Shifter
arg_shifter (argc
, argv
);
479 const ACE_TCHAR
* current_arg
= 0;
480 while (arg_shifter
.is_anything_left ())
482 if (0 != (current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-Factory"))))
484 this->notify_factory_name_
.set (ACE_TEXT_ALWAYS_CHAR(current_arg
));
485 arg_shifter
.consume_arg ();
487 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-ShutdownORB")) == 0)
489 current_arg
= arg_shifter
.get_the_parameter
490 (ACE_TEXT("-ShutdownORB"));
491 if (current_arg
!= 0 &&
492 (ACE_OS::strcmp(ACE_TEXT ("0"), current_arg
) == 0 ||
493 ACE_OS::strcmp(ACE_TEXT ("1"), current_arg
) == 0))
495 this->shutdown_orb_
=
496 static_cast<bool> (ACE_OS::atoi(current_arg
));
498 if (current_arg
!= 0)
499 arg_shifter
.consume_arg ();
501 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-ShutdownDispatchingORB")) == 0)
503 current_arg
= arg_shifter
.get_the_parameter
504 (ACE_TEXT("-ShutdownDispatchingORB"));
505 if (current_arg
!= 0 &&
506 (ACE_OS::strcmp(ACE_TEXT ("0"), current_arg
) == 0 ||
507 ACE_OS::strcmp(ACE_TEXT ("1"), current_arg
) == 0))
509 this->shutdown_dispatching_orb_
=
510 static_cast<bool> (ACE_OS::atoi(current_arg
));
512 if (current_arg
!= 0)
513 arg_shifter
.consume_arg ();
515 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-UseSeparateDispatchingORB")) == 0)
517 current_arg
= arg_shifter
.get_the_parameter
518 (ACE_TEXT("-UseSeparateDispatchingORB"));
519 if (current_arg
!= 0 &&
520 (ACE_OS::strcmp(ACE_TEXT ("0"), current_arg
) == 0 ||
521 ACE_OS::strcmp(ACE_TEXT ("1"), current_arg
) == 0))
523 if (TAO_debug_level
> 0)
525 ORBSVCS_DEBUG ((LM_DEBUG
,
526 ACE_TEXT ("Using separate dispatching ORB\n")));
528 this->separate_dispatching_orb_
=
529 static_cast<bool> (ACE_OS::atoi(current_arg
));
533 if (TAO_debug_level
> 0)
535 ORBSVCS_DEBUG ((LM_DEBUG
,
536 ACE_TEXT ("WARNING: Unrecognized ")
537 ACE_TEXT ("argument (%s) to ")
538 ACE_TEXT ("-UseSeparateDispatchingORB.\n"),
539 (current_arg
== 0 ? ACE_TEXT ("''") : current_arg
)));
542 if (current_arg
!= 0)
543 arg_shifter
.consume_arg ();
545 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-Boot")) == 0)
547 this->bootstrap_
= true;
548 // Make it bootstrappable
550 arg_shifter
.consume_arg ();
552 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-NameSvc")) == 0)
554 this->use_name_svc_
= true;
555 // Register ref with the name service
557 arg_shifter
.consume_arg ();
559 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-NoNameSvc")) == 0)
561 this->use_name_svc_
= false;
562 // Don't Register ref with the name service
564 arg_shifter
.consume_arg ();
566 else if (0 != (current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-IORoutput"))))
568 this->ior_output_file_name_
= current_arg
;
569 arg_shifter
.consume_arg ();
571 else if (0 != (current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-ChannelName"))))
573 this->notify_channel_name_
.insert(ACE_CString(ACE_TEXT_ALWAYS_CHAR(current_arg
)));
574 arg_shifter
.consume_arg ();
576 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-Channel")) == 0)
578 this->register_event_channel_
= true;
579 // Register one EC with naming.
581 arg_shifter
.consume_arg ();
583 else if (0 != (current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-Notify_TPReactor"))))
585 if (TAO_debug_level
> 0)
587 ORBSVCS_DEBUG((LM_DEBUG
,
588 ACE_TEXT ("-Notify_TPReactor option is deprecated, ")
589 ACE_TEXT ("use -RunThreads option\n")));
592 this->nthreads_
= ACE_OS::atoi (current_arg
);
593 arg_shifter
.consume_arg ();
595 else if (0 != (current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-RunThreads"))))
597 this->nthreads_
= ACE_OS::atoi (current_arg
);
598 arg_shifter
.consume_arg ();
600 else if (0 != (current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-Timeout"))))
602 #if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
603 this->timeout_
= ACE_OS::atoi (current_arg
);
604 arg_shifter
.consume_arg ();
606 if (TAO_debug_level
> 0)
608 ORBSVCS_DEBUG((LM_DEBUG
,
609 ACE_TEXT ("WARNING: CORBA Messaging has been disabled.")
610 ACE_TExT ("The timeout will not be applied.\n")));
612 #endif /* TAO_HAS_CORBA_MESSAGING != 0 */
614 else if ((current_arg
= arg_shifter
.get_the_parameter (ACE_TEXT("-LoggingInterval"))))
616 this->logging_interval_
= ACE_Time_Value (ACE_OS::atoi (current_arg
));
617 arg_shifter
.consume_arg ();
619 else if (arg_shifter
.cur_arg_strncasecmp (ACE_TEXT("-?")) == 0)
621 ORBSVCS_DEBUG((LM_DEBUG
,
622 ACE_TEXT ("usage: %s -Factory factory_name ")
623 ACE_TEXT ("-Boot -[No]NameSvc ")
624 ACE_TEXT ("-IORoutput file_name ")
625 ACE_TEXT ("-Channel -ChannelName channel_name ")
626 ACE_TEXT ("-RunThreads threads ")
627 ACE_TEXT ("-Timeout <msec>\n")
628 ACE_TEXT ("-ShutdownORB 1|0")
629 ACE_TEXT ("-ShutdownDispatchingORB 1|0")
630 ACE_TEXT ("default: %s -Factory NotifyEventChannelFactory ")
631 ACE_TEXT ("-NameSvc -Channel NotifyEventChannel -ORBRunThreads 1\n"),
634 arg_shifter
.consume_arg ();
640 arg_shifter
.ignore_arg ();
646 /*****************************************************************/
647 LoggingWorker::LoggingWorker(TAO_Notify_Service_Driver
* ns
)
655 LoggingWorker::start ()
657 ACE_Logging_Strategy
* logging_strategy
=
658 ACE_Dynamic_Service
<ACE_Logging_Strategy
>::instance ("Logging_Strategy");
659 if (logging_strategy
== 0)
661 ORBSVCS_ERROR ((LM_ERROR
, ACE_TEXT ("(%P|%t) logging_strategy == 0\n")));
665 if (this->activate (THR_NEW_LWP
| THR_JOINABLE
, 1) == -1)
667 if (TAO_debug_level
> 0)
669 ORBSVCS_ERROR ((LM_ERROR
,
670 ACE_TEXT ("(%P|%t) Can not activate the ")
671 ACE_TEXT ("logging event thread\n")));
675 if (this->ns_
->logging_interval_
> ACE_Time_Value::zero
)
677 timer_id_
= this->ns_
->orb_
->orb_core()->reactor()->
678 schedule_timer (logging_strategy
, 0, this->ns_
->logging_interval_
,
679 this->ns_
->logging_interval_
);
682 ORBSVCS_ERROR ((LM_ERROR
,
683 ACE_TEXT("(%P|%t) Failed to schedule ")
684 ACE_TEXT("logging switch timer\n")));
692 LoggingWorker::svc (void)
694 if (TAO_debug_level
> 0)
696 ORBSVCS_DEBUG ((LM_DEBUG
,
697 ACE_TEXT ("(%P|%t) Running logging reactor \n")));
700 this->logging_reactor_
.run_event_loop();
706 LoggingWorker::end ()
710 this->logging_reactor_
.end_event_loop();
716 this->ns_
->orb_
->orb_core()->reactor()->
717 cancel_timer (timer_id_
);
722 Worker::Worker (void)
727 Worker::orb (CORBA::ORB_ptr orb
)
729 orb_
= CORBA::ORB::_duplicate (orb
);
736 // ACE_Thread::getprio() fails on systems that do not support thread
737 // priorities. While we could just treat the failure as benign, I'm
738 // just disabling it altogether. It doesn't provide much value, and
739 // makes service startup needlessly more verbose. See bugzilla 2477
742 ACE_hthread_t current
;
743 ACE_Thread::self (current
);
746 if (ACE_Thread::getprio (current
, priority
) == -1)
748 if (TAO_debug_level
> 0)
750 ORBSVCS_ERROR ((LM_ERROR
,
751 ACE_TEXT ("TAO (%P|%t) - Failed to get ")
752 ACE_TEXT ("Worker thread priority\n")));
757 if (TAO_debug_level
> 0)
759 ORBSVCS_DEBUG ((LM_DEBUG
,
760 ACE_TEXT ("Activated Worker Thread to run ")
761 ACE_TEXT ("the ORB @ priority:%d\n", priority
));
767 if (!CORBA::is_nil (this->orb_
.in ()))
772 catch (const CORBA::Exception
&)
778 ACE_STATIC_SVC_DEFINE (TAO_Notify_Service_Driver
,
779 ACE_TEXT ("TAO_Notify_Service_Driver"),
781 &ACE_SVC_NAME (TAO_Notify_Service_Driver
),
782 ACE_Service_Type::DELETE_THIS
| ACE_Service_Type::DELETE_OBJ
,
786 ACE_FACTORY_DEFINE (TAO_Notify_Service
, TAO_Notify_Service_Driver
)
789 #if defined (TAO_HAS_NOTIFICATION_MONITOR_CONTROL) && defined (TAO_AS_STATIC_LIBS)
790 ACE_STATIC_SVC_REQUIRE(TAO_MC_Notify_Service
)
791 ACE_STATIC_SVC_REQUIRE(TAO_MonitorAndControl
)
795 #if defined (TAO_AS_STATIC_LIBS)
796 ACE_STATIC_SVC_REQUIRE(ACE_Logging_Strategy
)