diff options
Diffstat (limited to 'TAO/tao/Active_Object_Map.cpp')
-rw-r--r-- | TAO/tao/Active_Object_Map.cpp | 1219 |
1 files changed, 222 insertions, 997 deletions
diff --git a/TAO/tao/Active_Object_Map.cpp b/TAO/tao/Active_Object_Map.cpp index 2bc90fe9095..02189a35914 100644 --- a/TAO/tao/Active_Object_Map.cpp +++ b/TAO/tao/Active_Object_Map.cpp @@ -1,1119 +1,344 @@ // $Id$ +#include "ace/Auto_Ptr.h" #include "tao/Active_Object_Map.h" +#include "tao/ORB_Core.h" +#include "tao/POA.h" +#include "tao/Server_Strategy_Factory.h" + +ACE_RCSID(tao, Active_Object_Map, "$Id$") #if !defined (__ACE_INLINE__) # include "tao/Active_Object_Map.i" -#endif /* __ACE_INLINE__ */ - -#include "ace/Auto_Ptr.h" - -ACE_RCSID(tao, POA, "$Id$") - -//////////////////////////////////////////////////////////////////////////////// +#endif /* ! __ACE_INLINE__ */ -TAO_Active_Object_Map::Map_Entry::Map_Entry (void) - : user_id_ (), - system_id_ (), - servant_ (0), - reference_count_ (1), - deactivated_ (0) +u_long +TAO_ObjectId_Hash::operator () (const PortableServer::ObjectId &id) const { -} - -//////////////////////////////////////////////////////////////////////////////// - -/* static */ -size_t TAO_Active_Object_Map::system_id_size_ (0); - -void -TAO_Active_Object_Map::set_system_id_size (const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters) -{ - if (TAO_Active_Object_Map::system_id_size_ == 0) - { - if (creation_parameters.allow_reactivation_of_system_ids_) - { - switch (creation_parameters.object_lookup_strategy_for_system_id_policy_) - { - case TAO_LINEAR: - - TAO_Active_Object_Map::system_id_size_ = sizeof (CORBA::ULong); - break; - - case TAO_DYNAMIC_HASH: - default: - - TAO_Active_Object_Map::system_id_size_ = sizeof (CORBA::ULong); - break; - } - - size_t hint_size; - if (creation_parameters.use_active_hint_in_ids_) - { - hint_size = ACE_Active_Map_Manager_Key::size (); - } - else - { - hint_size = 0; - } - - TAO_Active_Object_Map::system_id_size_ += hint_size; - } - else - { - switch (creation_parameters.object_lookup_strategy_for_system_id_policy_) - { - case TAO_LINEAR: - - TAO_Active_Object_Map::system_id_size_ = sizeof (CORBA::ULong); - break; - - case TAO_DYNAMIC_HASH: - - TAO_Active_Object_Map::system_id_size_ = sizeof (CORBA::ULong); - break; - - case TAO_ACTIVE_DEMUX: - default: - - TAO_Active_Object_Map::system_id_size_ = ACE_Active_Map_Manager_Key::size (); - break; - } - } - } + return ACE::hash_pjw ((const char *) id.get_buffer (), + id.length ()); } TAO_Active_Object_Map::TAO_Active_Object_Map (int user_id_policy, - int unique_id_policy, - int persistent_id_policy, - const TAO_Server_Strategy_Factory::Active_Object_Map_Creation_Parameters &creation_parameters, - CORBA_Environment &ACE_TRY_ENV) - : user_id_map_ (0), - servant_map_ (0), - id_uniqueness_strategy_ (0), - lifespan_strategy_ (0), - id_assignment_strategy_ (0), - id_hint_strategy_ (0) + int unique_id_policy) + : unique_id_policy_ (unique_id_policy) { - TAO_Active_Object_Map::set_system_id_size (creation_parameters); - - TAO_Id_Uniqueness_Strategy *id_uniqueness_strategy = 0; - if (unique_id_policy) - { - ACE_NEW_THROW_EX (id_uniqueness_strategy, - TAO_Unique_Id_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - else - { - ACE_NEW_THROW_EX (id_uniqueness_strategy, - TAO_Multiple_Id_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - // Give ownership to the auto pointer. - auto_ptr<TAO_Id_Uniqueness_Strategy> new_id_uniqueness_strategy (id_uniqueness_strategy); - - TAO_Lifespan_Strategy *lifespan_strategy = 0; - if (persistent_id_policy) - { - ACE_NEW_THROW_EX (lifespan_strategy, - TAO_Persistent_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - else - { - ACE_NEW_THROW_EX (lifespan_strategy, - TAO_Transient_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - // Give ownership to the auto pointer. - auto_ptr<TAO_Lifespan_Strategy> new_lifespan_strategy (lifespan_strategy); - - TAO_Id_Assignment_Strategy *id_assignment_strategy = 0; - if (user_id_policy) - { - ACE_NEW_THROW_EX (id_assignment_strategy, - TAO_User_Id_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - else - { - if (unique_id_policy) - { - ACE_NEW_THROW_EX (id_assignment_strategy, - TAO_System_Id_With_Unique_Id_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - else - { - ACE_NEW_THROW_EX (id_assignment_strategy, - TAO_System_Id_With_Multiple_Id_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - } - // Give ownership to the auto pointer. - auto_ptr<TAO_Id_Assignment_Strategy> new_id_assignment_strategy (id_assignment_strategy); - - TAO_Id_Hint_Strategy *id_hint_strategy = 0; - if ((user_id_policy || - creation_parameters.allow_reactivation_of_system_ids_) && - creation_parameters.use_active_hint_in_ids_) - { - ACE_NEW_THROW_EX (id_hint_strategy, - TAO_Active_Hint_Strategy (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - else - { - ACE_NEW_THROW_EX (id_hint_strategy, - TAO_No_Hint_Strategy, - CORBA::NO_MEMORY ()); - ACE_CHECK; - } - // Give ownership to the auto pointer. - auto_ptr<TAO_Id_Hint_Strategy> new_id_hint_strategy (id_hint_strategy); - - servant_map *sm = 0; - if (unique_id_policy) - { - switch (creation_parameters.reverse_object_lookup_strategy_for_unique_id_policy_) - { - case TAO_LINEAR: - ACE_NEW_THROW_EX (sm, - servant_linear_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - - case TAO_DYNAMIC_HASH: - default: - ACE_NEW_THROW_EX (sm, - servant_hash_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - } - } - // Give ownership to the auto pointer. - auto_ptr<servant_map> new_servant_map (sm); - - user_id_map *uim = 0; - if (user_id_policy || - creation_parameters.allow_reactivation_of_system_ids_) - { - switch (creation_parameters.object_lookup_strategy_for_user_id_policy_) - { - case TAO_LINEAR: - - ACE_NEW_THROW_EX (uim, - user_id_linear_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - - case TAO_DYNAMIC_HASH: - default: - - ACE_NEW_THROW_EX (uim, - user_id_hash_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - } - } - else - { - switch (creation_parameters.object_lookup_strategy_for_system_id_policy_) - { - case TAO_LINEAR: - - ACE_NEW_THROW_EX (uim, - user_id_linear_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - - case TAO_DYNAMIC_HASH: - - ACE_NEW_THROW_EX (uim, - user_id_hash_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - - case TAO_ACTIVE_DEMUX: - default: - - ACE_NEW_THROW_EX (uim, - user_id_active_map (creation_parameters.active_object_map_size_), - CORBA::NO_MEMORY ()); - ACE_CHECK; - break; - } - } - // Give ownership to the auto pointer. - auto_ptr<user_id_map> new_user_id_map (uim); - - id_uniqueness_strategy->set_active_object_map (this); - lifespan_strategy->set_active_object_map (this); - id_assignment_strategy->set_active_object_map (this); - - // Finally everything is fine. Make sure to take ownership away - // from the auto pointer. - this->id_uniqueness_strategy_ = new_id_uniqueness_strategy.release (); - this->lifespan_strategy_ = new_lifespan_strategy.release (); - this->id_assignment_strategy_ = new_id_assignment_strategy.release (); - this->id_hint_strategy_ = new_id_hint_strategy.release (); - this->servant_map_ = new_servant_map.release (); - this->user_id_map_ = new_user_id_map.release (); + this->impl_ = + TAO_ORB_Core_instance ()->server_factory ()->create_active_object_map (user_id_policy); + this->reverse_impl_ = + TAO_ORB_Core_instance ()->server_factory ()->create_reverse_active_object_map (unique_id_policy); } -TAO_Active_Object_Map::~TAO_Active_Object_Map (void) -{ - user_id_map::iterator iterator = this->user_id_map_->begin (); - user_id_map::iterator end = this->user_id_map_->end (); - for (; - iterator != end; - ++iterator) - { - user_id_map::value_type map_entry = *iterator; - delete map_entry.second (); - } - - delete this->id_uniqueness_strategy_; - delete this->lifespan_strategy_; - delete this->id_assignment_strategy_; - delete this->id_hint_strategy_; - delete this->servant_map_; - delete this->user_id_map_; -} - -//////////////////////////////////////////////////////////////////////////////// - -TAO_Id_Uniqueness_Strategy::~TAO_Id_Uniqueness_Strategy (void) -{ -} - -void -TAO_Id_Uniqueness_Strategy::set_active_object_map (TAO_Active_Object_Map *active_object_map) -{ - this->active_object_map_ = active_object_map; -} - -//////////////////////////////////////////////////////////////////////////////// - int -TAO_Unique_Id_Strategy::is_servant_in_map (PortableServer::Servant servant) +TAO_Active_Object_Map_Impl::find (const PortableServer::Servant servant, + PortableServer::ObjectId &id) { - int result = this->active_object_map_->servant_map_->find (servant); - if (result == 0) - { - return 1; - } - else - { - return 0; - } -} + auto_ptr<TAO_Active_Object_Map_Iterator_Impl> end (this->end ()); -int -TAO_Unique_Id_Strategy::bind_using_user_id (PortableServer::Servant servant, - const PortableServer::ObjectId &user_id, - TAO_Active_Object_Map::Map_Entry *&entry) -{ - int result = this->active_object_map_->user_id_map_->find (user_id, - entry); - - if (result == 0) + for (auto_ptr<TAO_Active_Object_Map_Iterator_Impl> i (this->begin ()); + !i->done (end.get ()); + i->advance ()) { - if (servant != 0) - { - entry->servant_ = servant; + const TAO_Active_Object_Map_Entry &item = i->item (); - result = this->active_object_map_->servant_map_->bind (entry->servant_, - entry); - } - } - else - { - ACE_NEW_RETURN (entry, - TAO_Active_Object_Map::Map_Entry, - -1); - - entry->user_id_ = user_id; - entry->servant_ = servant; - - result = this->active_object_map_->id_hint_strategy_->bind (*entry); - - if (result == 0) + if (!this->is_free (item)) { - result = this->active_object_map_->user_id_map_->bind (entry->user_id_, - entry); - - if (result == 0) - { - if (servant != 0) - { - result = this->active_object_map_->servant_map_->bind (entry->servant_, - entry); - } - - if (result != 0) - { - this->active_object_map_->user_id_map_->unbind (entry->user_id_); - this->active_object_map_->id_hint_strategy_->unbind (*entry); - delete entry; - } - } - else + if (item.servant_ == servant) { - this->active_object_map_->id_hint_strategy_->unbind (*entry); - delete entry; + // Store the match.... + id = item.id_; + return 0; } } - else - { - delete entry; - } } - - return result; -} - -int -TAO_Unique_Id_Strategy::unbind_using_user_id (const PortableServer::ObjectId &user_id) -{ - TAO_Active_Object_Map::Map_Entry *entry = 0; - int result = this->active_object_map_->user_id_map_->unbind (user_id, - entry); - - if (result == 0) - { - if (entry->servant_ != 0) - { - result = this->active_object_map_->servant_map_->unbind (entry->servant_); - } - - if (result == 0) - { - result = this->active_object_map_->id_hint_strategy_->unbind (*entry); - } - - if (result == 0) - { - delete entry; - } - } - - return result; -} - -int -TAO_Unique_Id_Strategy::find_user_id_using_servant (PortableServer::Servant servant, - PortableServer::ObjectId_out user_id) -{ - TAO_Active_Object_Map::Map_Entry *entry = 0; - int result = this->active_object_map_->servant_map_->find (servant, - entry); - - if (result == 0) - { - if (entry->deactivated_) - { - result = -1; - } - else - { - ACE_NEW_RETURN (user_id, - PortableServer::ObjectId (entry->user_id_), - -1); - } - } - - return result; -} - -int -TAO_Unique_Id_Strategy::find_system_id_using_servant (PortableServer::Servant servant, - PortableServer::ObjectId_out system_id) -{ - TAO_Active_Object_Map::Map_Entry *entry = 0; - int result = this->active_object_map_->servant_map_->find (servant, - entry); - - if (result == 0) - { - if (entry->deactivated_) - { - result = -1; - } - else - { - result = this->active_object_map_->id_hint_strategy_->system_id (system_id, - *entry); - } - } - - return result; -} - -CORBA::Boolean -TAO_Unique_Id_Strategy::remaining_activations (PortableServer::Servant servant) -{ - // Since servant are always unique here, return false. - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// - -int -TAO_Multiple_Id_Strategy::is_servant_in_map (PortableServer::Servant servant) -{ + return -1; } -int -TAO_Multiple_Id_Strategy::bind_using_user_id (PortableServer::Servant servant, - const PortableServer::ObjectId &user_id, - TAO_Active_Object_Map::Map_Entry *&entry) +PortableServer::ObjectId * +TAO_Dynamic_Hash_Active_Object_Map::create_object_id (PortableServer::Servant, + CORBA::Environment &) { - int result = this->active_object_map_->user_id_map_->find (user_id, - entry); - - if (result == 0) - { - if (servant != 0) - { - entry->servant_ = servant; - } - } - else - { - ACE_NEW_RETURN (entry, - TAO_Active_Object_Map::Map_Entry, - -1); + // This method assumes that locks are held when it is called + PortableServer::ObjectId *id; + CORBA::ULong size = sizeof (CORBA::ULong); + ACE_NEW_RETURN (id, + PortableServer::ObjectId (size), + 0); - entry->user_id_ = user_id; - entry->servant_ = servant; + id->length (size); - result = this->active_object_map_->id_hint_strategy_->bind (*entry); + ACE_OS::memcpy (id->get_buffer (), + &this->counter_, + size); - if (result == 0) - { - result = this->active_object_map_->user_id_map_->bind (entry->user_id_, - entry); + this->counter_++; - if (result != 0) - { - this->active_object_map_->id_hint_strategy_->unbind (*entry); - delete entry; - } - } - else - { - delete entry; - } - } - - return result; + return id; } int -TAO_Multiple_Id_Strategy::unbind_using_user_id (const PortableServer::ObjectId &user_id) +TAO_Linear_Active_Object_Map::bind (const PortableServer::ObjectId &id, + PortableServer::Servant servant) { - TAO_Active_Object_Map::Map_Entry *entry = 0; - int result = this->active_object_map_->user_id_map_->unbind (user_id, - entry); - - if (result == 0) + // Check existing entries + for (TAO_Active_Object_Map_Entry *i = this->map_; + i != this->map_ + this->next_; + ++i) { - result = this->active_object_map_->id_hint_strategy_->unbind (*entry); - - if (result == 0) + if (i->is_free_) { - delete entry; + i->id_ = id; + i->servant_ = servant; + i->is_free_ = 0; + return 0; } } - return result; -} - -int -TAO_Multiple_Id_Strategy::find_user_id_using_servant (PortableServer::Servant servant, - PortableServer::ObjectId_out user_id) -{ - return -1; -} - -int -TAO_Multiple_Id_Strategy::find_system_id_using_servant (PortableServer::Servant servant, - PortableServer::ObjectId_out system_id) -{ - return -1; -} - -CORBA::Boolean -TAO_Multiple_Id_Strategy::remaining_activations (PortableServer::Servant servant) -{ - TAO_Active_Object_Map::user_id_map::iterator end - = this->active_object_map_->user_id_map_->end (); - - for (TAO_Active_Object_Map::user_id_map::iterator iter - = this->active_object_map_->user_id_map_->begin (); - iter != end; - ++iter) + // Resize + if (this->next_ == this->mapsize_) { - TAO_Active_Object_Map::user_id_map::value_type map_pair = *iter; - TAO_Active_Object_Map::Map_Entry *entry = map_pair.second (); - - if (entry->servant_ == servant) - { - return 1; - } + int result = this->resize (); + if (result != 0) + return result; } - return 0; -} -//////////////////////////////////////////////////////////////////////////////// + // Put the entry at the end of the new section + this->map_[this->next_].id_ = id; + this->map_[this->next_].servant_ = servant; + this->map_[this->next_].is_free_ = 0; -TAO_Lifespan_Strategy::~TAO_Lifespan_Strategy (void) -{ -} + // Increment next + this->next_++; -void -TAO_Lifespan_Strategy::set_active_object_map (TAO_Active_Object_Map *active_object_map) -{ - this->active_object_map_ = active_object_map; + return 0; } -//////////////////////////////////////////////////////////////////////////////// - int -TAO_Transient_Strategy::find_servant_using_system_id_and_user_id (const PortableServer::ObjectId &system_id, - const PortableServer::ObjectId &user_id, - PortableServer::Servant &servant, - TAO_Active_Object_Map::Map_Entry *&entry) +TAO_Linear_Active_Object_Map::find (const PortableServer::ObjectId &id, + PortableServer::Servant &servant) { - int result = this->active_object_map_->id_hint_strategy_->find (system_id, - entry); - if (result == 0) - { - if (entry->deactivated_) - { - result = -1; - } - else if (entry->servant_ == 0) - { - result = -1; - } - else - { - servant = entry->servant_; - } - } - else + for (TAO_Active_Object_Map_Entry *i = this->map_; + i != this->map_ + this->next_; + ++i) { - result = this->active_object_map_->user_id_map_->find (user_id, - entry); - if (result == 0) + if (i->is_free_) + continue; + else if (i->id_ == id) { - if (entry->deactivated_) - { - result = -1; - } - else if (entry->servant_ == 0) - { - result = -1; - } - else - { - servant = entry->servant_; - } + servant = i->servant_; + return 0; } } - - return result; + return -1; } -//////////////////////////////////////////////////////////////////////////////// - int -TAO_Persistent_Strategy::find_servant_using_system_id_and_user_id (const PortableServer::ObjectId &system_id, - const PortableServer::ObjectId &user_id, - PortableServer::Servant &servant, - TAO_Active_Object_Map::Map_Entry *&entry) +TAO_Linear_Active_Object_Map::unbind (const PortableServer::ObjectId &id, + PortableServer::Servant &servant) { - int result = this->active_object_map_->id_hint_strategy_->find (system_id, - entry); - if (result == 0 && - user_id == entry->user_id_) + for (TAO_Active_Object_Map_Entry *i = this->map_; + i != this->map_ + this->next_; + ++i) { - if (entry->deactivated_) - { - result = -1; - } - else if (entry->servant_ == 0) + if (i->is_free_) + continue; + else if (i->id_ == id) { - result = -1; - } - else - { - servant = entry->servant_; + servant = i->servant_; + i->is_free_ = 1; + return 0; } } - else - { - result = this->active_object_map_->user_id_map_->find (user_id, - entry); - if (result == 0) - { - if (entry->deactivated_) - { - result = -1; - } - else if (entry->servant_ == 0) - { - result = -1; - } - else - { - servant = entry->servant_; - } - } - } - - return result; -} - -//////////////////////////////////////////////////////////////////////////////// - -TAO_Id_Assignment_Strategy::~TAO_Id_Assignment_Strategy (void) -{ -} - -void -TAO_Id_Assignment_Strategy::set_active_object_map (TAO_Active_Object_Map *active_object_map) -{ - this->active_object_map_ = active_object_map; -} - -//////////////////////////////////////////////////////////////////////////////// - -int -TAO_User_Id_Strategy::bind_using_system_id (PortableServer::Servant servant, - TAO_Active_Object_Map::Map_Entry *&entry) -{ return -1; } -//////////////////////////////////////////////////////////////////////////////// - int -TAO_System_Id_With_Unique_Id_Strategy::bind_using_system_id (PortableServer::Servant servant, - TAO_Active_Object_Map::Map_Entry *&entry) +TAO_Linear_Active_Object_Map::resize (void) { - ACE_NEW_RETURN (entry, - TAO_Active_Object_Map::Map_Entry, - -1); - - int result = this->active_object_map_->user_id_map_->bind_create_key (entry, - entry->user_id_); - if (result == 0) - { - entry->servant_ = servant; - - result = this->active_object_map_->id_hint_strategy_->bind (*entry); - - if (result == 0) - { - if (servant != 0) - { - result = this->active_object_map_->servant_map_->bind (entry->servant_, - entry); - } - - if (result != 0) - { - this->active_object_map_->user_id_map_->unbind (entry->user_id_); - this->active_object_map_->id_hint_strategy_->unbind (*entry); - delete entry; - } - } - else - { - this->active_object_map_->user_id_map_->unbind (entry->user_id_); - delete entry; - } - } + if (this->mapsize_ < TAO_Linear_Active_Object_Map::MAX_EXPONENTIAL) + this->mapsize_ *= 2; else - { - delete entry; - } - - return result; -} - -//////////////////////////////////////////////////////////////////////////////// + this->mapsize_ += TAO_Linear_Active_Object_Map::LINEAR_INCREASE; -int -TAO_System_Id_With_Multiple_Id_Strategy::bind_using_system_id (PortableServer::Servant servant, - TAO_Active_Object_Map::Map_Entry *&entry) -{ - ACE_NEW_RETURN (entry, - TAO_Active_Object_Map::Map_Entry, + TAO_Active_Object_Map_Entry *tmp; + ACE_NEW_RETURN (tmp, + TAO_Active_Object_Map_Entry[this->mapsize_], -1); - int result = this->active_object_map_->user_id_map_->bind_create_key (entry, - entry->user_id_); - if (result == 0) - { - entry->servant_ = servant; + // Copy old stuff + for (TAO_Active_Object_Map_Entry *i = this->map_, *j = tmp; + i != this->map_ + this->next_; + ++i, ++j) + *j = *i; - result = this->active_object_map_->id_hint_strategy_->bind (*entry); + delete [] this->map_; - if (result != 0) - { - this->active_object_map_->user_id_map_->unbind (entry->user_id_); - delete entry; - } - } - else - { - delete entry; - } - - return result; + this->map_ = tmp; + return 0; } -//////////////////////////////////////////////////////////////////////////////// - -TAO_Id_Hint_Strategy::~TAO_Id_Hint_Strategy (void) +PortableServer::ObjectId * +TAO_Linear_Active_Object_Map::create_object_id (PortableServer::Servant, + CORBA::Environment &) { -} - -//////////////////////////////////////////////////////////////////////////////// + PortableServer::ObjectId *id; + CORBA::ULong size = sizeof (CORBA::ULong); + ACE_NEW_RETURN (id, + PortableServer::ObjectId (size), + 0); -TAO_Active_Hint_Strategy::TAO_Active_Hint_Strategy (CORBA::ULong map_size) - : system_id_map_ (map_size) -{ -} + id->length (size); -TAO_Active_Hint_Strategy::~TAO_Active_Hint_Strategy (void) -{ -} + ACE_OS::memcpy (id->get_buffer (), + &this->counter_, + size); -int -TAO_Active_Hint_Strategy::recover_key (const PortableServer::ObjectId &system_id, - PortableServer::ObjectId &user_id) -{ - return this->system_id_map_.recover_key (system_id, - user_id); + this->counter_++; + + return id; } int -TAO_Active_Hint_Strategy::bind (TAO_Active_Object_Map::Map_Entry &entry) +TAO_Active_Demux_Active_Object_Map::bind (const PortableServer::ObjectId &id, + PortableServer::Servant servant) { - entry.system_id_ = entry.user_id_; + CORBA::ULong index = 0; + CORBA::ULong generation = 0; + int result = this->parse_object_id (id, index, generation); - return this->system_id_map_.bind_modify_key (&entry, - entry.system_id_); -} + if (result != 0 || + index > this->mapsize_ || + this->map_[index].generation_ != generation || + this->map_[index].is_free_ != 0) + return -1; -int -TAO_Active_Hint_Strategy::unbind (TAO_Active_Object_Map::Map_Entry &entry) -{ - return this->system_id_map_.unbind (entry.system_id_); -} + this->map_[index].servant_ = servant; -int -TAO_Active_Hint_Strategy::find (const PortableServer::ObjectId &system_id, - TAO_Active_Object_Map::Map_Entry *&entry) -{ - return this->system_id_map_.find (system_id, - entry); -} - -size_t -TAO_Active_Hint_Strategy::hint_size (void) -{ - return ACE_Active_Map_Manager_Key::size (); + return 0; } int -TAO_Active_Hint_Strategy::system_id (PortableServer::ObjectId_out system_id, - TAO_Active_Object_Map::Map_Entry &entry) +TAO_Active_Demux_Active_Object_Map::find (const PortableServer::ObjectId &id, + PortableServer::Servant &servant) { - ACE_NEW_RETURN (system_id, - PortableServer::ObjectId (entry.system_id_), - -1); - return 0; -} + CORBA::ULong index = 0; + CORBA::ULong generation = 0; + int result = this->parse_object_id (id, index, generation); -//////////////////////////////////////////////////////////////////////////////// + if (result != 0 + || index > this->mapsize_ + || this->map_[index].generation_ != generation + || this->map_[index].is_free_ != 0) + return -1; -TAO_No_Hint_Strategy::~TAO_No_Hint_Strategy (void) -{ -} - -int -TAO_No_Hint_Strategy::recover_key (const PortableServer::ObjectId &system_id, - PortableServer::ObjectId &user_id) -{ - // Smartly copy all the data; <user_id does not own the data>. - user_id.replace (system_id.maximum (), - system_id.length (), - ACE_const_cast (CORBA::Octet *, - system_id.get_buffer ()), - 0); + servant = this->map_[index].servant_; return 0; } int -TAO_No_Hint_Strategy::bind (TAO_Active_Object_Map::Map_Entry &entry) +TAO_Active_Demux_Active_Object_Map::unbind (const PortableServer::ObjectId &id, + PortableServer::Servant &servant) { - return 0; -} + CORBA::ULong index = 0; + CORBA::ULong generation = 0; + int result = this->parse_object_id (id, index, generation); -int -TAO_No_Hint_Strategy::unbind (TAO_Active_Object_Map::Map_Entry &entry) -{ - return 0; -} + if (result != 0 || + index > this->mapsize_ || + this->map_[index].generation_ != generation || + this->map_[index].is_free_ != 0) + return -1; -int -TAO_No_Hint_Strategy::find (const PortableServer::ObjectId &system_id, - TAO_Active_Object_Map::Map_Entry *&entry) -{ - return -1; -} + servant = this->map_[index].servant_; + this->map_[index].is_free_ = 1; -size_t -TAO_No_Hint_Strategy::hint_size (void) -{ return 0; } -int -TAO_No_Hint_Strategy::system_id (PortableServer::ObjectId_out system_id, - TAO_Active_Object_Map::Map_Entry &entry) +PortableServer::ObjectId * +TAO_Active_Demux_Active_Object_Map::create_object_id (PortableServer::Servant servant, + CORBA::Environment &) { - ACE_NEW_RETURN (system_id, - PortableServer::ObjectId (entry.user_id_), - -1); - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// + // This method assumes that locks are held when it is called + CORBA::ULong id_data[2]; + CORBA::ULong index = this->next_free (); + id_data[TAO_Active_Demux_Active_Object_Map::INDEX_FIELD] = index; -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) + // Increment generation count. + id_data[TAO_Active_Demux_Active_Object_Map::GENERATION_FIELD] = + ++this->map_[index].generation_; -template class auto_ptr<TAO_Id_Uniqueness_Strategy>; -template class auto_ptr<TAO_Lifespan_Strategy>; -template class auto_ptr<TAO_Id_Assignment_Strategy>; -template class auto_ptr<TAO_Id_Hint_Strategy>; -template class auto_ptr<TAO_Active_Object_Map::servant_map>; -template class auto_ptr<TAO_Active_Object_Map::user_id_map>; + // Move next along if index is not reused + if (index == this->next_) + this->next_++; -template class ACE_Auto_Basic_Ptr<TAO_Id_Uniqueness_Strategy>; -template class ACE_Auto_Basic_Ptr<TAO_Lifespan_Strategy>; -template class ACE_Auto_Basic_Ptr<TAO_Id_Assignment_Strategy>; -template class ACE_Auto_Basic_Ptr<TAO_Id_Hint_Strategy>; -template class ACE_Auto_Basic_Ptr<TAO_Active_Object_Map::servant_map>; -template class ACE_Auto_Basic_Ptr<TAO_Active_Object_Map::user_id_map>; + PortableServer::ObjectId *id; + CORBA::ULong size = 2 * sizeof (CORBA::ULong); + ACE_NEW_RETURN (id, + PortableServer::ObjectId (size), + 0); -// Common typedefs. -typedef PortableServer::ObjectId id; -typedef PortableServer::Servant servant; -typedef TAO_Active_Object_Map::Map_Entry *value; + id->length (size); -typedef ACE_Pair<id, value> id_expanded_value; -typedef ACE_Reference_Pair<const id, value> id_value_type; -typedef ACE_Reference_Pair<const servant, value> servant_value_type; -typedef ACE_Equal_To<id> id_compare_keys; -typedef ACE_Equal_To<servant> servant_compare_keys; -typedef TAO_ObjectId_Hash id_hash; -typedef TAO_Servant_Hash servant_hash; -typedef ACE_Noop_Key_Generator<servant> noop_servant_key_generator; + ACE_OS::memcpy (id->get_buffer (), + &id_data, + size); -template class ACE_Noop_Key_Generator<servant>; + // Set the new values + this->map_[index].id_ = *id; + this->map_[index].servant_ = servant; + this->map_[index].is_free_ = 0; -// Common -template class ACE_Reference_Pair<const id, value>; -template class ACE_Reference_Pair<const servant, value>; + return id; +} -// Map and iterator classes. -template class ACE_Map<id, value>; -template class ACE_Map<servant, value>; -template class ACE_Iterator<id_value_type>; -template class ACE_Iterator<servant_value_type>; -template class ACE_Reverse_Iterator<id_value_type>; -template class ACE_Reverse_Iterator<servant_value_type>; +CORBA::ULong +TAO_Active_Demux_Active_Object_Map::next_free (void) +{ + for (;;) + { + for (TAO_Active_Object_Map_Entry *i = this->map_; + i != this->map_ + this->mapsize_; + ++i) + if (i->is_free_) + return i - this->map_; -// Iterator base classes. -template class ACE_Iterator_Impl<id_value_type>; -template class ACE_Iterator_Impl<servant_value_type>; -template class ACE_Reverse_Iterator_Impl<id_value_type>; -template class ACE_Reverse_Iterator_Impl<servant_value_type>; + this->resize (); + } +} -// Active Map Manager related. -template class ACE_Pair<id, value>; -template class ACE_Active_Map_Manager_Adapter<id, value, TAO_Ignore_Original_Key_Adapter>; -template class ACE_Active_Map_Manager_Adapter<id, value, TAO_Preserve_Original_Key_Adapter>; -template class ACE_Active_Map_Manager_Iterator_Adapter<id_value_type, id_expanded_value>; -template class ACE_Active_Map_Manager_Reverse_Iterator_Adapter<id_value_type, id_expanded_value>; -template class ACE_Active_Map_Manager<id_expanded_value>; -template class ACE_Map_Manager<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex>; -template class ACE_Map_Iterator_Base<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex>; -template class ACE_Map_Iterator<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex>; -template class ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex>; -template class ACE_Map_Entry<ACE_Active_Map_Manager_Key, id_expanded_value>; +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -// Hash Map Manager related. -template class ACE_Hash_Map_Manager_Ex_Adapter<id, value, id_hash, id_compare_keys, TAO_Incremental_Key_Generator>; -template class ACE_Hash_Map_Manager_Ex_Adapter<servant, value, servant_hash, servant_compare_keys, noop_servant_key_generator>; -template class ACE_Hash_Map_Manager_Ex_Iterator_Adapter<id_value_type, id, value, id_hash, id_compare_keys>; -template class ACE_Hash_Map_Manager_Ex_Iterator_Adapter<servant_value_type, servant, value, servant_hash, servant_compare_keys>; -template class ACE_Hash_Map_Manager_Ex_Reverse_Iterator_Adapter<id_value_type, id, value, id_hash, id_compare_keys>; -template class ACE_Hash_Map_Manager_Ex_Reverse_Iterator_Adapter<servant_value_type, servant, value, servant_hash, servant_compare_keys>; -template class ACE_Hash_Map_Manager_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Manager_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Base_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Base_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Reverse_Iterator_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Reverse_Iterator_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex>; -template class ACE_Hash_Map_Entry<id, value>; -template class ACE_Hash_Map_Entry<servant, value>; -template class ACE_Equal_To<id>; -template class ACE_Equal_To<servant>; +template class ACE_Hash_Map_Iterator_Base_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Iterator_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Reverse_Iterator_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Entry<PortableServer::ObjectId, PortableServer::Servant>; +template class ACE_Equal_To<PortableServer::ObjectId>; -// Map Manager related. -template class ACE_Map_Manager_Iterator_Adapter<id_value_type, id, value>; -template class ACE_Map_Manager_Iterator_Adapter<servant_value_type, servant, value>; -template class ACE_Map_Manager_Reverse_Iterator_Adapter<id_value_type, id, value>; -template class ACE_Map_Manager_Reverse_Iterator_Adapter<servant_value_type, servant, value>; -template class ACE_Map_Manager_Adapter<id, value, TAO_Incremental_Key_Generator>; -template class ACE_Map_Manager_Adapter<servant, value, noop_servant_key_generator>; -template class ACE_Map_Manager<id, value, ACE_Null_Mutex>; -template class ACE_Map_Manager<servant, value, ACE_Null_Mutex>; -template class ACE_Map_Iterator_Base<id, value, ACE_Null_Mutex>; -template class ACE_Map_Iterator_Base<servant, value, ACE_Null_Mutex>; -template class ACE_Map_Iterator<id, value, ACE_Null_Mutex>; -template class ACE_Map_Iterator<servant, value, ACE_Null_Mutex>; -template class ACE_Map_Reverse_Iterator<id, value, ACE_Null_Mutex>; -template class ACE_Map_Reverse_Iterator<servant, value, ACE_Null_Mutex>; -template class ACE_Map_Entry<id, value>; -template class ACE_Map_Entry<servant, value>; +template class ACE_Hash_Map_Iterator_Base_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Iterator_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Reverse_Iterator_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Manager_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex>; +template class ACE_Hash_Map_Entry<PortableServer::Servant, PortableServer::ObjectId>; +template class ACE_Equal_To<PortableServer::Servant>; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate auto_ptr<TAO_Id_Uniqueness_Strategy> -#pragma instantiate auto_ptr<TAO_Lifespan_Strategy> -#pragma instantiate auto_ptr<TAO_Id_Assignment_Strategy> -#pragma instantiate auto_ptr<TAO_Id_Hint_Strategy> -#pragma instantiate auto_ptr<TAO_Active_Object_Map::servant_map> -#pragma instantiate auto_ptr<TAO_Active_Object_Map::user_id_map> - -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Id_Uniqueness_Strategy> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Lifespan_Strategy> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Id_Assignment_Strategy> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Id_Hint_Strategy> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Active_Object_Map::servant_map> -#pragma instantiate ACE_Auto_Basic_Ptr<TAO_Active_Object_Map::user_id_map> - -// Common typedefs. -typedef PortableServer::ObjectId id; -typedef PortableServer::Servant servant; -typedef TAO_Active_Object_Map::Map_Entry * value; - -typedef ACE_Pair<id, value> id_expanded_value; -typedef ACE_Reference_Pair<const id, value> id_value_type; -typedef ACE_Reference_Pair<const servant, value> servant_value_type; -typedef ACE_Equal_To<id> id_compare_keys; -typedef ACE_Equal_To<servant> servant_compare_keys; -typedef TAO_ObjectId_Hash id_hash; -typedef TAO_Servant_Hash servant_hash; -typedef ACE_Noop_Key_Generator<servant> noop_servant_key_generator; - -#pragma instantiate ACE_Noop_Key_Generator<servant> - -// Common -#pragma instantiate ACE_Reference_Pair<const id, value> -#pragma instantiate ACE_Reference_Pair<const servant, value> - -// Map and iterator classes. -#pragma instantiate ACE_Map<id, value> -#pragma instantiate ACE_Map<servant, value> -#pragma instantiate ACE_Iterator<id_value_type> -#pragma instantiate ACE_Iterator<servant_value_type> -#pragma instantiate ACE_Reverse_Iterator<id_value_type> -#pragma instantiate ACE_Reverse_Iterator<servant_value_type> - -// Iterator base classes. -#pragma instantiate ACE_Iterator_Impl<id_value_type> -#pragma instantiate ACE_Iterator_Impl<servant_value_type> -#pragma instantiate ACE_Reverse_Iterator_Impl<id_value_type> -#pragma instantiate ACE_Reverse_Iterator_Impl<servant_value_type> - -// Active Map Manager related. -#pragma instantiate ACE_Pair<id, value> -#pragma instantiate ACE_Active_Map_Manager_Adapter<id, value, TAO_Ignore_Original_Key_Adapter> -#pragma instantiate ACE_Active_Map_Manager_Adapter<id, value, TAO_Preserve_Original_Key_Adapter> -#pragma instantiate ACE_Active_Map_Manager_Iterator_Adapter<id_value_type, id_expanded_value> -#pragma instantiate ACE_Active_Map_Manager_Reverse_Iterator_Adapter<id_value_type, id_expanded_value> -#pragma instantiate ACE_Active_Map_Manager<id_expanded_value> -#pragma instantiate ACE_Map_Manager<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Iterator_Base<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Iterator<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Reverse_Iterator<ACE_Active_Map_Manager_Key, id_expanded_value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Entry<ACE_Active_Map_Manager_Key, id_expanded_value> - -// Hash Map Manager related. -#pragma instantiate ACE_Hash_Map_Manager_Ex_Adapter<id, value, id_hash, id_compare_keys, TAO_Incremental_Key_Generator> -#pragma instantiate ACE_Hash_Map_Manager_Ex_Adapter<servant, value, servant_hash, servant_compare_keys, noop_servant_key_generator> -#pragma instantiate ACE_Hash_Map_Manager_Ex_Iterator_Adapter<id_value_type, id, value, id_hash, id_compare_keys> -#pragma instantiate ACE_Hash_Map_Manager_Ex_Iterator_Adapter<servant_value_type, servant, value, servant_hash, servant_compare_keys> -#pragma instantiate ACE_Hash_Map_Manager_Ex_Reverse_Iterator_Adapter<id_value_type, id, value, id_hash, id_compare_keys> -#pragma instantiate ACE_Hash_Map_Manager_Ex_Reverse_Iterator_Adapter<servant_value_type, servant, value, servant_hash, servant_compare_keys> -#pragma instantiate ACE_Hash_Map_Manager_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Manager_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Iterator_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Iterator_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<id, value, id_hash, id_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<servant, value, servant_hash, servant_compare_keys, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Entry<id, value> -#pragma instantiate ACE_Hash_Map_Entry<servant, value> -#pragma instantiate ACE_Equal_To<id> -#pragma instantiate ACE_Equal_To<servant> - -// Map Manager related. -#pragma instantiate ACE_Map_Manager_Iterator_Adapter<id_value_type, id, value> -#pragma instantiate ACE_Map_Manager_Iterator_Adapter<servant_value_type, servant, value> -#pragma instantiate ACE_Map_Manager_Reverse_Iterator_Adapter<id_value_type, id, value> -#pragma instantiate ACE_Map_Manager_Reverse_Iterator_Adapter<servant_value_type, servant, value> -#pragma instantiate ACE_Map_Manager_Adapter<id, value, TAO_Incremental_Key_Generator> -#pragma instantiate ACE_Map_Manager_Adapter<servant, value, noop_servant_key_generator> -#pragma instantiate ACE_Map_Manager<id, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Manager<servant, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Iterator_Base<id, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Iterator_Base<servant, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Iterator<id, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Iterator<servant, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Reverse_Iterator<id, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Reverse_Iterator<servant, value, ACE_Null_Mutex> -#pragma instantiate ACE_Map_Entry<id, value> -#pragma instantiate ACE_Map_Entry<servant, value> +#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Iterator_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId, PortableServer::Servant, TAO_ObjectId_Hash, ACE_Equal_To<PortableServer::ObjectId>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Entry<PortableServer::ObjectId, PortableServer::Servant> +#pragma instantiate ACE_Equal_To<PortableServer::ObjectId> + +#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Iterator_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Manager_Ex<PortableServer::Servant, PortableServer::ObjectId, TAO_Servant_Hash, ACE_Equal_To<PortableServer::Servant>, ACE_Null_Mutex> +#pragma instantiate ACE_Hash_Map_Entry<PortableServer::Servant, PortableServer::ObjectId> +#pragma instantiate ACE_Equal_To<PortableServer::Servant> #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |