CosNotifyChannelAdmin::EventChannel_ptr TAO_Notify_Lanes_Supplier_Client::create_ec (void) { CosNotifyChannelAdmin::EventChannel_var ec; CosNotifyChannelAdmin::EventChannelFactory_var ecf = this->orb_objects_.notify_factory (); // Create an EventChannel CosNotification::QoSProperties qos; CosNotification::AdminProperties admin; // Create an event channel CosNotifyChannelAdmin::ChannelID id; ec = ecf->create_channel (qos, admin, id); // Set the Qos : 2 Lanes NotifyExt::ThreadPoolLanesParams tpl_params; tpl_params.priority_model = NotifyExt::CLIENT_PROPAGATED; tpl_params.server_priority = 0; tpl_params.stacksize = 0; tpl_params.lanes.length (this->consumer_count_ + 1); tpl_params.allow_borrowing = 0; tpl_params.allow_request_buffering = 0; tpl_params.max_buffered_requests = 0; tpl_params.max_request_buffer_size = 0; /* * Note that we actually create 1 extra Lane. * The extra Lane at priority 0 is created to match the priority 0 of the supplier thread. * As the ProxyConsumer is activated in an RT POA with lanes, each invocation must mach some lane. * Now, we typically reserve higer priorities to make requests and the lowest priority 0 for administrative calls * e.g. <subscription_change>. If we do not have a lane at the lowest 0 priority, then the invocation made from * the supplier at priority 0 will fail. */ tpl_params.lanes[0].lane_priority = 0; // Priority 0 tpl_params.lanes[0].static_threads = 1; tpl_params.lanes[0].dynamic_threads = 0; RTCORBA::Priority priority = 1; // The priority at which we send an event each. for (int i = 1; i <= this->consumer_count_; ++i, ++priority) { tpl_params.lanes[i].lane_priority = priority; tpl_params.lanes[i].static_threads = 1; tpl_params.lanes[i].dynamic_threads = 0; } qos.length (1); qos[0].name = CORBA::string_dup (NotifyExt::ThreadPoolLanes); qos[0].value <<= tpl_params; // Note that instead of <set_qos>, the <qos> can also be passed while creating the channel. ec->set_qos (qos); return ec._retn (); }
::CosNotifyChannelAdmin::EventChannel_ptr TAO_Notify_EventChannelFactory::create_channel ( const CosNotification::QoSProperties & initial_qos, const CosNotification::AdminProperties & initial_admin, CosNotifyChannelAdmin::ChannelID_out id ) { CosNotifyChannelAdmin::EventChannel_var ec = TAO_Notify_PROPERTIES::instance()->builder()->build_event_channel (this , initial_qos , initial_admin , id); this->self_change (); return ec._retn (); }
CosNotifyChannelAdmin::EventChannel_ptr TAO_Notify_ThreadPool_Supplier_Client::create_ec (void) { CosNotifyChannelAdmin::EventChannel_var ec; CosNotifyChannelAdmin::EventChannelFactory_var ecf = this->orb_objects_.notify_factory (); // Create an EventChannel CosNotification::QoSProperties qos; CosNotification::AdminProperties admin; // Create an event channel CosNotifyChannelAdmin::ChannelID id; ec = ecf->create_channel (qos, admin, id); // Set the Qos // See $TAO_ROOT/orbsvcs/orbsvcs/NotifyExt.idl if (this->ec_thread_count_) { NotifyExt::ThreadPoolParams tp_params = { NotifyExt::CLIENT_PROPAGATED, 0, 0, static_cast<CORBA::ULong> (this->ec_thread_count_), 0, 0, 0, 0, 0 }; CosNotification::QoSProperties qos (1); qos.length (1); qos[0].name = CORBA::string_dup (NotifyExt::ThreadPool); qos[0].value <<= tp_params; // Note that instead of <set_qos>, the <qos> can also be passed while creating the channel. ec->set_qos (qos); } ACE_DEBUG ((LM_DEBUG, "(%P,%t) Created Event Channel with %d threads\n", this->ec_thread_count_)); return ec._retn (); }
CosNotifyChannelAdmin::EventChannel_var get_event_channel(CORBA::ORB_ptr orb) { CosNotifyChannelAdmin::EventChannel_var ec; CosNotifyChannelAdmin::ChannelID id; CosNotification::QoSProperties init_qos(0); CosNotification::AdminProperties init_admin(0); std::cout << "Get CosNotifyChannelAdmin::EventChannelFactory" << std::endl; std::cout << "IorEventChannelFactory=" << ior << std::endl; CORBA::Object_var obj = orb->string_to_object(ior); if (CORBA::is_nil(obj.in ())) { std::cerr << "Bad ec_fact.ior " << std::endl; exit(1); } CosNotifyChannelAdmin::EventChannelFactory_var factory = CosNotifyChannelAdmin::EventChannelFactory::_narrow(obj.in ()); if (CORBA::is_nil(factory.in())) { std::cerr << "Could not _narrow object to type CosNotifyChannelAdmin::EventChannelFactory" << std::endl; exit(1); } //Get the first ec CosNotifyChannelAdmin::ChannelIDSeq_var channelIdSeq; try { channelIdSeq = factory->get_all_channels(); } catch (CORBA::SystemException& se ) { std::cerr << "System exception occurred during get_all_channels: " << se << std::endl; exit(1); } if( channelIdSeq->length() == 0 ) { try { ec = factory->create_channel( init_qos, init_admin, id); } catch (CORBA::SystemException& se ) { std::cerr << "System exception occurred during find_channel: " << se << std::endl; exit(1); } } else { try { ec = factory->get_event_channel(channelIdSeq.in()[0]); } catch (CosNotifyChannelAdmin::ChannelNotFound&) { std::cerr << "ChannelNotFound: " << channelIdSeq.in()[0] << std::endl; exit(1); } catch (CORBA::SystemException& se ) { std::cerr << "System exception occurred during get_event_channel: " << se << std::endl; exit(1); } } return ec._retn(); }