diff options
Diffstat (limited to 'TAO/examples/Simulator/Event_Supplier/DOVE_Supplier.cpp')
-rw-r--r-- | TAO/examples/Simulator/Event_Supplier/DOVE_Supplier.cpp | 519 |
1 files changed, 0 insertions, 519 deletions
diff --git a/TAO/examples/Simulator/Event_Supplier/DOVE_Supplier.cpp b/TAO/examples/Simulator/Event_Supplier/DOVE_Supplier.cpp deleted file mode 100644 index eb1ec2bcc55..00000000000 --- a/TAO/examples/Simulator/Event_Supplier/DOVE_Supplier.cpp +++ /dev/null @@ -1,519 +0,0 @@ -// $Id$ - -// ============================================================================ -// -// = FILENAME -// DOVE_Supplier.cpp -// -// = DESCRIPTION -// A wrapper around the event service initialization and -// marshalling -// -// = AUTHOR -// Michael Kircher (mk1@cs.wustl.edu) -// -// ============================================================================ - -#include "DOVE_Supplier.h" - -ACE_RCSID(Event_Supplier, DOVE_Supplier, "$Id$") - -// Static pointer member initialization for Singleton. - -ACE_Scheduler_Factory::POD_RT_Info * -DOVE_Supplier::pod_rt_info_instance_ = 0; - -// Constructor. - -DOVE_Supplier::DOVE_Supplier () - : initialized_ (0), - connected_ (0), - connection_params_list_ (0), - current_connection_params_ (0), - connection_count_ (0), - current_connection_index_ (0), - internal_DOVE_Supplier_ptr_ (0), - MIB_name_ (0) -{ - ACE_NEW (internal_DOVE_Supplier_ptr_, - Internal_DOVE_Supplier (this)); - - if (internal_DOVE_Supplier_ptr_ == 0) - { - ACE_ERROR ((LM_ERROR, - "DOVE_Supplier::DOVE_Supplier internal " - "supplier not allocated.")); - } -} - -// Destructor. - -DOVE_Supplier::~DOVE_Supplier () -{ - for (int i = 0; i < this->connection_count_; ++i) - { - delete (this->connection_params_list_ [i]); - } - - delete [] this->connection_params_list_; - - delete internal_DOVE_Supplier_ptr_; - -} - -// Initialize the ORB and the connection to the Name Service - -int -DOVE_Supplier::init (void) -{ - TAO_TRY - { - // Connect to the RootPOA. - CORBA::Object_var poaObject_var = - TAO_ORB_Core_instance()->orb()->resolve_initial_references("RootPOA"); - - if (CORBA::is_nil (poaObject_var.in ())) - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to initialize the POA.\n"), - -1); - - this->root_POA_var_ = - PortableServer::POA::_narrow (poaObject_var.in (), TAO_TRY_ENV); - TAO_CHECK_ENV; - - this->poa_manager_ = - root_POA_var_->the_POAManager (TAO_TRY_ENV); - TAO_CHECK_ENV; - - // Get the Naming Service object reference. - CORBA::Object_var namingObj_var = - TAO_ORB_Core_instance()->orb()->resolve_initial_references ("NameService"); - - if (CORBA::is_nil (namingObj_var.in ())) - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to get the Naming Service.\n"), - -1); - - this->namingContext_var_ = - CosNaming::NamingContext::_narrow (namingObj_var.in (), - TAO_TRY_ENV); - TAO_CHECK_ENV; - } - TAO_CATCHANY - { - TAO_TRY_ENV.print_exception ("DOVE_Supplier::init"); - return -1; - } - TAO_ENDTRY; - - initialized_ = 1; - return 0; -} - -int -DOVE_Supplier::connect (const char* MIB_name, - const char* es_name, - const char * ss_name, - ACE_Scheduler_Factory::POD_RT_Info * pod_rt_info) -{ - // Initialize the supplier if this has not already been done. - if ((initialized_ == 0) && (this->init () == -1)) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to initialize the DOVE_Supplier.\n"), - -1); - } - - - // Grab the default RT_Info settings if others were not provided. - if (pod_rt_info == 0) - { - // Get the default singleton if we were not passed the data - pod_rt_info = DOVE_Supplier::pod_rt_info_instance (); - if (pod_rt_info == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to obtain" - " the default RT_Info data.\n"), - -1); - } - } - - // Save the passed MIB name - MIB_name_ = (MIB_name == 0) ? "MIB_unknown" : MIB_name; - - // Create a new connection parameters structure. - Connection_Params * cp_temp = 0; - ACE_NEW_RETURN (cp_temp, Connection_Params, -1); - - // Populate the known fields of the new connection params struct. - cp_temp->pod_rt_info_ = *pod_rt_info; - cp_temp->es_name_ = (es_name == 0) ? "EventService" : es_name; - cp_temp->ss_name_ = (ss_name == 0) ? "ScheduleService" : ss_name; - - // Allocate a new connection parameters pointer array. - // Cannot use ACE_NEW_RETURN here, as we need to clean up - // cp_temp if we fail here, and we need what cp_temp points - // to after the current scope if we succeed here. - Connection_Params ** cp_list_temp; - cp_list_temp = - new Connection_Params * [this->connection_count_ + 1]; - if (cp_list_temp == 0) - { - // Avoid a memory leak if we failed to allocate. - delete cp_temp; - - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) DOVE_Supplier::connect could not " - "reallocate connection params list"), - -1); - } - - // Copy the connection struct pointers from - // the old list (if any) to the new one. - for (int i = 0; i < this->connection_count_; ++i) - { - cp_list_temp [i] = - this->connection_params_list_ [i]; - } - - // Put a pointer to the new connection params structure - // in the new list, increment the connection params count, - // and point to the latest connection parameters. - cp_list_temp [this->connection_count_] = cp_temp; - this->current_connection_params_ = cp_temp; - current_connection_index_ = connection_count_; - ++ (this->connection_count_); - - // Replace the old list of pointers with the new one - delete [] this->connection_params_list_; - this->connection_params_list_ = cp_list_temp; - - // Resolve the event service reference. - if (this->get_EventChannel () == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to resolve the event service.\n"), - -1); - } - - // Resolve the scheduling service reference. - if (this->get_Scheduler () == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to resolve the scheduler.\n"), - -1); - } - - // Connect to the event service as a supplier. - if (this->connect_Supplier () == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - " (%P|%t) Unable to connect to the event service.\n"), - -1); - } - - return 0; - -} - - -// This method is invoked after all connect calls are done. - -void -DOVE_Supplier::connected () -{ - if (! connected_) - { - // Code to do post-connection-establishment - // one-time logic goes here. - - connected_ = 1; - } -} - - -void -DOVE_Supplier::disconnect () -{ -} - - -void -DOVE_Supplier::notify (CORBA::Any &message) -{ - // Finalize connection establishment no later than the first event notification - if (! connected_) - { - this->connected (); - } - - TAO_TRY - { - RtecEventComm::Event event; - event.header.source = SOURCE_ID; - event.header.type = ACE_ES_EVENT_NOTIFICATION; - event.header.ttl = 1; - ACE_hrtime_t creation_time = ACE_OS::gethrtime (); - ORBSVCS_Time::hrtime_to_TimeT (event.header.creation_time, creation_time); - event.header.ec_recv_time = ORBSVCS_Time::zero; - event.header.ec_send_time = ORBSVCS_Time::zero; - event.data.any_value = message; - - RtecEventComm::EventSet events; - events.length (1); - events[0] = event; - - // Now we invoke a RPC - this->current_connection_params_->proxyPushConsumer_var_->push (events, - TAO_TRY_ENV); - TAO_CHECK_ENV; - } - TAO_CATCHANY - { - ACE_ERROR ((LM_ERROR, - "DOVE_Supplier::notify: " - "unexpected exception.\n")); - } - TAO_ENDTRY; -} - - -// Use the next connection in the list of established connections. - -void -DOVE_Supplier::use_next_connection () -{ - if (connection_count_ > 0) - { - current_connection_index_ = - (current_connection_index_ == connection_count_ - 1) - ? 0 : current_connection_index_ + 1; - - current_connection_params_ = - connection_params_list_ [current_connection_index_]; - } -} - - -// Use the previous connection in the list of established connections. - -void -DOVE_Supplier::use_prev_connection () -{ - if (connection_count_ > 0) - { - current_connection_index_ = - (current_connection_index_ == 0) - ? connection_count_ - 1 - : current_connection_index_ - 1; - - current_connection_params_ = - connection_params_list_ [current_connection_index_]; - } -} - - - -// -------------------- Internal Demo Supplier ----------------------------- - -DOVE_Supplier::Internal_DOVE_Supplier::Internal_DOVE_Supplier (DOVE_Supplier *impl_ptr) - : impl_ptr_ (impl_ptr) -{ -} - -// ---------------------------------------------------------------------------- - -int -DOVE_Supplier::get_Scheduler () -{ - TAO_TRY - { - CosNaming::Name schedule_name (1); - schedule_name.length (1); - schedule_name[0].id = - CORBA::string_dup (this->current_connection_params_->ss_name_); - - CORBA::Object_var objref = - namingContext_var_->resolve (schedule_name, - TAO_TRY_ENV); - TAO_CHECK_ENV; - - this->current_connection_params_->scheduler_var_ = - RtecScheduler::Scheduler::_narrow(objref.in (), - TAO_TRY_ENV); - TAO_CHECK_ENV; - } - TAO_CATCHANY - { - current_connection_params_->scheduler_var_ = 0; - ACE_ERROR_RETURN ((LM_ERROR, - "DOVE_Supplier::get_Scheduler: " - "error while resolving scheduler %s\n", - this->current_connection_params_->ss_name_), - -1); - } - TAO_ENDTRY; - - return 0; -} - - -int -DOVE_Supplier::get_EventChannel () -{ - TAO_TRY - { - // Get a reference to the Event Service - CosNaming::Name channel_name (1); - channel_name.length (1); - channel_name[0].id = - CORBA::string_dup (this->current_connection_params_->es_name_); - - CORBA::Object_var eventServiceObj_var = - this->namingContext_var_->resolve (channel_name, TAO_TRY_ENV); - TAO_CHECK_ENV; - - this->current_connection_params_->eventChannel_var_ = - RtecEventChannelAdmin::EventChannel::_narrow (eventServiceObj_var.in(), - TAO_TRY_ENV); - TAO_CHECK_ENV; - - if (CORBA::is_nil (this->current_connection_params_->eventChannel_var_.in())) - ACE_ERROR_RETURN ((LM_ERROR, - "The reference to the event channel is nil!"), - 1); - } - TAO_CATCHANY - { - TAO_TRY_ENV.print_exception ("DOVE_Supplier::get_EventChannel"); - return -1; - } - TAO_ENDTRY; - - return 0; -} - - -int -DOVE_Supplier::connect_Supplier () -{ - TAO_TRY - { - // Generate the Real-time information descriptor. - this->current_connection_params_->rt_info_ = - this->current_connection_params_-> - scheduler_var_-> - create (this->current_connection_params_->pod_rt_info_.entry_point, - TAO_TRY_ENV); - - TAO_CHECK_ENV; - - this->current_connection_params_->scheduler_var_-> - set (this->current_connection_params_->rt_info_, - ACE_static_cast (RtecScheduler::Criticality_t, - this->current_connection_params_->pod_rt_info_.criticality), - this->current_connection_params_->pod_rt_info_.worst_case_execution_time, - this->current_connection_params_->pod_rt_info_.typical_execution_time, - this->current_connection_params_->pod_rt_info_.cached_execution_time, - this->current_connection_params_->pod_rt_info_.period, - ACE_static_cast (RtecScheduler::Importance_t, - this->current_connection_params_->pod_rt_info_.importance), - this->current_connection_params_->pod_rt_info_.quantum, - this->current_connection_params_->pod_rt_info_.threads, - ACE_static_cast (RtecScheduler::Info_Type_t, - this->current_connection_params_->pod_rt_info_.info_type), - TAO_TRY_ENV); - - TAO_CHECK_ENV; - - - // Set the publications to report them to the event channel. - - CORBA::Short x = 0; - RtecEventChannelAdmin::SupplierQOS qos; - qos.publications.length (1); - qos.publications[0].event.header.source = SOURCE_ID; - qos.publications[0].event.header.type = ACE_ES_EVENT_NOTIFICATION; - qos.publications[0].event.header.ttl = 1; - qos.publications[0].event.header.creation_time = ORBSVCS_Time::zero; - qos.publications[0].event.header.ec_recv_time = ORBSVCS_Time::zero; - qos.publications[0].event.header.ec_send_time = ORBSVCS_Time::zero; - qos.publications[0].event.data.any_value.replace (CORBA::_tc_short, - &x, - 0, - TAO_TRY_ENV); - TAO_CHECK_ENV; - qos.publications[0].dependency_info.number_of_calls = 1; - qos.publications[0].dependency_info.rt_info = - this->current_connection_params_->rt_info_; - - // = Connect as a supplier. - this->current_connection_params_->supplierAdmin_var_ = - this->current_connection_params_->eventChannel_var_->for_suppliers (TAO_TRY_ENV); - TAO_CHECK_ENV; - - this->current_connection_params_->proxyPushConsumer_var_ = - this->current_connection_params_->supplierAdmin_var_->obtain_push_consumer (TAO_TRY_ENV); - TAO_CHECK_ENV; - - // In calling _this we get back an object reference and register - // the servant with the POA. - RtecEventComm::PushSupplier_var pushSupplier_var = - this->internal_DOVE_Supplier_ptr_->_this (TAO_TRY_ENV); - TAO_CHECK_ENV; - - // Connect the supplier to the proxy consumer. - ACE_SupplierQOS_Factory::debug (qos); - this->current_connection_params_-> - proxyPushConsumer_var_->connect_push_supplier (pushSupplier_var.in (), - qos, - TAO_TRY_ENV); - TAO_CHECK_ENV; - } - TAO_CATCHANY - { - TAO_TRY_ENV.print_exception ("DOVE_Supplier::connect_supplier"); - return -1; - } - TAO_ENDTRY; - - return 0; - -} - - -// Access the default rt_info singleton. - -ACE_Scheduler_Factory::POD_RT_Info * -DOVE_Supplier::pod_rt_info_instance () -{ - if (DOVE_Supplier::pod_rt_info_instance_ == 0) - { - ACE_NEW_RETURN (DOVE_Supplier::pod_rt_info_instance_, - ACE_Scheduler_Factory::POD_RT_Info, - 0); - - // Set up the default data. - DOVE_Supplier::pod_rt_info_instance_->entry_point = "ABC"; - DOVE_Supplier::pod_rt_info_instance_->criticality = - RtecScheduler::VERY_LOW_CRITICALITY; - DOVE_Supplier::pod_rt_info_instance_->worst_case_execution_time = - ORBSVCS_Time::zero; - DOVE_Supplier::pod_rt_info_instance_->typical_execution_time = - ORBSVCS_Time::zero; - DOVE_Supplier::pod_rt_info_instance_->cached_execution_time = - ORBSVCS_Time::zero; - DOVE_Supplier::pod_rt_info_instance_->period = 10000000; - DOVE_Supplier::pod_rt_info_instance_->importance = - RtecScheduler::VERY_LOW_IMPORTANCE; - DOVE_Supplier::pod_rt_info_instance_->quantum = ORBSVCS_Time::zero; - DOVE_Supplier::pod_rt_info_instance_->threads = 1; - DOVE_Supplier::pod_rt_info_instance_->info_type = - RtecScheduler::OPERATION; - } - - return DOVE_Supplier::pod_rt_info_instance_; -} - - |