Merge pull request #1844 from jrw972/monterey
[ACE_TAO.git] / TAO / orbsvcs / Notify_Service / Notify_Service.cpp
blobb3f2afec4ac748d69ca244d1cc625e148d6e9b2e
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"
9 #include "tao/debug.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"
17 #endif
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)
35 : notify_service_ (0)
36 , bootstrap_ (false)
37 , use_name_svc_ (true)
38 , ior_output_file_name_ (0)
39 , notify_factory_name_ (NOTIFY_KEY)
40 , register_event_channel_ (false)
41 , nthreads_ (1)
42 , separate_dispatching_orb_ (false)
43 , timeout_ (0)
44 , logging_worker_(this)
45 , shutdown_orb_ (true)
46 , shutdown_dispatching_orb_ (true)
50 TAO_Notify_Service_Driver::~TAO_Notify_Service_Driver (void)
54 int
55 TAO_Notify_Service_Driver::init_ORB (int& argc, ACE_TCHAR *argv [])
57 this->orb_ = CORBA::ORB_init (argc, argv);
59 ACE_LOG_MSG->open
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"),
70 -1);
72 this->poa_ =
73 PortableServer::POA::_narrow (object.in ());
75 PortableServer::POAManager_var poa_manager =
76 this->poa_->the_POAManager ();
78 poa_manager->activate ();
80 return 0;
83 int
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 ());
90 return 0;
93 void
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"
100 CORBA::Any timeout;
101 TimeBase::TimeT value = 10000 * this->timeout_;
102 timeout <<= value;
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,
115 timeout);
116 policy_manager->set_policy_overrides (policy_list, CORBA::SET_OVERRIDE);
117 policy_list[0]->destroy ();
119 #else
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)
132 return -1;
134 // initalize the ORB.
135 if (this->init_ORB (argc, argv) != 0)
136 return -1;
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")));
148 return -1;
151 if (this->separate_dispatching_orb_)
153 if (this->init_dispatching_ORB (argc, argv) != 0)
155 return -1;
158 this->notify_service_->init_service2 (this->orb_.in (), this->dispatching_orb_.in());
160 else
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"),
173 this->nthreads_));
175 worker_.orb (this->orb_.in ());
177 // Task activation flags.
178 long const flags =
179 THR_NEW_LWP |
180 THR_JOINABLE |
181 this->orb_->orb_core ()->orb_params ()->thread_creation_flags ();
183 int const priority =
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 ();
201 if (ns_ret != 0)
202 return -1;
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"));
234 else
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,
282 initial_admin,
283 id);
285 else
287 ec = factory_impl->create_named_channel (
288 initial_qos, initial_admin,id,
289 (*ci).c_str ());
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 "
300 "service as: %C\n",
301 (*ci).c_str()));
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_,
315 ACE_TEXT("w"));
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"),
321 -1);
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"),
331 str.in ()));
334 return 0;
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"),
349 -1);
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"),
357 -1);
359 catch (...)
361 ORBSVCS_ERROR_RETURN ((LM_ERROR,
362 " (%P|%t) Unable to resolve the Naming Service.\n"),
363 -1);
365 return 0;
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"),
374 __FILE__));
376 if (this->nthreads_ > 0)
378 this->worker_.wait ();
379 return 0;
381 else
383 this->orb_->run ();
386 this->logging_worker_.end();
387 return 0;
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 ();
409 // Deactivate.
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 ();
443 // shutdown the ORB.
444 if (this->shutdown_orb_ && !CORBA::is_nil (orb.in ()))
446 orb->shutdown ();
449 // Make sure all worker threads are gone.
450 this->worker_.wait ();
451 this->logging_worker_.wait ();
453 // Destroy the ORB
454 if (this->shutdown_dispatching_orb_ && !CORBA::is_nil (dispatching_orb_.in ()))
456 dispatching_orb->destroy ();
459 // Destroy the ORB.
460 if (this->shutdown_orb_ && !CORBA::is_nil (orb.in ()))
462 orb->destroy ();
465 dispatching_orb_ = CORBA::ORB::_nil ();
467 worker_.orb (CORBA::ORB::_nil ());
469 orb = CORBA::ORB::_nil ();
471 return 0;
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));
531 else
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 ();
605 #else
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"),
632 argv[0], argv[0]));
634 arg_shifter.consume_arg ();
636 return -1;
638 else
640 arg_shifter.ignore_arg ();
643 return 0;
646 /*****************************************************************/
647 LoggingWorker::LoggingWorker(TAO_Notify_Service_Driver* ns)
648 : ns_ (ns),
649 started_ (false),
650 timer_id_ (-1)
654 void
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")));
663 else
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")));
674 else {
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_);
680 if (timer_id_ == -1)
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")));
699 started_ = true;
700 this->logging_reactor_.run_event_loop();
702 return 0;
705 void
706 LoggingWorker::end ()
708 if (started_)
710 this->logging_reactor_.end_event_loop();
711 this->wait ();
714 if (timer_id_ != -1)
716 this->ns_->orb_->orb_core()->reactor()->
717 cancel_timer (timer_id_);
718 timer_id_ = -1;
722 Worker::Worker (void)
726 void
727 Worker::orb (CORBA::ORB_ptr orb)
729 orb_ = CORBA::ORB::_duplicate (orb);
733 Worker::svc (void)
735 #if 0
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
740 // for details.
742 ACE_hthread_t current;
743 ACE_Thread::self (current);
745 int priority;
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")));
754 return -1;
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));
763 #endif
767 if (!CORBA::is_nil (this->orb_.in ()))
769 this->orb_->run ();
772 catch (const CORBA::Exception&)
775 return 0;
778 ACE_STATIC_SVC_DEFINE (TAO_Notify_Service_Driver,
779 ACE_TEXT ("TAO_Notify_Service_Driver"),
780 ACE_SVC_OBJ_T,
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)
792 #endif
795 #if defined (TAO_AS_STATIC_LIBS)
796 ACE_STATIC_SVC_REQUIRE(ACE_Logging_Strategy)
797 #endif