CORBA::Object_ptr ServantRetentionStrategyRetain::servant_to_reference ( PortableServer::Servant servant) { // Note: The allocation of an Object Id value and installation in // the Active Object Map caused by implicit activation may actually // be deferred until an attempt is made to externalize the // reference. The real requirement here is that a reference is // produced that will behave appropriately (that is, yield a // consistent Object Id value when asked politely). CORBA::Short priority = this->poa_->server_priority (); PortableServer::ObjectId_var system_id = this->servant_to_system_id_i (servant, priority); PortableServer::ObjectId user_id; // This operation requires the RETAIN, therefore don't worry about // the NON_RETAIN case. if (this->active_object_map_-> find_user_id_using_system_id (system_id.in (), user_id) != 0) { throw ::CORBA::OBJ_ADAPTER (); } // Remember params for potentially invoking <key_to_object> later. this->poa_->key_to_object_params_.set ( system_id, servant->_interface_repository_id (), servant, 1, priority, true); // Ask the ORT to create the object. // @@NOTE:There is a possible deadlock lurking here. We held the // lock, and we are possibly trying to make a call into the // application code. Think what would happen if the app calls us // back. We need to get to this at some point. return this->poa_->invoke_key_to_object_helper_i ( servant->_interface_repository_id (), user_id); }
CORBA::Object_ptr ServantRetentionStrategyRetain::id_to_reference ( const PortableServer::ObjectId &id, bool indirect) { // If an object with the specified Object Id value is currently // active, a reference encapsulating the information used to // activate the object is returned. PortableServer::ObjectId_var system_id; PortableServer::Servant servant; CORBA::Short priority; if (this->active_object_map_-> find_servant_and_system_id_using_user_id (id, servant, system_id.out (), priority) == 0) { // Remember params for potentially invoking <key_to_object> later. this->poa_->key_to_object_params_.set (system_id, servant->_interface_repository_id (), servant, 1, priority, indirect); return this->poa_->invoke_key_to_object_helper_i (servant->_interface_repository_id (), id); } else { // If the Object Id value is not active in the POA, an // ObjectNotActive exception is raised. throw PortableServer::POA::ObjectNotActive (); } }