CORBA::Object_ptr join_object_group (CORBA::ORB_ptr orb, CosLoadBalancing::LoadManager_ptr lm, const PortableGroup::Location & location) { CORBA::Object_var ns_object = orb->resolve_initial_references ("NameService"); CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow (ns_object.in ()); CosNaming::Name name (1); name.length (1); name[0].id = "RoundtripObjectGroup"; name[0].kind = "Object Group"; CORBA::Object_var group; try { group = nc->resolve (name); } catch (const CosNaming::NamingContext::NotFound& ) { // Object group not created. Create one. const char repository_id[] = "IDL:Test/Roundtrip:1.0"; PortableGroup::Criteria criteria (1); criteria.length (1); PortableGroup::Property & property = criteria[0]; property.nam.length (1); property.nam[0].id = CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle"); PortableGroup::MembershipStyleValue msv = PortableGroup::MEMB_APP_CTRL; property.val <<= msv; PortableGroup::GenericFactory::FactoryCreationId_var fcid; group = lm->create_object (repository_id, criteria, fcid.out ()); try { nc->bind (name, group.in ()); PortableGroup::Properties props (1); props.length (1); props[0].nam.length (1); props[0].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.StrategyInfo"); CosLoadBalancing::StrategyInfo strategy_info; strategy_info.name = CORBA::string_dup (strategy); if (ACE_OS::strcasecmp (strategy, "LeastLoaded") == 0 && (reject_threshold != 0 || critical_threshold != 0 || dampening != 0)) { CORBA::ULong len = 1; PortableGroup::Properties & props = strategy_info.props; if (reject_threshold != 0) { const CORBA::ULong i = len - 1; props.length (len++); props[i].nam.length (1); props[i].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy.LeastLoaded.RejectThreshold"); props[i].val <<= reject_threshold; } if (critical_threshold != 0) { const CORBA::ULong i = len - 1; props.length (len++); props[i].nam.length (1); props[i].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy.LeastLoaded.CriticalThreshold"); props[i].val <<= critical_threshold; } if (dampening != 0) { const CORBA::ULong i = len - 1; props.length (len++); props[i].nam.length (1); props[i].nam[0].id = CORBA::string_dup ("org.omg.CosLoadBalancing.Strategy.LeastLoaded.Dampening"); props[i].val <<= dampening; } } props[0].val <<= strategy_info; lm->set_default_properties (props); } catch (const CosNaming::NamingContext::AlreadyBound& ) { // Somebody beat us to creating the object group. Clean up // the one we created. lm->delete_object (fcid.in ()); group = nc->resolve (name); } } Roundtrip * roundtrip_impl; ACE_NEW_THROW_EX (roundtrip_impl, Roundtrip (orb), CORBA::NO_MEMORY ()); PortableServer::ServantBase_var owner_transfer (roundtrip_impl); Test::Roundtrip_var roundtrip = roundtrip_impl->_this (); group = lm->add_member (group.in (), location, roundtrip.in ()); return group._retn (); }
CORBA::Boolean TAO_LB_ObjectReferenceFactory::find_object_group ( const char * repository_id, CORBA::ULong & index, PortableGroup::ObjectGroup_out object_group) { if (!this->load_managed_object (repository_id, index)) return false; PortableGroup::ObjectGroup_var group; if (this->table_.find (repository_id, group) != 0) { if (ACE_OS::strcasecmp (this->object_groups_[index], "CREATE") == 0) { PortableGroup::Criteria criteria (1); criteria.length (1); PortableGroup::Property & property = criteria[0]; property.nam.length (1); property.nam[0].id = CORBA::string_dup ("org.omg.PortableGroup.MembershipStyle"); // Configure for application-controlled membership. PortableGroup::MembershipStyleValue msv = PortableGroup::MEMB_APP_CTRL; property.val <<= msv; PortableGroup::GenericFactory::FactoryCreationId_var fcid; group = this->lm_->create_object (repository_id, criteria, fcid.out ()); CORBA::ULong const len = this->fcids_.size (); this->fcids_.size (len + 1); // Incremental growth. Yuck! this->fcids_[len] = fcid; } else { group = this->orb_->string_to_object (this->object_groups_[index]); } if (this->table_.bind (repository_id, group) != 0) { if (TAO_debug_level > 0) ORBSVCS_ERROR ((LM_ERROR, "TAO_LB_ObjectReferenceFactory::" "find_object_group - " "Couldn't bind object group reference.\n")); throw CORBA::INTERNAL (); } object_group = group._retn (); } return 1; }