diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-06-10 15:49:42 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-06-10 15:49:42 +0000 |
commit | 7e06498a00bd2976f3058f1a94ffc0f4cd996e52 (patch) | |
tree | 1e1138ee8a9b8007302a900d82acade790477229 /TAO | |
parent | c12ff1c3223acbec6788e3cd01e56c0741b6f7e5 (diff) | |
download | ATCD-7e06498a00bd2976f3058f1a94ffc0f4cd996e52.tar.gz |
ChangeLogTag:Wed Jun 10 10:28:31 1998 Carlos O'Ryan <coryan@cs.wustl.edu>
Diffstat (limited to 'TAO')
-rw-r--r-- | TAO/ChangeLog-98c | 51 | ||||
-rw-r--r-- | TAO/TAO_IDL/driver/drv_preproc.cpp | 2 | ||||
-rw-r--r-- | TAO/examples/Simulator/Event_Supplier/Event_Sup.cpp | 46 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp | 203 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h | 101 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/Event_Channel.cpp | 214 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/Event_Channel.h | 36 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/Event_Channel.i | 4 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/Local_ESTypes.h | 13 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/RT_Task.cpp | 54 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event_Utilities.cpp | 56 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event_Utilities.i | 53 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl | 10 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp | 2 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Scheduler_Factory.h | 2 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.cpp | 77 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h | 2 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/EC_Multiple/svc.conf | 46 |
18 files changed, 640 insertions, 332 deletions
diff --git a/TAO/ChangeLog-98c b/TAO/ChangeLog-98c index dec5ec2dca2..e364d26b420 100644 --- a/TAO/ChangeLog-98c +++ b/TAO/ChangeLog-98c @@ -1,3 +1,54 @@ +Wed Jun 10 10:28:31 1998 Carlos O'Ryan <coryan@cs.wustl.edu> + + * orbsvcs/orbsvcs/Event/Event_Channel.h: + * orbsvcs/orbsvcs/Event/Event_Channel.i: + * orbsvcs/orbsvcs/Event/Event_Channel.cpp: + Added support to automatically create the publication and + subscription lists for the gateways. + + * orbsvcs/orbsvcs/RtecEventChannelAdmin.idl: + Added fields to the QOS structures so gateways can be + distinguished in the EC. + Several field names were inconsistent (some had a trailing _ and + others won't). + + * orbsvcs/orbsvcs/Event_Utilities.h: + * orbsvcs/orbsvcs/Event_Utilities.i: + Adapted to use the changes in the QOS structures. + + * orbsvcs/orbsvcs/Event/EC_Gateway.h: + * orbsvcs/orbsvcs/Event/EC_Gateway.cpp: + As part of the plan to support UDP and multicast gateways we + have a base class to handle all the different configurations for + a gateway. + + * orbsvcs/orbsvcs/Event/Local_ESTypes.h: + Removed a lot of BOAImpl typesdefs, they were completely + outdated and quite ugly. + + * orbsvcs/orbsvcs/Event/RT_Task.cpp: + Added code to call ORB_init() no each thread, but it is + commented out until we know what arguments to pass and how. + + * orbsvcs/orbsvcs/Scheduler_Factory.h: + * orbsvcs/orbsvcs/Runtime_Scheduler.cpp: + We cannot use enums in the POD_RTInfo because those are hard to + generate correctly. + + * orbsvcs/tests/EC_Multiple/svc.conf: + I'm starting to set a more realistic config for the Event + Channel, but we still have a lot of work to do in this area. + + * orbsvcs/tests/EC_Multiple/EC_Multiple.h: + * orbsvcs/tests/EC_Multiple/EC_Multiple.cpp: + The test uses the automatic gateway connection now. + + * orbsvcs/tests/Simulator/Event_Supplier/Event_Sup.cpp: + The ConsumerQOS and SupplierQOS structure have changed. + + * TAO_IDL/driver/drv_preproc.cpp: + Fixed type in comment. + Tue Jun 09 17:27:25 1998 Nanbor Wang <nanbor@cs.wustl.edu> * tao/Connect.{h,cpp} (activate): Added this method to diff --git a/TAO/TAO_IDL/driver/drv_preproc.cpp b/TAO/TAO_IDL/driver/drv_preproc.cpp index 32c74256d63..69c92c911ee 100644 --- a/TAO/TAO_IDL/driver/drv_preproc.cpp +++ b/TAO/TAO_IDL/driver/drv_preproc.cpp @@ -321,7 +321,7 @@ DRV_pre_proc(char *myfile) } (*DRV_FE_set_yyin)((File *) yyin); - // @@ TODO: This is not protable, cat(1) is a UNIX tool. + // @@ TODO: This is not portable, cat(1) is a UNIX tool. if (idl_global->compile_flags() & IDL_CF_ONLY_PREPROC) { sprintf(catbuf, "cat < %s", tmp_file); system(catbuf); diff --git a/TAO/examples/Simulator/Event_Supplier/Event_Sup.cpp b/TAO/examples/Simulator/Event_Supplier/Event_Sup.cpp index 36adeec054b..8de9220a1d8 100644 --- a/TAO/examples/Simulator/Event_Supplier/Event_Sup.cpp +++ b/TAO/examples/Simulator/Event_Supplier/Event_Sup.cpp @@ -130,37 +130,37 @@ Demo_Supplier::open_supplier (RtecEventChannelAdmin::EventChannel_ptr ec, CORBA::Short x = 0; RtecEventChannelAdmin::SupplierQOS qos_; - qos_.publications_.length (2); - qos_.publications_[0].event_.source_ = SOURCE_ID; - qos_.publications_[0].event_.type_ = ACE_ES_EVENT_NOTIFICATION; - qos_.publications_[0].event_.ttl_ = 1; - qos_.publications_[0].event_.creation_time_ = ORBSVCS_Time::zero; + qos_.publications.length (2); + qos_.publications[0].event.source_ = SOURCE_ID; + qos_.publications[0].event.type_ = ACE_ES_EVENT_NOTIFICATION; + qos_.publications[0].event.ttl_ = 1; + qos_.publications[0].event.creation_time_ = ORBSVCS_Time::zero; // default values - qos_.publications_[0].event_.ec_recv_time_ = ORBSVCS_Time::zero; - qos_.publications_[0].event_.ec_send_time_ = ORBSVCS_Time::zero; - qos_.publications_[0].event_.data_.x = 0; - qos_.publications_[0].event_.data_.y = 0; - qos_.publications_[0].event_.data_.any_value.replace (CORBA::_tc_short, + qos_.publications[0].event.ec_recv_time_ = ORBSVCS_Time::zero; + qos_.publications[0].event.ec_send_time_ = ORBSVCS_Time::zero; + qos_.publications[0].event.data_.x = 0; + qos_.publications[0].event.data_.y = 0; + qos_.publications[0].event.data_.any_value.replace (CORBA::_tc_short, &x, 0, TAO_TRY_ENV); - qos_.publications_[0].dependency_info_.number_of_calls = 1; - qos_.publications_[0].dependency_info_.rt_info = rt_info_; - qos_.publications_[1].event_.source_ = SOURCE_ID; - qos_.publications_[1].event_.type_ = ACE_ES_EVENT_SHUTDOWN; - qos_.publications_[1].event_.ttl_ = 1; - qos_.publications_[1].event_.creation_time_ = ORBSVCS_Time::zero; + qos_.publications[0].dependency_info.number_of_calls = 1; + qos_.publications[0].dependency_info.rt_info = rt_info_; + qos_.publications[1].event.source_ = SOURCE_ID; + qos_.publications[1].event.type_ = ACE_ES_EVENT_SHUTDOWN; + qos_.publications[1].event.ttl_ = 1; + qos_.publications[1].event.creation_time_ = ORBSVCS_Time::zero; // default values. - qos_.publications_[1].event_.ec_recv_time_ = ORBSVCS_Time::zero; - qos_.publications_[1].event_.ec_send_time_ = ORBSVCS_Time::zero; - qos_.publications_[1].event_.data_.x = 0; - qos_.publications_[1].event_.data_.y = 0; - qos_.publications_[1].event_.data_.any_value.replace (CORBA::_tc_short, + qos_.publications[1].event.ec_recv_time_ = ORBSVCS_Time::zero; + qos_.publications[1].event.ec_send_time_ = ORBSVCS_Time::zero; + qos_.publications[1].event.data_.x = 0; + qos_.publications[1].event.data_.y = 0; + qos_.publications[1].event.data_.any_value.replace (CORBA::_tc_short, &x, 0, TAO_TRY_ENV); - qos_.publications_[1].dependency_info_.number_of_calls = 1; - qos_.publications_[1].dependency_info_.rt_info = rt_info_; + qos_.publications[1].dependency_info.number_of_calls = 1; + qos_.publications[1].dependency_info.rt_info = rt_info_; // = Connect as a supplier. this->supplier_admin_ = diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp index d4b9f5a9826..8b04a747a10 100644 --- a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.cpp @@ -3,29 +3,92 @@ // #include "orbsvcs/Event/EC_Gateway.h" +#include "orbsvcs/Event_Utilities.h" +#include "orbsvcs/Time_Utilities.h" -TAO_EC_Gateway::TAO_EC_Gateway (void) +TAO_EC_Gateway::~TAO_EC_Gateway (void) +{ +} + +// **************************************************************** + +TAO_EC_Gateway_IIOP::TAO_EC_Gateway_IIOP (void) : consumer_ (this), supplier_ (this) { } -TAO_EC_Gateway::~TAO_EC_Gateway (void) +TAO_EC_Gateway_IIOP::~TAO_EC_Gateway_IIOP (void) { } -int -TAO_EC_Gateway::open (RtecEventChannelAdmin::EventChannel_ptr remote_ec, - RtecEventChannelAdmin::EventChannel_ptr local_ec, - const RtecEventChannelAdmin::ConsumerQOS& subscriptions, - const RtecEventChannelAdmin::SupplierQOS& publications, - CORBA::Environment &_env) +void +TAO_EC_Gateway_IIOP::init (RtecEventChannelAdmin::EventChannel_ptr rmt_ec, + RtecEventChannelAdmin::EventChannel_ptr lcl_ec, + RtecScheduler::Scheduler_ptr rmt_sched, + RtecScheduler::Scheduler_ptr lcl_sched, + const char* lcl_name, + const char* rmt_name, + CORBA::Environment &_env) +{ + this->rmt_ec_ = + RtecEventChannelAdmin::EventChannel::_duplicate (rmt_ec); + this->lcl_ec_ = + RtecEventChannelAdmin::EventChannel::_duplicate (lcl_ec); + + this->rmt_info_ = + rmt_sched->create (rmt_name, _env); + if (_env.exception () != 0) return; + + // @@ TODO Many things are hard-coded in the RT_Info here. + + // The worst case execution time is far less than 500 usecs, but + // that is a safe estimate.... + ACE_Time_Value tv (0, 500); + TimeBase::TimeT time; + ORBSVCS_Time::Time_Value_to_TimeT (time, tv); + rmt_sched->set (this->rmt_info_, + RtecScheduler::VERY_HIGH_CRITICALITY, + time, time, time, + 25000 * 10, + RtecScheduler::VERY_LOW_IMPORTANCE, + time, + 0, + RtecScheduler::OPERATION, + _env); + if (_env.exception () != 0) return; + + this->lcl_info_ = + lcl_sched->create (lcl_name, _env); + if (_env.exception () != 0) return; + + lcl_sched->set (this->lcl_info_, + RtecScheduler::VERY_HIGH_CRITICALITY, + time, time, time, + 25000 * 10, + RtecScheduler::VERY_LOW_IMPORTANCE, + time, + 1, + RtecScheduler::OPERATION, + _env); + if (_env.exception () != 0) return; + +} + +void +TAO_EC_Gateway_IIOP::open (const RtecEventChannelAdmin::ConsumerQOS& sub, + const RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment &_env) { TAO_TRY { + if (CORBA::is_nil (this->lcl_ec_.in ()) + || CORBA::is_nil (this->rmt_ec_.in ())) + return; + // = Connect as a supplier to the local EC RtecEventChannelAdmin::SupplierAdmin_var supplier_admin = - local_ec->for_suppliers (TAO_TRY_ENV); + this->lcl_ec_->for_suppliers (TAO_TRY_ENV); TAO_CHECK_ENV; this->consumer_proxy_ = @@ -36,13 +99,16 @@ TAO_EC_Gateway::open (RtecEventChannelAdmin::EventChannel_ptr remote_ec, this->supplier_._this (TAO_TRY_ENV); TAO_CHECK_ENV; + //ACE_DEBUG ((LM_DEBUG, "Gateway/Supplier ")); + //ACE_SupplierQOS_Factory::debug (pub); + this->consumer_proxy_->connect_push_supplier (supplier_ref.in (), - publications, + pub, TAO_TRY_ENV); TAO_CHECK_ENV; RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin = - remote_ec->for_consumers (TAO_TRY_ENV); + this->rmt_ec_->for_consumers (TAO_TRY_ENV); TAO_CHECK_ENV; this->supplier_proxy_ = @@ -53,40 +119,102 @@ TAO_EC_Gateway::open (RtecEventChannelAdmin::EventChannel_ptr remote_ec, this->consumer_._this (TAO_TRY_ENV); TAO_CHECK_ENV; + //ACE_DEBUG ((LM_DEBUG, "Gateway/Consumer ")); + //ACE_ConsumerQOS_Factory::debug (sub); + this->supplier_proxy_->connect_push_consumer (consumer_ref.in (), - subscriptions, + sub, TAO_TRY_ENV); TAO_CHECK_ENV; } TAO_CATCHANY { - TAO_TRY_ENV.print_exception ("TAO_EC_Gateway::open"); - TAO_RETHROW_RETURN (-1); + TAO_TRY_ENV.print_exception ("TAO_EC_Gateway_IIOP::open"); + this->consumer_proxy_ = 0; + this->supplier_proxy_ = 0; + + TAO_RETHROW; } TAO_ENDTRY; +} - return 0; +void +TAO_EC_Gateway_IIOP::close (CORBA::Environment &env) +{ + if (CORBA::is_nil (this->consumer_proxy_.in ()) + || CORBA::is_nil (this->supplier_proxy_.in ())) + return; + + this->consumer_proxy_->disconnect_push_consumer (env); + if (env.exception () != 0) return; + this->consumer_proxy_ = 0; + + this->supplier_proxy_->disconnect_push_supplier (env); + if (env.exception () != 0) return; + this->supplier_proxy_ = 0; } void -TAO_EC_Gateway::disconnect_push_consumer (CORBA::Environment &) +TAO_EC_Gateway_IIOP::update_consumer (RtecEventChannelAdmin::ConsumerQOS& sub, + RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment& env) +{ + this->close (env); + if (env.exception () != 0) return; + + for (CORBA::ULong i = 0; i < sub.dependencies.length (); ++i) + { + sub.dependencies[i].rt_info = this->rmt_info_; + } + + for (CORBA::ULong j = 0; j < pub.publications.length (); ++j) + { + pub.publications[j].dependency_info.rt_info = this->lcl_info_; + } + + this->open (sub, pub, env); +} + +void +TAO_EC_Gateway_IIOP::update_supplier (RtecEventChannelAdmin::ConsumerQOS& sub, + RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment& env) +{ + this->close (env); + if (env.exception () != 0) return; + + for (CORBA::ULong i = 0; i < sub.dependencies.length (); ++i) + { + sub.dependencies[i].rt_info = this->rmt_info_; + } + + for (CORBA::ULong j = 0; j < pub.publications.length (); ++j) + { + pub.publications[j].dependency_info.rt_info = this->lcl_info_; + } + + this->open (sub, pub, env); +} + +void +TAO_EC_Gateway_IIOP::disconnect_push_consumer (CORBA::Environment &) { ACE_DEBUG ((LM_DEBUG, - "Supplier-consumer received disconnect from channel.\n")); + "ECG: Supplier-consumer received disconnect from channel.\n")); } void -TAO_EC_Gateway::disconnect_push_supplier (CORBA::Environment &) +TAO_EC_Gateway_IIOP::disconnect_push_supplier (CORBA::Environment &) { ACE_DEBUG ((LM_DEBUG, - "Supplier received disconnect from channel.\n")); + "ECG: Supplier received disconnect from channel.\n")); } void -TAO_EC_Gateway::push (const RtecEventComm::EventSet &events, - CORBA::Environment & _env) +TAO_EC_Gateway_IIOP::push (const RtecEventComm::EventSet &events, + CORBA::Environment & _env) { - // ACE_DEBUG ((LM_DEBUG, "TAO_EC_Gateway::push - ")); + //ACE_DEBUG ((LM_DEBUG, "TAO_EC_Gateway_IIOP::push - ")); if (events.length () == 0) { @@ -94,7 +222,7 @@ TAO_EC_Gateway::push (const RtecEventComm::EventSet &events, return; } - // ACE_DEBUG ((LM_DEBUG, "ECP: %d event(s)\n", events.length ())); + //ACE_DEBUG ((LM_DEBUG, "ECP: %d event(s) - ", events.length ())); // @@ TODO, there is an extra data copy here, we should do the event // modification without it and only compact the necessary events. @@ -102,6 +230,7 @@ TAO_EC_Gateway::push (const RtecEventComm::EventSet &events, RtecEventComm::EventSet out (events.length ()); for (u_int i = 0; i < events.length (); ++i) { + //ACE_DEBUG ((LM_DEBUG, "type = %d ", events[i].type_)); if (events[i].ttl_ > 0) { count++; @@ -110,6 +239,7 @@ TAO_EC_Gateway::push (const RtecEventComm::EventSet &events, out[count - 1].ttl_--; } } + //ACE_DEBUG ((LM_DEBUG, "count = %d\n", count)); if (count > 0) { @@ -118,30 +248,21 @@ TAO_EC_Gateway::push (const RtecEventComm::EventSet &events, } int -TAO_EC_Gateway::shutdown (CORBA::Environment& _env) +TAO_EC_Gateway_IIOP::shutdown (CORBA::Environment& _env) { - TAO_TRY - { - this->consumer_proxy_->disconnect_push_consumer (TAO_TRY_ENV); - TAO_CHECK_ENV; + this->close (_env); + if (_env.exception () == 0) return -1; - // Disconnect from the push supplier. - this->supplier_proxy_->disconnect_push_supplier (TAO_TRY_ENV); - TAO_CHECK_ENV; - } - TAO_CATCHANY - { - TAO_RETHROW_RETURN(-1); - } - TAO_ENDTRY; + this->lcl_ec_ = 0; + this->rmt_ec_ = 0; return 0; } #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_PushConsumer_Adapter<TAO_EC_Gateway>; -template class ACE_PushSupplier_Adapter<TAO_EC_Gateway>; +template class ACE_PushConsumer_Adapter<TAO_EC_Gateway_IIOP>; +template class ACE_PushSupplier_Adapter<TAO_EC_Gateway_IIOP>; #elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_PushConsumer_Adapter<TAO_EC_Gateway> -#pragma instantiate ACE_PushSupplier_Adapter<TAO_EC_Gateway> +#pragma instantiate ACE_PushConsumer_Adapter<TAO_EC_Gateway_IIOP> +#pragma instantiate ACE_PushSupplier_Adapter<TAO_EC_Gateway_IIOP> #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h index 1548007555f..a37ccc7d400 100644 --- a/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h +++ b/TAO/orbsvcs/orbsvcs/Event/EC_Gateway.h @@ -38,9 +38,57 @@ #include "orbsvcs/Channel_Clients_T.h" class TAO_ORBSVCS_Export TAO_EC_Gateway +{ + // = TITLE + // Event Channel Gateway + // + // = DESCRIPTION + // There are several ways to connect several EC together, for + // instance: + // + A single class can use normal IIOP and connect to one EC as + // a supplier and to another EC as a consumer. + // + A class connects as a consumer and transmit the events using + // multicast, another class receives the multicast messages and + // transform them back into a push() call. + // + // This is an abstract class to represent all the different + // strategies for EC distribution. + // +public: + virtual ~TAO_EC_Gateway (void); + // Destructor + + virtual void open (const RtecEventChannelAdmin::ConsumerQOS& subscriptions, + const RtecEventChannelAdmin::SupplierQOS& publications, + CORBA::Environment& env) = 0; + // This method is invoked to create the first connection to the ECs + + virtual void close (CORBA::Environment& env) = 0; + // The gateway must disconnect from all the relevant event channels, + // or any other communication media (such as multicast groups). + + virtual void update_consumer (RtecEventChannelAdmin::ConsumerQOS& sub, + RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment& env) = 0; + // The subscription list in the managing EC has changed, thus the + // gateway must reconnect (or update its connection) to the remote + // EC. The SupplierQOS can be used if the gateway also connect as a + // consumer. + + virtual void update_supplier (RtecEventChannelAdmin::ConsumerQOS& sub, + RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment& env) = 0; + // The publication list in the managing EC has changed, thus the + // gateway must reconnect (or update its connection) to the remote + // EC. The ConsumerQOS can be used if the gateway also connect as a + // consumer. +}; + +// **************************************************************** +class TAO_ORBSVCS_Export TAO_EC_Gateway_IIOP : public TAO_EC_Gateway // // = TITLE -// Event Channel Gateway. +// Event Channel Gateway using IIOP. // // = DESCRIPTION // This class mediates among two event channels, it connects as a @@ -67,16 +115,22 @@ class TAO_ORBSVCS_Export TAO_EC_Gateway // { public: - TAO_EC_Gateway (void); - ~TAO_EC_Gateway (void); - - int open (RtecEventChannelAdmin::EventChannel_ptr remote_ec, - RtecEventChannelAdmin::EventChannel_ptr local_ec, - const RtecEventChannelAdmin::ConsumerQOS& subscriptions, - const RtecEventChannelAdmin::SupplierQOS& publications, - CORBA::Environment &_env); - // Establish the connections. - + TAO_EC_Gateway_IIOP (void); + ~TAO_EC_Gateway_IIOP (void); + + void init (RtecEventChannelAdmin::EventChannel_ptr rmt_ec, + RtecEventChannelAdmin::EventChannel_ptr lcl_ec, + RtecScheduler::Scheduler_ptr rmt_sched, + RtecScheduler::Scheduler_ptr lcl_sched, + const char* lcl_name, + const char* rmt_name, + CORBA::Environment &_env); + // To do its job this class requires to know the local and remote + // ECs it will connect to; furthermore it also requires to build + // RT_Infos for the local and remote schedulers. + // @@ TODO part of the RT_Info is hardcoded, we need to make it + // parametric. + void disconnect_push_supplier (CORBA::Environment &); // The channel is disconnecting. @@ -89,12 +143,33 @@ public: // local event channel. int shutdown (CORBA::Environment&); + // Disconnect and shutdown the gateway + + // The following methods are documented in the base class. + virtual void open (const RtecEventChannelAdmin::ConsumerQOS& subscriptions, + const RtecEventChannelAdmin::SupplierQOS& publications, + CORBA::Environment &_env); + virtual void close (CORBA::Environment& _env); + virtual void update_consumer (RtecEventChannelAdmin::ConsumerQOS& sub, + RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment& env); + virtual void update_supplier (RtecEventChannelAdmin::ConsumerQOS& sub, + RtecEventChannelAdmin::SupplierQOS& pub, + CORBA::Environment& env); private: - ACE_PushConsumer_Adapter<TAO_EC_Gateway> consumer_; + RtecEventChannelAdmin::EventChannel_var rmt_ec_; + RtecEventChannelAdmin::EventChannel_var lcl_ec_; + // The remote and the local EC, so we can reconnect when the list changes. + + RtecScheduler::handle_t rmt_info_; + RtecScheduler::handle_t lcl_info_; + // Our local and remote RT_Infos. + + ACE_PushConsumer_Adapter<TAO_EC_Gateway_IIOP> consumer_; // Our consumer personality.... - ACE_PushSupplier_Adapter<TAO_EC_Gateway> supplier_; + ACE_PushSupplier_Adapter<TAO_EC_Gateway_IIOP> supplier_; // Our supplier personality.... RtecEventChannelAdmin::ProxyPushConsumer_var consumer_proxy_; diff --git a/TAO/orbsvcs/orbsvcs/Event/Event_Channel.cpp b/TAO/orbsvcs/orbsvcs/Event/Event_Channel.cpp index 95f84eab785..e4dcc37258b 100644 --- a/TAO/orbsvcs/orbsvcs/Event/Event_Channel.cpp +++ b/TAO/orbsvcs/orbsvcs/Event/Event_Channel.cpp @@ -2,9 +2,11 @@ #include "ace/Service_Config.h" #include "orbsvcs/Scheduler_Factory.h" +#include "orbsvcs/Event_Utilities.h" #include "Dispatching_Modules.h" #include "Memory_Pools.h" +#include "EC_Gateway.h" #include "Event_Channel.h" // These are to save space. @@ -159,7 +161,7 @@ public: ACE_ES_Dependency_Iterator iter (consumer->qos ().dependencies); while (iter.advance_dependency () == 0) { - RtecEventComm::EventType &type = (*iter).event_.type_; + RtecEventComm::EventType &type = (*iter).event.type_; if (type != ACE_ES_GLOBAL_DESIGNATOR && type != ACE_ES_CONJUNCTION_DESIGNATOR && type != ACE_ES_DISJUNCTION_DESIGNATOR) @@ -442,20 +444,21 @@ ACE_Push_Supplier_Proxy::connect_push_supplier (RtecEventComm::PushSupplier_ptr if (this->connected ()) TAO_THROW (RtecEventChannelAdmin::AlreadyConnected); - push_supplier_ = + this->push_supplier_ = RtecEventComm::PushSupplier::_duplicate(push_supplier); - // ACE_SupplierQOS_Factory::debug (qos); + //ACE_DEBUG ((LM_DEBUG, "connect_push_supplier QOS is ")); + //ACE_SupplierQOS_Factory::debug (qos); // Copy by value. - qos_ = qos; + this->qos_ = qos; // ACE_SupplierQOS_Factory::debug (qos_); // @@ TODO: The SupplierQOS should have a more reasonable interface to // obtain the supplier_id(), BTW, a callback to push_supplier will // not work: it usually results in some form of dead-lock. - source_id_ = qos_.publications_[0].event_.source_; + this->source_id_ = qos_.publications[0].event.source_; supplier_module_->connected (this, _env); } @@ -550,19 +553,20 @@ ACE_Push_Consumer_Proxy::connect_push_consumer (RtecEventComm::PushConsumer_ptr if (this->connected ()) TAO_THROW (RtecEventChannelAdmin::AlreadyConnected); - push_consumer_ = + this->push_consumer_ = RtecEventComm::PushConsumer::_duplicate(push_consumer); // @@ TODO Find out why are two duplicates needed... RtecEventComm::PushConsumer::_duplicate(push_consumer); - // ACE_ConsumerQOS_Factory::debug (qos); + //ACE_DEBUG ((LM_DEBUG, "connect_push_consumer QOS is ")); + //ACE_ConsumerQOS_Factory::debug (qos); // Copy by value. - qos_ = qos; + this->qos_ = qos; // ACE_ConsumerQOS_Factory::debug (qos_); - consumer_module_->connected (this, _env); + this->consumer_module_->connected (this, _env); } void @@ -738,6 +742,48 @@ ACE_EventChannel::report_disconnect_i (u_long event) ACE_DEBUG ((LM_DEBUG, "(%t) Event Channel has no consumers or suppliers.\n")); } +void +ACE_EventChannel::add_gateway (TAO_EC_Gateway* gw) +{ + this->gwys_.insert (gw); +} + +void +ACE_EventChannel::del_gateway (TAO_EC_Gateway* gw) +{ + this->gwys_.remove (gw); +} + +void +ACE_EventChannel::update_consumer_gwys (CORBA::Environment& _env) +{ + if (this->gwys_.is_empty ()) + return; + + ACE_DEBUG ((LM_DEBUG, "Event_Channel::update_consumer_gwys\n")); + + RtecEventChannelAdmin::ConsumerQOS c_qos; + RtecEventChannelAdmin::SupplierQOS s_qos; + this->consumer_module_->fill_qos (c_qos, s_qos); + for (Gateway_Set_Iterator i = this->gwys_.begin (); + i != this->gwys_.end (); + ++i) + { + TAO_EC_Gateway* gw = *i; + gw->update_consumer (c_qos, s_qos, _env); + if (_env.exception () != 0) return; + } +} + +void +ACE_EventChannel::update_supplier_gwys (CORBA::Environment&) +{ + if (this->gwys_.is_empty ()) + return; +} + +// **************************************************************** + ACE_ES_Disjunction_Group::~ACE_ES_Disjunction_Group (void) { } @@ -971,8 +1017,11 @@ void ACE_ES_Consumer_Module::connected (ACE_Push_Consumer_Proxy *consumer, CORBA::Environment &_env) { - channel_->report_connect (ACE_EventChannel::CONSUMER); - down_->connected (consumer, _env); + this->channel_->report_connect (ACE_EventChannel::CONSUMER); + this->down_->connected (consumer, _env); + if (_env.exception () != 0) return; + if (!consumer->qos ().is_gateway) + this->channel_->update_consumer_gwys (_env); } void @@ -1105,6 +1154,9 @@ ACE_ES_Consumer_Module::disconnecting (ACE_Push_Consumer_Proxy *consumer, delete sc; delete act; } + + if (!consumer->qos ().is_gateway) + this->channel_->update_consumer_gwys (_env); } // This method executes in the same thread of control that will hand @@ -1162,6 +1214,81 @@ ACE_ES_Consumer_Module::obtain_push_supplier (CORBA::Environment &_env) return new_consumer->get_ref (); } +void +ACE_ES_Consumer_Module::fill_qos (RtecEventChannelAdmin::ConsumerQOS& c_qos, + RtecEventChannelAdmin::SupplierQOS& s_qos) +{ + ACE_GUARD (ACE_ES_MUTEX, ace_mon, this->lock_); + + c_qos.is_gateway = CORBA::B_TRUE; + s_qos.is_gateway = CORBA::B_TRUE; + + int count = 0; + { + for (Consumer_Iterator i = this->all_consumers_.begin (); + i != this->all_consumers_.end (); + ++i) + { + ACE_Push_Consumer_Proxy *c = *i; + + if (c->qos ().is_gateway) + continue; + + count += c->qos ().dependencies.length (); + } + } + + c_qos.dependencies.length (count + 1); + s_qos.publications.length (count); + + int cc = 0; + int sc = 0; + c_qos.dependencies[cc].event.type_ = ACE_ES_DISJUNCTION_DESIGNATOR; + c_qos.dependencies[cc].event.source_ = 0; + c_qos.dependencies[cc].event.creation_time_ = ORBSVCS_Time::zero; + c_qos.dependencies[cc].rt_info = 0; + cc++; + + for (Consumer_Iterator i = this->all_consumers_.begin (); + i != this->all_consumers_.end (); + ++i) + { + ACE_Push_Consumer_Proxy *c = *i; + + if (c->qos ().is_gateway) + continue; + + CORBA::ULong count = c->qos ().dependencies.length (); + for (CORBA::ULong j = 0; j < count; ++j) + { + RtecEventComm::Event& event = + c->qos ().dependencies[j].event; + + RtecEventComm::EventType type = event.type_; + if (type <= ACE_ES_EVENT_UNDEFINED) + continue; + + c_qos.dependencies[cc].event.type_ = event.type_; + c_qos.dependencies[cc].event.source_ = event.source_; + c_qos.dependencies[cc].event.creation_time_ = ORBSVCS_Time::zero; + // The RT_Info is filled up later. + c_qos.dependencies[cc].rt_info = 0; + cc++; + + s_qos.publications[sc].event.type_ = event.type_; + s_qos.publications[sc].event.source_ = event.source_; + s_qos.publications[sc].event.creation_time_ = ORBSVCS_Time::zero; + s_qos.publications[sc].dependency_info.dependency_type = + RtecScheduler::TWO_WAY_CALL; + s_qos.publications[sc].dependency_info.number_of_calls = 1; + s_qos.publications[sc].dependency_info.rt_info = 0; + sc++; + } + } + c_qos.dependencies.length (cc); + s_qos.publications.length (sc); +} + // ************************************************************ ACE_ES_Correlation_Module::ACE_ES_Correlation_Module (ACE_EventChannel *channel) @@ -1236,9 +1363,9 @@ int ACE_ES_Correlation_Module::schedule_timeout (ACE_ES_Consumer_Rep_Timeout *consumer) { RtecEventComm::Time &interval = - consumer->dependency ()->event_.creation_time_; + consumer->dependency ()->event.creation_time_; RtecEventComm::Time &delay = - consumer->dependency ()->event_.creation_time_; + consumer->dependency ()->event.creation_time_; // Store the preemption priority so we can cancel the correct timer. // The priority values may change during the process lifetime (e.g., @@ -1290,9 +1417,9 @@ ACE_ES_Correlation_Module::reschedule_timeout (ACE_ES_Consumer_Rep_Timeout *cons else { RtecEventComm::Time &interval = - consumer->dependency ()->event_.creation_time_; + consumer->dependency ()->event.creation_time_; RtecEventComm::Time &delay = - consumer->dependency ()->event_.creation_time_; + consumer->dependency ()->event.creation_time_; // Store the preemption priority so we can cancel the correct timer. // The priority values may change during the process lifetime (e.g., @@ -1431,7 +1558,7 @@ ACE_ES_Consumer_Correlation::connected (ACE_Push_Consumer_Proxy *consumer, consumer_ = consumer; // for (CORBA_Types::ULong index=0; index < consumer->qos ().dependencies_.length (); index++) - // consumer->qos ().dependencies_[index].event_.dump (); + // consumer->qos ().dependencies_[index].event.dump (); ACE_ES_Dependency_Iterator iter (consumer->qos ().dependencies); iter.parse (); @@ -1450,7 +1577,7 @@ ACE_ES_Consumer_Correlation::connected (ACE_Push_Consumer_Proxy *consumer, // Keep track of how many conjunction and disjunction groups are // registered. Update the index pointers so that the helper // functions can update the appropriate group objects. - switch ((*iter).event_.type_) + switch ((*iter).event.type_) { case ACE_ES_CONJUNCTION_DESIGNATOR: cgroup_index++; @@ -1506,10 +1633,10 @@ ACE_ES_Consumer_Correlation::connected (ACE_Push_Consumer_Proxy *consumer, switch (group_type) { case ACE_ES_CONJUNCTION_DESIGNATOR: - conjunction_groups_[cgroup_index].set_act ((*iter).event_); + conjunction_groups_[cgroup_index].set_act ((*iter).event); break; case ACE_ES_DISJUNCTION_DESIGNATOR: - disjunction_groups_[cgroup_index].set_act ((*iter).event_); + disjunction_groups_[cgroup_index].set_act ((*iter).event); break; case ACE_ES_GLOBAL_DESIGNATOR: default: @@ -1622,11 +1749,11 @@ ACE_ES_Consumer_Correlation::get_consumer_rep (RtecEventChannelAdmin::Dependency // Step through all existing consumer reps. for (int x=0; x < crep_index; x++) { - RtecEventComm::Event& e = consumer_reps_[x]->dependency ()->event_; + RtecEventComm::Event& e = consumer_reps_[x]->dependency ()->event; // If <dependency> matches any previously subscribed consumer // reps, we'll reuse it. - if (e.type_ == dependency.event_.type_ - && e.source_ == dependency.event_.source_ ) + if (e.type_ == dependency.event.type_ + && e.source_ == dependency.event.source_ ) { rep = consumer_reps_[x]; break; @@ -1908,9 +2035,10 @@ ACE_ES_Subscription_Module::connected (ACE_Push_Supplier_Proxy *supplier, // For every type that this supplier generates, bind a new // Type_Subscribers to the type in the supplier proxy's type // collection. - RtecEventChannelAdmin::PublicationSet &publications = supplier->qos ().publications_; + RtecEventChannelAdmin::PublicationSet &publications = + supplier->qos ().publications; - sid = publications[0].event_.source_; + sid = publications[0].event.source_; for (CORBA::ULong index=0; index < publications.length (); index++) { // Check to make sure an RT_Info was specified. @@ -1923,10 +2051,11 @@ ACE_ES_Subscription_Module::connected (ACE_Push_Supplier_Proxy *supplier, } #endif - RtecEventComm::EventType &event_type = - publications[index].event_.type_; + RtecEventComm::EventType event_type = + publications[index].event.type_; - // Check to make sure a type was specified. + // @@ TODO we should throw something Check to make sure a type + // was specified. if (event_type == ACE_ES_EVENT_ANY) { ACE_ERROR ((LM_ERROR, "ACE_ES_Subscription_Module::connected: " @@ -1939,7 +2068,7 @@ ACE_ES_Subscription_Module::connected (ACE_Push_Supplier_Proxy *supplier, // This object will hold all the consumers that subscribe to // this publication. ACE_ES_Subscription_Info::Type_Subscribers *new_subscribers = - new ACE_ES_Subscription_Info::Type_Subscribers (&(publications[index].dependency_info_)); + new ACE_ES_Subscription_Info::Type_Subscribers (&(publications[index].dependency_info)); if (new_subscribers == 0) { @@ -1950,7 +2079,7 @@ ACE_ES_Subscription_Module::connected (ACE_Push_Supplier_Proxy *supplier, // Check the global type collection for consumers that register // before suppliers. ACE_ES_Subscription_Info::Type_Subscribers *existing_subscribers; - if (type_subscribers_.find (event_type, existing_subscribers) == 0) + if (type_subscribers_.find (event_type, existing_subscribers) != -1) { // Iterate through existing subscribers. ACE_ES_Subscription_Info::Subscriber_Set_Iterator iter (existing_subscribers->consumers_); @@ -1982,6 +2111,12 @@ ACE_ES_Subscription_Module::connected (ACE_Push_Supplier_Proxy *supplier, } } } +#if 0 + else + { + //ACE_DEBUG ((LM_DEBUG, "No consumers for type %d\n", event_type)); + } +#endif // Put the new subscribers for this event type in the supplier // proxy's type map. @@ -2350,12 +2485,19 @@ int ACE_ES_Subscription_Module::subscribe_type (ACE_ES_Consumer_Rep *consumer, RtecEventComm::EventType type) { + // ACE_DEBUG ((LM_DEBUG, + // "Subscription_Module::subscribe_type - %d\n", type)); + // First insert <consumer> into the global type collection set // corresponding to <type>. The type collection will only be used // when suppliers register late. if (ACE_ES_Subscription_Info::insert_or_allocate (type_subscribers_, consumer, type) == -1) - return -1; + { + ACE_ERROR_RETURN ((LM_ERROR, + "Subscription_Module - insert_or_allocate failed\n"), + -1); + } consumer->_duplicate (); @@ -2502,7 +2644,7 @@ ACE_ES_Subscription_Module::subscribe (ACE_ES_Consumer_Rep *consumer) "ACE_ES_Subscription_Module::subscribe"), -1); int result = 0; - RtecEventComm::Event &event = consumer->dependency ()->event_; + RtecEventComm::Event &event = consumer->dependency ()->event; if (event.source_ == 0) // Not source-based subscription. @@ -2536,7 +2678,7 @@ ACE_ES_Subscription_Module::unsubscribe (ACE_ES_Consumer_Rep *consumer) ACE_ERROR_RETURN ((LM_ERROR, "%p.\n", "ACE_ES_Subscription_Module::unsubscribe"), -1); - RtecEventComm::Event &event = consumer->dependency ()->event_; + RtecEventComm::Event &event = consumer->dependency ()->event; if (event.type_ != ACE_ES_EVENT_ANY) { @@ -3036,6 +3178,10 @@ template class ACE_ES_Simple_Array<ACE_ES_Consumer_Rep *, 100>; template class ACE_CORBA_var<ACE_ES_Event_Container>; +template class ACE_Node<ACE_EC_Gateway*>; +template class ACE_Unbounded_Set<ACE_EC_Gateway*>; +template class ACE_Unbounded_Set_Iterator<ACE_EC_Gateway*>; + #elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) #pragma instantiate ACE_Atomic_Op<ACE_ES_MUTEX, int> @@ -3070,4 +3216,8 @@ template class ACE_CORBA_var<ACE_ES_Event_Container>; #pragma instantiate ACE_ES_Simple_Array<ACE_ES_Consumer_Rep *, 100> #pragma instantiate ACE_CORBA_var<ACE_ES_Event_Container> +#pragma instantiate ACE_Node<ACE_EC_Gateway*> +#pragma instantiate ACE_Unbounded_Set<ACE_EC_Gateway*> +#pragma instantiate ACE_Unbounded_Set_Iterator<ACE_EC_Gateway*> + #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/orbsvcs/orbsvcs/Event/Event_Channel.h b/TAO/orbsvcs/orbsvcs/Event/Event_Channel.h index ddae8883473..2ea233f6912 100644 --- a/TAO/orbsvcs/orbsvcs/Event/Event_Channel.h +++ b/TAO/orbsvcs/orbsvcs/Event/Event_Channel.h @@ -160,8 +160,11 @@ class ACE_ES_Supplier_Module; class ACE_ES_Dispatching_Base; typedef ACE_ES_Dispatching_Base ACE_ES_Dispatching_Module; +class TAO_EC_Gateway; +// Forward declare the class used to connect several EC together. + // ec.. -class TAO_ORBSVCS_Export ACE_EventChannel : public RtecEventChannelAdmin_EventChannelBOAImpl +class TAO_ORBSVCS_Export ACE_EventChannel : public POA_RtecEventChannelAdmin::EventChannel // = TITLE // ACE Event Channel. // @@ -228,6 +231,15 @@ public: void report_disconnect_i (u_long); // Consumer or supplier disconnected. + void add_gateway (TAO_EC_Gateway* gw); + void del_gateway (TAO_EC_Gateway* gw); + // Add and remove gateways from the EC. + + void update_consumer_gwys (CORBA::Environment& _env); + void update_supplier_gwys (CORBA::Environment& _env); + // The consumer (or supplier) list has changed, thus the EC has to + // inform any gateways it has. + // TODO: currently we only support consumer gateways. private: ACE_RTU_Manager *rtu_manager_; @@ -244,6 +256,12 @@ private: int destroyed_; // Ensures this->destory is executed only once. + + typedef ACE_Unbounded_Set<TAO_EC_Gateway*> Gateway_Set; + typedef ACE_Unbounded_Set_Iterator<TAO_EC_Gateway*> Gateway_Set_Iterator; + + Gateway_Set gwys_; + // Keep the set of Gateways, i.e. connections to peer EC. }; // ************************************************************ @@ -690,7 +708,7 @@ public: class ACE_ES_Dispatch_Request; class ACE_Push_Consumer_Proxy; -class TAO_ORBSVCS_Export ACE_ES_Consumer_Correlation : public RtecEventComm_PushSupplierBOAImpl +class TAO_ORBSVCS_Export ACE_ES_Consumer_Correlation : public POA_RtecEventComm::PushSupplier // = TITLE // Event Service Consumer_Correlation // @@ -821,7 +839,7 @@ public: // Forward declarations. class ACE_ES_Dispatch_Request; -class TAO_ORBSVCS_Export ACE_ES_Consumer_Module : public RtecEventChannelAdmin_ConsumerAdminBOAImpl +class TAO_ORBSVCS_Export ACE_ES_Consumer_Module : public POA_RtecEventChannelAdmin::ConsumerAdmin // = TITLE // Event Service Consumer Module // @@ -860,6 +878,12 @@ public: void shutdown (void); // Actively disconnect from all consumers. + void fill_qos (RtecEventChannelAdmin::ConsumerQOS& c_qos, + RtecEventChannelAdmin::SupplierQOS& s_qos); + // Fill the QoS factories with the disjuction off all the + // subscriptions in this EC. + // It leaves the gateways out of the list. + private: typedef ACE_Unbounded_Set_Iterator<ACE_Push_Consumer_Proxy *> Consumer_Iterator; typedef ACE_Unbounded_Set<ACE_Push_Consumer_Proxy *> Consumers; @@ -1086,7 +1110,7 @@ private: // ************************************************************ -class TAO_ORBSVCS_Export ACE_ES_Supplier_Module : public RtecEventChannelAdmin_SupplierAdminBOAImpl +class TAO_ORBSVCS_Export ACE_ES_Supplier_Module : public POA_RtecEventChannelAdmin::SupplierAdmin // = TITLE // Event Service Supplier Proxy Module // @@ -1147,7 +1171,7 @@ class ACE_EventChannel; // = Event Channel interfaces. -class TAO_ORBSVCS_Export ACE_Push_Supplier_Proxy : public RtecEventChannelAdmin_ProxyPushConsumerBOAImpl +class TAO_ORBSVCS_Export ACE_Push_Supplier_Proxy : public POA_RtecEventChannelAdmin::ProxyPushConsumer // = TITLE // Push Supplier Proxy. // @@ -1220,7 +1244,7 @@ private: // ************************************************************ -class TAO_ORBSVCS_Export ACE_Push_Consumer_Proxy : public RtecEventChannelAdmin_ProxyPushSupplierBOAImpl +class TAO_ORBSVCS_Export ACE_Push_Consumer_Proxy : public POA_RtecEventChannelAdmin::ProxyPushSupplier // = TITLE // Push Consumer Proxy. // diff --git a/TAO/orbsvcs/orbsvcs/Event/Event_Channel.i b/TAO/orbsvcs/orbsvcs/Event/Event_Channel.i index 515468b5dd4..b61fac30645 100644 --- a/TAO/orbsvcs/orbsvcs/Event/Event_Channel.i +++ b/TAO/orbsvcs/orbsvcs/Event/Event_Channel.i @@ -447,7 +447,7 @@ ACE_INLINE void ACE_ES_Consumer_Rep_Timeout::init (ACE_ES_Consumer_Correlation *correlation, RtecEventChannelAdmin::Dependency &dep) { - ACE_ES_Event_Container *temp = new ACE_ES_Event_Container (dep.event_); + ACE_ES_Event_Container *temp = new ACE_ES_Event_Container (dep.event); if (temp == 0) { ACE_ERROR ((LM_ERROR, "%p.\n", "ACE_ES_Consumer_Rep_Timeout::init")); @@ -544,7 +544,7 @@ ACE_ES_Dependency_Iterator::parse (void) if (rt_info_ == 0) rt_info_ = rep_[x].rt_info; - switch (rep_[x].event_.type_) + switch (rep_[x].event.type_) { case ACE_ES_CONJUNCTION_DESIGNATOR: n_conjunctions_++; diff --git a/TAO/orbsvcs/orbsvcs/Event/Local_ESTypes.h b/TAO/orbsvcs/orbsvcs/Event/Local_ESTypes.h index bf34edee6cc..cc37eb01d12 100644 --- a/TAO/orbsvcs/orbsvcs/Event/Local_ESTypes.h +++ b/TAO/orbsvcs/orbsvcs/Event/Local_ESTypes.h @@ -40,20 +40,7 @@ // These are to help MSVC++ 4.2 deal with inheritence of nested types. // Not needed for Sun C++ or MSVC++ 5.0. -// @@ NOTE: TAO uses the POA mapping instead of the old BOA, but all the -// code still uses the BOA name for the skeleton classes, to speed up -// porting we keep to old names. - typedef RtecEventComm::Event RtecEventComm_Event; -typedef POA_RtecScheduler::Scheduler RtecScheduler_SchedulerBOAImpl; -typedef POA_RtecEventChannelAdmin::EventChannel RtecEventChannelAdmin_EventChannelBOAImpl; -typedef POA_RtecEventComm::PushSupplier RtecEventComm_PushSupplierBOAImpl; -typedef POA_RtecEventChannelAdmin::ConsumerAdmin RtecEventChannelAdmin_ConsumerAdminBOAImpl; -typedef POA_RtecEventChannelAdmin::SupplierAdmin RtecEventChannelAdmin_SupplierAdminBOAImpl; -typedef POA_RtecEventChannelAdmin::ProxyPushConsumer RtecEventChannelAdmin_ProxyPushConsumerBOAImpl; -typedef POA_RtecEventChannelAdmin::ProxyPushSupplier RtecEventChannelAdmin_ProxyPushSupplierBOAImpl; -typedef POA_RtecEventComm::PushConsumer RtecEventComm_PushConsumerBOAImpl; -typedef POA_RtecEventComm::PushSupplier RtecEventComm_PushSupplierBOAImpl; #if defined (__ACE_INLINE__) #include "Local_ESTypes.i" diff --git a/TAO/orbsvcs/orbsvcs/Event/RT_Task.cpp b/TAO/orbsvcs/orbsvcs/Event/RT_Task.cpp index 836ae2d70e6..ed03bd5bc73 100644 --- a/TAO/orbsvcs/orbsvcs/Event/RT_Task.cpp +++ b/TAO/orbsvcs/orbsvcs/Event/RT_Task.cpp @@ -84,10 +84,21 @@ ACE_RT_Task::~ACE_RT_Task (void) int ACE_RT_Task::svc (void) { - // @@ TODO It may be necessary to call ORB init here... - TAO_TRY { + // @@ TODO It may be necessary to pass the options to this class + +#if 0 + static char* const argv[] = { + "task", + "-ORBport", "0", + }; + int argc = sizeof (argv)/sizeof (argv[0]); + CORBA::ORB_var orb = + CORBA::ORB_init (argc, argv, "", TAO_TRY_ENV); + TAO_CHECK_ENV; +#endif + RtecScheduler::OS_Priority thread_priority; RtecScheduler::Preemption_Subpriority subpriority; RtecScheduler::Preemption_Priority preemption_priority; @@ -100,35 +111,36 @@ ACE_RT_Task::svc (void) TAO_CHECK_ENV; if (ACE_OS::thr_setprio (thread_priority) == -1) { - ACE_ERROR ((LM_ERROR, "(%P|%t) main thr_setprio failed\n")); + ACE_ERROR ((LM_ERROR, "(%P|%t) RT_Task thr_setprio failed\n")); } - } - TAO_CATCHANY - { - ACE_ERROR_RETURN ((LM_ERROR, "priority failed\n"), -1); - } - TAO_ENDTRY; - int done = 0; + int done = 0; + + ACE_hthread_t self; + ACE_OS::thr_self (self); - ACE_hthread_t self; - ACE_OS::thr_self (self); + int priority; + if (ACE_OS::thr_getprio (self, priority) == 0) + ACE_DEBUG ((LM_DEBUG, "(%t) new thread priority = %d.\n", priority)); - int priority; - if (ACE_OS::thr_getprio (self, priority) == 0) - ACE_DEBUG ((LM_DEBUG, "(%t) new thread priority = %d.\n", priority)); + // Initialize channel thread-specific data. + ACE_ES_Memory_Pools::thr_init (); - // Initialize channel thread-specific data. - ACE_ES_Memory_Pools::thr_init (); + done = this->svc_hook (priority); - done = this->svc_hook (priority); + while (!done) + { + done = this->svc_one (); + } - while (!done) + ACE_DEBUG ((LM_DEBUG, "(%t) thread exiting.\n")); + } + TAO_CATCHANY { - done = this->svc_one (); + ACE_ERROR_RETURN ((LM_ERROR, "priority failed\n"), -1); } + TAO_ENDTRY; - ACE_DEBUG ((LM_DEBUG, "(%t) thread exiting.\n")); return 0; } diff --git a/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp b/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp index 256f4d65b73..8123251d80e 100644 --- a/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp +++ b/TAO/orbsvcs/orbsvcs/Event_Utilities.cpp @@ -7,10 +7,10 @@ #include "orbsvcs/Event_Utilities.i" #endif /* __ACE_INLINE__ */ -ACE_ConsumerQOS_Factory::ACE_ConsumerQOS_Factory (void) : - qos_ (), - designator_set_ (0) +ACE_ConsumerQOS_Factory::ACE_ConsumerQOS_Factory (void) + : designator_set_ (0) { + qos_.is_gateway = CORBA::B_FALSE; } ACE_ConsumerQOS_Factory::~ACE_ConsumerQOS_Factory (void) @@ -22,8 +22,8 @@ ACE_ConsumerQOS_Factory::start_conjunction_group (void) { int l = qos_.dependencies.length (); qos_.dependencies.length (l + 1); - qos_.dependencies[l].event_.type_ = ACE_ES_CONJUNCTION_DESIGNATOR; - // TODO: qos_.dependencies[l].event_.data_.lval (0); + qos_.dependencies[l].event.type_ = ACE_ES_CONJUNCTION_DESIGNATOR; + // TODO: qos_.dependencies[l].event.data_.lval (0); designator_set_ = 1; return 0; } @@ -33,8 +33,8 @@ ACE_ConsumerQOS_Factory::start_disjunction_group (void) { int l = qos_.dependencies.length (); qos_.dependencies.length (l + 1); - qos_.dependencies[l].event_.type_ = ACE_ES_DISJUNCTION_DESIGNATOR; - // TODO: qos_.dependencies[l].event_.data_.lval (0); + qos_.dependencies[l].event.type_ = ACE_ES_DISJUNCTION_DESIGNATOR; + // TODO: qos_.dependencies[l].event.data_.lval (0); designator_set_ = 1; return 0; } @@ -48,15 +48,15 @@ ACE_ConsumerQOS_Factory::insert (const RtecEventChannelAdmin::Dependency &subscr { int l = qos_.dependencies.length (); qos_.dependencies.length (l + 1); - qos_.dependencies[l].event_.type_ = ACE_ES_GLOBAL_DESIGNATOR; - // TODO: IDL union qos_.dependencies[l].event_.data_.lval (0); + qos_.dependencies[l].event.type_ = ACE_ES_GLOBAL_DESIGNATOR; + // TODO: IDL union qos_.dependencies[l].event.data_.lval (0); designator_set_ = 1; } int l = qos_.dependencies.length (); qos_.dependencies.length (l + 1); qos_.dependencies[l] = subscribe; - // TODO: IDL union qos_.dependencies[l].event_.data_.lval (0); + // TODO: IDL union qos_.dependencies[l].event.data_.lval (0); return 0; } @@ -66,11 +66,9 @@ void event_debug (const char* p, int l = ACE_OS::strlen (p); ACE_DEBUG ((LM_DEBUG, "%*.*s - event.source: %d\n" - "%*.*s event.type: %d\n" - "%*.*s event.time: %f\n", + "%*.*s event.type: %d\n", l, l, p, event.source_, - l, l, p, event.type_, - l, l, p, event.creation_time_)); + l, l, p, event.type_)); } void @@ -82,7 +80,7 @@ ACE_ConsumerQOS_Factory::debug (const RtecEventChannelAdmin::ConsumerQOS& qos) { char buf[128]; ACE_OS::sprintf (buf, " dep[%d]", i); - event_debug (buf, qos.dependencies[i].event_); + event_debug (buf, qos.dependencies[i].event); ACE_DEBUG ((LM_DEBUG, "%s rt_info: %d\n", buf, qos.dependencies[i].rt_info)); } @@ -91,9 +89,9 @@ ACE_ConsumerQOS_Factory::debug (const RtecEventChannelAdmin::ConsumerQOS& qos) // ************************************************************ -ACE_SupplierQOS_Factory::ACE_SupplierQOS_Factory (void) : - qos_ () +ACE_SupplierQOS_Factory::ACE_SupplierQOS_Factory (void) { + qos_.is_gateway = CORBA::B_FALSE; } int @@ -102,29 +100,29 @@ ACE_SupplierQOS_Factory::insert (RtecEventComm::EventSourceID sid, RtecScheduler::handle_t rt_info, u_int ncalls) { - int l = qos_.publications_.length (); - qos_.publications_.length (l + 1); - qos_.publications_[l].event_.source_ = sid; - qos_.publications_[l].event_.type_ = type; - // TODO: IDL union qos_.publications_[l].event_.data_.lval (0); - qos_.publications_[l].dependency_info_.rt_info = rt_info; - qos_.publications_[l].dependency_info_.number_of_calls = ncalls; + int l = qos_.publications.length (); + qos_.publications.length (l + 1); + qos_.publications[l].event.source_ = sid; + qos_.publications[l].event.type_ = type; + // TODO: IDL union qos_.publications[l].event.data_.lval (0); + qos_.publications[l].dependency_info.rt_info = rt_info; + qos_.publications[l].dependency_info.number_of_calls = ncalls; return 0; } void ACE_SupplierQOS_Factory::debug (const RtecEventChannelAdmin::SupplierQOS& qos) { - ACE_DEBUG ((LM_DEBUG, "ConsumerQOS { \n")); - for (u_int i = 0; i < qos.publications_.length (); ++i) + ACE_DEBUG ((LM_DEBUG, "SupplierQOS { \n")); + for (u_int i = 0; i < qos.publications.length (); ++i) { char buf[128]; ACE_OS::sprintf (buf, " publications[%d]", i); - event_debug (buf, qos.publications_[i].event_); + event_debug (buf, qos.publications[i].event); ACE_DEBUG ((LM_DEBUG, "%s dependency_info.rt_info: %d\n" "%s dependency_info.number_of_calls: %d\n", - buf, qos.publications_[i].dependency_info_.rt_info, - buf, qos.publications_[i].dependency_info_.number_of_calls)); + buf, qos.publications[i].dependency_info.rt_info, + buf, qos.publications[i].dependency_info.number_of_calls)); } ACE_DEBUG ((LM_DEBUG, "}\n")); diff --git a/TAO/orbsvcs/orbsvcs/Event_Utilities.i b/TAO/orbsvcs/orbsvcs/Event_Utilities.i index e8efc7dd4df..58423e9af27 100644 --- a/TAO/orbsvcs/orbsvcs/Event_Utilities.i +++ b/TAO/orbsvcs/orbsvcs/Event_Utilities.i @@ -8,11 +8,11 @@ ACE_ConsumerQOS_Factory::insert (RtecEventComm::EventSourceID source, RtecScheduler::handle_t rt_info) { RtecEventChannelAdmin::Dependency dependency; - dependency.event_.source_ = source; - dependency.event_.type_ = type; - //dependency.event_.creation_time_ = 0; - //dependency.event_.ec_recv_time_ = 0; - //dependency.event_.ec_send_time_ = 0; + dependency.event.source_ = source; + dependency.event.type_ = type; + //dependency.event.creation_time_ = 0; + //dependency.event.ec_recv_time_ = 0; + //dependency.event.ec_send_time_ = 0; dependency.rt_info = rt_info; return this->insert (dependency); } @@ -22,11 +22,11 @@ ACE_ConsumerQOS_Factory::insert_type (RtecEventComm::EventType type, RtecScheduler::handle_t rt_info) { RtecEventChannelAdmin::Dependency dependency; - dependency.event_.source_ = 0; - dependency.event_.type_ = type; - //dependency.event_.creation_time_ = 0; - //dependency.event_.ec_recv_time_ = 0; - //dependency.event_.ec_send_time_ = 0; + dependency.event.source_ = 0; + dependency.event.type_ = type; + //dependency.event.creation_time_ = 0; + //dependency.event.ec_recv_time_ = 0; + //dependency.event.ec_send_time_ = 0; dependency.rt_info = rt_info; return this->insert (dependency); } @@ -36,11 +36,11 @@ ACE_ConsumerQOS_Factory::insert_source (RtecEventComm::EventSourceID source, RtecScheduler::handle_t rt_info) { RtecEventChannelAdmin::Dependency dependency; - dependency.event_.source_ = source; - dependency.event_.type_ = ACE_ES_EVENT_ANY; - //dependency.event_.creation_time_ = 0; - //dependency.event_.ec_recv_time_ = 0; - //dependency.event_.ec_send_time_ = 0; + dependency.event.source_ = source; + dependency.event.type_ = ACE_ES_EVENT_ANY; + //dependency.event.creation_time_ = 0; + //dependency.event.ec_recv_time_ = 0; + //dependency.event.ec_send_time_ = 0; dependency.rt_info = rt_info; return this->insert (dependency); } @@ -51,11 +51,11 @@ ACE_ConsumerQOS_Factory::insert_time (RtecEventComm::EventType type, RtecScheduler::handle_t rt_info) { RtecEventChannelAdmin::Dependency dependency; - dependency.event_.source_ = 0; - dependency.event_.type_ = type; - dependency.event_.creation_time_ = interval; - //dependency.event_.ec_recv_time_ = 0; - //dependency.event_.ec_send_time_ = 0; + dependency.event.source_ = 0; + dependency.event.type_ = type; + dependency.event.creation_time_ = interval; + //dependency.event.ec_recv_time_ = 0; + //dependency.event.ec_send_time_ = 0; dependency.rt_info = rt_info; return this->insert (dependency); } @@ -64,12 +64,12 @@ ACE_INLINE int ACE_ConsumerQOS_Factory::insert_act (RtecEventComm::EventData act) { RtecEventChannelAdmin::Dependency dependency; - dependency.event_.source_ = 0; - dependency.event_.type_ = ACE_ES_EVENT_ACT; - //dependency.event_.creation_time_ = 0; - //dependency.event_.ec_recv_time_ = 0; - //dependency.event_.ec_send_time_ = 0; - dependency.event_.data_ = act; + dependency.event.source_ = 0; + dependency.event.type_ = ACE_ES_EVENT_ACT; + //dependency.event.creation_time_ = 0; + //dependency.event.ec_recv_time_ = 0; + //dependency.event.ec_send_time_ = 0; + dependency.event.data_ = act; return this->insert (dependency); } @@ -98,4 +98,3 @@ ACE_SupplierQOS_Factory::operator const RtecEventChannelAdmin::SupplierQOS& (voi { return qos_; } - diff --git a/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl b/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl index 9ba626ba73e..3bd63cb441a 100644 --- a/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl +++ b/TAO/orbsvcs/orbsvcs/RtecEventChannelAdmin.idl @@ -10,23 +10,25 @@ module RtecEventChannelAdmin { exception TypeError {}; struct Dependency { - RtecEventComm::Event event_; + RtecEventComm::Event event; RtecScheduler::handle_t rt_info; }; typedef sequence<Dependency> DependencySet; struct ConsumerQOS { DependencySet dependencies; + boolean is_gateway; }; struct Publication { - RtecEventComm::Event event_; - RtecScheduler::Dependency_Info dependency_info_; + RtecEventComm::Event event; + RtecScheduler::Dependency_Info dependency_info; }; typedef sequence<Publication> PublicationSet; struct SupplierQOS { - PublicationSet publications_; + PublicationSet publications; + boolean is_gateway; }; interface ProxyPushConsumer: RtecEventComm::PushConsumer { diff --git a/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp b/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp index 79ce19df74c..89a173f63c2 100644 --- a/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp +++ b/TAO/orbsvcs/orbsvcs/Runtime_Scheduler.cpp @@ -76,7 +76,7 @@ ACE_Runtime_Scheduler::get (RtecScheduler::handle_t handle, info->priority = rt_info_[handle].priority; info->preemption_subpriority = rt_info_[handle].static_subpriority; info->preemption_priority = rt_info_[handle].preemption_priority; - info->info_type = rt_info_[handle].info_type; + info->info_type = RtecScheduler::Info_Type(rt_info_[handle].info_type); return info; } diff --git a/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h index 8f27ca50e5a..71e4c20d944 100644 --- a/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h +++ b/TAO/orbsvcs/orbsvcs/Scheduler_Factory.h @@ -42,7 +42,7 @@ public: RtecScheduler::OS_Priority priority; RtecScheduler::Preemption_Subpriority static_subpriority; RtecScheduler::Preemption_Priority preemption_priority; - RtecScheduler::Info_Type info_type; + CORBA::Long info_type; }; static int use_config (CosNaming::NamingContext_ptr naming); diff --git a/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.cpp b/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.cpp index 2d4977c4f0e..ec33c81604f 100644 --- a/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.cpp +++ b/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.cpp @@ -433,6 +433,8 @@ Test_ECG::run (int argc, char* argv[]) tv.set (5, 0); if (orb->run (&tv) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "orb->run"), -1); + + ec_impl.add_gateway (&this->ecg_); } this->connect_consumers (local_ec.in (), TAO_TRY_ENV); @@ -726,8 +728,6 @@ Test_ECG::connect_ecg (RtecEventChannelAdmin::EventChannel_ptr local_ec, ACE_OS::strcpy (ecg_name, "ecg_"); ACE_OS::strcat (ecg_name, this->lcl_name_); - // Generate its ConsumerQOS - // We could use the same name on the local and remote scheduler, // but that fails when using a global scheduler. char rmt[BUFSIZ]; @@ -735,38 +735,6 @@ Test_ECG::connect_ecg (RtecEventChannelAdmin::EventChannel_ptr local_ec, ACE_OS::strcat (rmt, "@"); ACE_OS::strcat (rmt, this->rmt_name_); - RtecScheduler::handle_t rmt_info = - remote_sch->create (rmt, TAO_TRY_ENV); - TAO_CHECK_ENV; - - // The worst case execution time is far less than 500 usecs, but - // that is a safe estimate.... - ACE_Time_Value tv (0, 500); - TimeBase::TimeT time; - ORBSVCS_Time::Time_Value_to_TimeT (time, tv); - remote_sch->set (rmt_info, - RtecScheduler::VERY_HIGH_CRITICALITY, - time, time, time, - 25000 * 10, - RtecScheduler::VERY_LOW_IMPORTANCE, - time, - 0, - RtecScheduler::OPERATION, - TAO_TRY_ENV); - TAO_CHECK_ENV; - - ACE_ConsumerQOS_Factory consumer_qos; - consumer_qos.start_disjunction_group (); - consumer_qos.insert_type (this->hpc_event_a_, rmt_info); - consumer_qos.insert_type (this->hpc_event_b_, rmt_info); - if (this->lp_consumers_ > 0) - { - consumer_qos.insert_type (this->lpc_event_a_, rmt_info); - consumer_qos.insert_type (this->lpc_event_b_, rmt_info); - } - - // Generate its SupplierQOS - // We could use the same name on the local and remote scheduler, // but that fails when using a global scheduler. char lcl[bufsize]; @@ -774,45 +742,8 @@ Test_ECG::connect_ecg (RtecEventChannelAdmin::EventChannel_ptr local_ec, ACE_OS::strcat (lcl, "@"); ACE_OS::strcat (lcl, this->lcl_name_); - RtecScheduler::handle_t lcl_info = - local_sch->create (lcl, TAO_TRY_ENV); - TAO_CHECK_ENV; - - local_sch->set (lcl_info, - RtecScheduler::VERY_HIGH_CRITICALITY, - time, time, time, - 25000 * 10, - RtecScheduler::VERY_LOW_IMPORTANCE, - time, - 1, - RtecScheduler::OPERATION, - TAO_TRY_ENV); - TAO_CHECK_ENV; - - CORBA::ULong supplier_id = ACE::crc32 (lcl); - ACE_DEBUG ((LM_DEBUG, "ID for <%s> is %04.4x\n", lcl, supplier_id)); - - ACE_SupplierQOS_Factory supplier_qos; - supplier_qos.insert (supplier_id, - this->hpc_event_a_, - lcl_info, 1); - supplier_qos.insert (supplier_id, - this->hpc_event_b_, - lcl_info, 1); - if (this->lp_consumers_ > 0) - { - supplier_qos.insert (supplier_id, - this->lpc_event_a_, - lcl_info, 1); - supplier_qos.insert (supplier_id, - this->lpc_event_b_, - lcl_info, 1); - } - - this->ecg_.open (remote_ec, local_ec, - consumer_qos.get_ConsumerQOS (), - supplier_qos.get_SupplierQOS (), - TAO_TRY_ENV); + this->ecg_.init (remote_ec, local_ec, remote_sch, local_sch, + rmt, lcl, TAO_TRY_ENV); TAO_CHECK_ENV; } TAO_CATCHANY diff --git a/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h b/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h index 809f0e7e954..86939873f4a 100644 --- a/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h +++ b/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h @@ -244,7 +244,7 @@ private: char* rmt_name_; // The name of the "remote" EC. - TAO_EC_Gateway ecg_; + TAO_EC_Gateway_IIOP ecg_; // The proxy used to connect both event channels. enum { diff --git a/TAO/orbsvcs/tests/EC_Multiple/svc.conf b/TAO/orbsvcs/tests/EC_Multiple/svc.conf index 43c6a486c92..5b048c7e8cc 100644 --- a/TAO/orbsvcs/tests/EC_Multiple/svc.conf +++ b/TAO/orbsvcs/tests/EC_Multiple/svc.conf @@ -1,49 +1,7 @@ # $Id$ # -# This file contains a sample ACE_Service_Config configuration -# file specifying the strategy factories utilized by an application -# using TAO. There are currently only two possible factories: -# Client_Strategy_Factory and Server_Strategy_Factory. These names -# must be used as the second argument to their corresponding line, -# because that's what the ORB uses to find the desired factory. +# The options are described in $TAO_ROOT/docs/Options.html # -# Note that there are two unordinary characteristics of the way *this* -# file is set up: -# - both client and server strategies are specified in the same -# file, which would only make sense for co-located clients & servers -# - both of the factories are actually sourced out of libTAO.so -# (TAO.DLL on Win32), and they would normally be in a separate -# dll from the TAO ORB Core. -# -# The options which can be passed to the Resource Factory are: -# -# -ORBresources <which> -# where <which> can be 'global' to specify globally-held resources, -# or 'tss' to specify thread-specific resources. -# -# The options which can be passed to the Client are: -# <none currently> -# -# The options which can be passed to the Server are: -# -# -ORBconcurrency <which> -# where <which> can be 'thread-per-connection' to specify -# use of the ACE_Threaded_Strategy concurrency strategy, -# or 'reactive' to specify use of the ACE_Reactive_Strategy -# concurrency strategy. -# -# -ORBthreadflags <flags> -# specifies the default thread flags to use, where <flags> is a -# logical OR'ing of the flags THR_DETACHED, THR_BOUND, THR_NEW_LWP, -# THR_SUSPENDED, or THR_DAEMON. Note that not every flag may be valid -# on every platform. -# -# -ORBdemuxstrategy <which> -# where <which> can be one of 'dynamic', 'linear', 'active', or 'user', -# and specifies the type of object lookup strategy used internally. -# -ORBtablesize <unsigned> -# specifies the size of the object table -# -dynamic Resource_Factory Service_Object * TAO:_make_TAO_Resource_Factory() "-ORBresources global" +dynamic Resource_Factory Service_Object * TAO:_make_TAO_Resource_Factory() "-ORBresources global -ORBpoa global -ORBcoltable orb" dynamic Client_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Client_Strategy_Factory() dynamic Server_Strategy_Factory Service_Object * TAO:_make_TAO_Default_Server_Strategy_Factory() "-ORBconcurrency reactive -ORBdemuxstrategy dynamic -ORBtablesize 128" |