#include <Storable_Naming_Context.h>
Inheritance diagram for TAO_Storable_Naming_Context:


Public Types | |
| typedef TAO_Storable_Bindings_Map::HASH_MAP | HASH_MAP |
| Underlying data structure - typedef for ease of use. | |
Public Member Functions | |
| TAO_Storable_Naming_Context (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, const char *poa_id, TAO_Naming_Service_Persistence_Factory *factory, const ACE_TCHAR *persistence_directory, size_t hash_table_size=ACE_DEFAULT_MAP_SIZE) | |
| Constructor. | |
| virtual | ~TAO_Storable_Naming_Context (void) |
| Destructor. | |
| virtual CosNaming::NamingContext_ptr | new_context (void) |
| virtual void | list (CORBA::ULong how_many, CosNaming::BindingList_out &bl, CosNaming::BindingIterator_out &bi) |
| virtual void | rebind (const CosNaming::Name &n, CORBA::Object_ptr obj) |
| virtual void | bind (const CosNaming::Name &n, CORBA::Object_ptr obj) |
| virtual void | bind_context (const CosNaming::Name &n, CosNaming::NamingContext_ptr nc) |
| virtual void | rebind_context (const CosNaming::Name &n, CosNaming::NamingContext_ptr nc) |
| virtual CORBA::Object_ptr | resolve (const CosNaming::Name &n) |
| virtual void | unbind (const CosNaming::Name &n) |
| virtual CosNaming::NamingContext_ptr | bind_new_context (const CosNaming::Name &n) |
| virtual void | destroy (void) |
Static Public Member Functions | |
| CosNaming::NamingContext_ptr | make_new_context (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, const char *poa_id, size_t context_size, TAO_Naming_Service_Persistence_Factory *factory, const ACE_TCHAR *persistence_directory, TAO_Storable_Naming_Context **new_context) |
| CosNaming::NamingContext_ptr | recreate_all (CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, const char *poa_id, size_t context_size, int reentering, TAO_Naming_Service_Persistence_Factory *factory, const ACE_TCHAR *persistence_directory, int use_redundancy) |
Protected Member Functions | |
| int | load_map (File_Open_Lock_and_Check *flck) |
| void | Write (TAO_Storable_Base &wrtr) |
Protected Attributes | |
| ACE_UINT32 | counter_ |
| Counter used for generation of transients. | |
| TAO_Storable_Bindings_Map * | storable_context_ |
| CORBA::ORB_var | orb_ |
| ACE_CString | name_ |
| PortableServer::POA_var | poa_ |
| POA we are registered with. | |
| TAO_Naming_Service_Persistence_Factory * | factory_ |
| ACE_CString | persistence_directory_ |
| The directory in which to store the files. | |
| size_t | hash_table_size_ |
| Save the hash table initial size. | |
| time_t | last_changed_ |
| Disk time that match current memory state. | |
Static Protected Attributes | |
| ACE_UINT32 | gcounter_ |
| int | redundant_ |
| Flag to tell use whether we are redundant or not. | |
| const char * | root_name_ |
| ACE_Auto_Ptr< TAO_Storable_Base > | gfl_ |
| The pointer to the global file used to allocate new contexts. | |
Friends | |
| class | File_Open_Lock_and_Check |
This class provides a implementation of the NamingContext functionality, i.e., the state can be preserved across process boundaries. Derives from TAO_Hash_Naming_Context and uses TAO_Storable_Bindings_Map to store name to object bindings.
Definition at line 218 of file Storable_Naming_Context.h.
|
|
Underlying data structure - typedef for ease of use.
Definition at line 224 of file Storable_Naming_Context.h. |
|
||||||||||||||||||||||||||||
|
Constructor.
Definition at line 546 of file Storable_Naming_Context.cpp. References ACE_TEXT_ALWAYS_CHAR, ACE_TRACE, hash_table_size_, last_changed_, persistence_directory_, and storable_context_.
00553 : TAO_Hash_Naming_Context (poa, 00554 poa_id), 00555 counter_ (0), 00556 storable_context_ (0), 00557 orb_(CORBA::ORB::_duplicate (orb)), 00558 name_ (poa_id), 00559 poa_ (PortableServer::POA::_duplicate (poa)), 00560 factory_(factory), 00561 persistence_directory_ (ACE_TEXT_ALWAYS_CHAR(persistence_directory)), 00562 hash_table_size_(hash_table_size), 00563 last_changed_(0) 00564 { 00565 ACE_TRACE("TAO_Storable_Naming_Context"); 00566 } |
|
|
Destructor.
Definition at line 568 of file Storable_Naming_Context.cpp. References ACE_CString, ACE_DEBUG, ACE_TEXT, ACE_TRACE, ACE_Auto_Basic_Ptr< X >::get(), LM_DEBUG, and TAO_debug_level.
00569 {
00570 ACE_TRACE("~TAO_Storable_Naming_Context");
00571
00572 // If we're in the DTOR as a result of the destroy() operation,
00573 // then we go ahead and delete the file. Otherwise, we leave the
00574 // file around because they need to be there for persistence.
00575 if (this->destroyed_)
00576 {
00577 // Make sure we delete the associated stream
00578 ACE_CString file_name (this->persistence_directory_);
00579 file_name += "/";
00580 file_name += this->name_;
00581
00582 // Now delete the file
00583 ACE_Auto_Ptr<TAO_Storable_Base>
00584 fl (
00585 this->factory_->create_stream(file_name.c_str(),
00586 ACE_TEXT("r"))
00587 );
00588 if (fl.get())
00589 {
00590 if (TAO_debug_level > 5)
00591 ACE_DEBUG ((LM_DEBUG, "(%P|%t) NameService: removing file %s\n",
00592 file_name.fast_rep()));
00593 fl->remove ();
00594 }
00595 }
00596 }
|
|
||||||||||||
|
Create a binding for name and object in the naming context. Compound names are treated as follows: ctx->bind (<c1; c2; c3; cn>, obj) = (ctx->resolve (<c1; c2; cn-1>))->bind (, obj) if the there already exists a binding for the specified name, exception is thrown. Naming contexts should be bound using and in order to participate in name resolution later. Reimplemented from TAO_Hash_Naming_Context. Definition at line 1208 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Bindings_Map::bind(), TAO_Hash_Naming_Context::get_context(), CosNaming::Name, TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(), and Write().
01210 {
01211 ACE_TRACE("TAO_Storable_Naming_Context::bind");
01212 // Get the length of the name.
01213 CORBA::ULong name_len = n.length ();
01214
01215 // Check for invalid name.
01216 if (name_len == 0)
01217 throw CosNaming::NamingContext::InvalidName();
01218
01219 // we didn't need a lock to check the input arg, but now we do
01220 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
01221 this->lock_,
01222 CORBA::INTERNAL ());
01223
01224 // Open the backing file
01225 File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
01226
01227 // Check to make sure this object didn't have <destroy> method
01228 // invoked on it.
01229 if (this->destroyed_)
01230 throw CORBA::OBJECT_NOT_EXIST ();
01231
01232 // If we received compound name, resolve it to get the context in
01233 // which the binding should take place, then perform the binding
01234 // on target context.
01235 if (name_len > 1)
01236 {
01237 // This had been a read on the file so now we are done with it
01238 flck.release();
01239
01240 CosNaming::NamingContext_var context =
01241 get_context (n);
01242
01243 CosNaming::Name simple_name;
01244 simple_name.length (1);
01245 simple_name[0] = n[name_len - 1];
01246 context->bind (simple_name, obj);
01247 }
01248 // If we received a simple name, we need to bind it in this context.
01249 else
01250 {
01251 // Try binding the name.
01252 int result = this->context_->bind (n[0].id,
01253 n[0].kind,
01254 obj,
01255 CosNaming::nobject);
01256 if (result == 1)
01257 throw CosNaming::NamingContext::AlreadyBound();
01258
01259 // Something went wrong with the internal structure
01260 else if (result == -1)
01261 throw CORBA::INTERNAL ();
01262
01263 this->Write(flck.peer());
01264 }
01265 }
|
|
||||||||||||
|
This is the version of specifically for binding naming contexts, so that they will participate in name resolution when compound names are passed to be resolved. Reimplemented from TAO_Hash_Naming_Context. Definition at line 814 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Bindings_Map::bind(), TAO_Hash_Naming_Context::get_context(), CORBA::is_nil(), CosNaming::Name, TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(), and Write(). Referenced by bind_new_context().
00816 {
00817 ACE_TRACE("TAO_Storable_Naming_Context::bind_context");
00818 // Get the length of the name.
00819 CORBA::ULong name_len = n.length ();
00820
00821 // Check for invalid name.
00822 if (name_len == 0)
00823 throw CosNaming::NamingContext::InvalidName();
00824
00825 // Do not allow binding of nil context reference.
00826 if (CORBA::is_nil (nc))
00827 throw CORBA::BAD_PARAM ();
00828
00829 // we didn't need a lock to check the input arg, but now we do
00830 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
00831 this->lock_,
00832 CORBA::INTERNAL ());
00833
00834 // Open the backing file
00835 File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
00836
00837 // Check to make sure this object didn't have <destroy> method
00838 // invoked on it.
00839 if (this->destroyed_)
00840 throw CORBA::OBJECT_NOT_EXIST ();
00841
00842 // If we received compound name, resolve it to get the context in
00843 // which the binding should take place, then perform the binding
00844 // on target context.
00845 if (name_len > 1)
00846 {
00847 // This had been a read on the file so now we are done with it
00848 flck.release();
00849
00850 CosNaming::NamingContext_var context =
00851 get_context (n);
00852
00853 CosNaming::Name simple_name;
00854 simple_name.length (1);
00855 simple_name[0] = n[name_len - 1];
00856 context->bind_context (simple_name, nc);
00857 }
00858 // If we received a simple name, we need to bind it in this context.
00859 else
00860 {
00861 // Try binding the name.
00862 int result = this->context_->bind (n[0].id,
00863 n[0].kind,
00864 nc,
00865 CosNaming::ncontext);
00866 if (result == 1)
00867 throw CosNaming::NamingContext::AlreadyBound();
00868
00869 // Something went wrong with the internal structure
00870 else if (result == -1)
00871 throw CORBA::INTERNAL ();
00872
00873 this->Write(flck.peer());
00874 }
00875 }
|
|
|
This operation creates a new context and binds it to the name supplied as an argument. The newly-created context is implemented by the same server as the context in which it was bound (the name argument excluding the last component). Reimplemented from TAO_Hash_Naming_Context. Definition at line 1081 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, bind_context(), TAO_Hash_Naming_Context::get_context(), CosNaming::Name, new_context(), and TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release().
01082 {
01083 ACE_TRACE("bind_new_context");
01084 // Get the length of the name.
01085 CORBA::ULong name_len = n.length ();
01086
01087 // Check for invalid name.
01088 if (name_len == 0)
01089 throw CosNaming::NamingContext::InvalidName();
01090
01091 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
01092 ace_mon,
01093 this->lock_,
01094 CORBA::INTERNAL ());
01095
01096 // Check to make sure this object didn't have <destroy> method
01097 // invoked on it.
01098 if (this->destroyed_)
01099 throw CORBA::OBJECT_NOT_EXIST ();
01100
01101 // Open the backing file
01102 File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
01103
01104 // Check to make sure this object didn't have <destroy> method
01105 // invoked on it.
01106 if (this->destroyed_)
01107 throw CORBA::OBJECT_NOT_EXIST ();
01108
01109 // If we received compound name, resolve it to get the context in
01110 // which the binding should take place, then perform the operation on
01111 // target context.
01112 if (name_len > 1)
01113 {
01114 // This had been a read on the file so now we are done with it
01115 flck.release();
01116
01117 CosNaming::NamingContext_var context =
01118 get_context (n);
01119
01120 CosNaming::Name simple_name;
01121 simple_name.length (1);
01122 simple_name[0] = n[name_len - 1];
01123 return context->bind_new_context (simple_name);
01124 }
01125 // If we received a simple name, we need to bind it in this context.
01126
01127 // This had been a read on the file so now we are done with it
01128 flck.release();
01129
01130 // Stores our new Naming Context.
01131 CosNaming::NamingContext_var result =
01132 CosNaming::NamingContext::_nil ();
01133
01134 // Create new context.
01135 result = new_context ();
01136
01137 // Bind the new context to the name.
01138 try
01139 {
01140 bind_context (n,
01141 result.in ());
01142 }
01143 catch (const CORBA::Exception&)
01144 {
01145 {
01146 try
01147 {
01148 result->destroy ();
01149 }
01150 catch (const CORBA::Exception&)
01151 {
01152 // Do nothing?
01153 }
01154 }
01155 // Re-raise the exception in bind_context()
01156 throw;
01157 }
01158 return result._retn ();
01159 }
|
|
|
Delete the naming context. The user should take care to any bindings in which the given context is bound to some names, to avoid dangling references when invoking operation. NOTE: is a no-op on the root context. NOTE: after is invoked on a Naming Context, all BindingIterators associated with that Naming Context are also destroyed. Reimplemented from TAO_Hash_Naming_Context. Definition at line 1162 of file Storable_Naming_Context.cpp. References TAO_Hash_Naming_Context::_default_POA(), ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Bindings_Map::current_size(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_Hash_Naming_Context::root(), and Write().
01163 {
01164 ACE_TRACE("destroy");
01165 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
01166 ace_mon,
01167 this->lock_,
01168 CORBA::INTERNAL ());
01169
01170 // Open the backing file
01171 File_Open_Lock_and_Check flck(this, "rw");
01172
01173 // Check to make sure this object didn't have <destroy> method
01174 // invoked on it.
01175 if (this->destroyed_)
01176 throw CORBA::OBJECT_NOT_EXIST ();
01177
01178 if (this->context_->current_size () != 0)
01179 throw CosNaming::NamingContext::NotEmpty();
01180
01181 // Destroy is a no-op on a root context.
01182 if (root ())
01183 return;
01184
01185 else
01186 {
01187 this->destroyed_ = 2;
01188
01189 // Remove self from POA. Because of reference counting, the POA
01190 // will automatically delete the servant when all pending requests
01191 // on this servant are complete.
01192
01193 PortableServer::POA_var poa =
01194 this->_default_POA ();
01195
01196 PortableServer::ObjectId_var id =
01197 PortableServer::string_to_ObjectId (poa_id_.fast_rep ());
01198
01199
01200 poa->deactivate_object (id.in ());
01201
01202 this->Write(flck.peer());
01203 }
01204 }
|
|
||||||||||||||||
|
Returns at most the requested number of bindings in . If the naming context contains additional bindings, they are returned with a BindingIterator. In the naming context does not contain any additional bindings returned as null. Implements TAO_Naming_Context_Impl. Definition at line 1269 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_NEW_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, CosNaming::BindingList, TAO_Bindings_Map::current_size(), TAO_Storable_Bindings_Map::map(), ACE_Auto_Basic_Ptr< X >::release(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(), ACE_OS::sprintf(), and storable_context_.
01272 {
01273 ACE_TRACE("list");
01274 // Allocate nil out parameters in case we won't be able to complete
01275 // the operation.
01276 bi = CosNaming::BindingIterator::_nil ();
01277 ACE_NEW_THROW_EX (bl,
01278 CosNaming::BindingList (0),
01279 CORBA::NO_MEMORY ());
01280
01281 // Obtain a lock before we proceed with the operation.
01282 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
01283 ace_mon,
01284 this->lock_,
01285 CORBA::INTERNAL ());
01286
01287 // Open the backing file
01288 File_Open_Lock_and_Check flck(this, "r");
01289
01290 // Check to make sure this object didn't have <destroy> method
01291 // invoked on it.
01292 if (this->destroyed_)
01293 throw CORBA::OBJECT_NOT_EXIST ();
01294
01295 // We have the map in memory, let the disk go
01296 flck.release();
01297
01298 // Dynamically allocate iterator for traversing the underlying hash map.
01299 HASH_MAP::ITERATOR *hash_iter = 0;
01300 ACE_NEW_THROW_EX (hash_iter,
01301 HASH_MAP::ITERATOR (storable_context_->map ()),
01302 CORBA::NO_MEMORY ());
01303
01304 // Store <hash_iter temporarily in auto pointer, in case we'll have
01305 // some failures and throw an exception.
01306 ACE_Auto_Basic_Ptr<HASH_MAP::ITERATOR> temp (hash_iter);
01307
01308 // Silliness below is required because of broken old g++!!! E.g.,
01309 // without it, we could have just said HASH_MAP::ITERATOR everywhere we use ITER_DEF.
01310 typedef ACE_Hash_Map_Manager<TAO_Storable_ExtId,
01311 TAO_Storable_IntId,
01312 ACE_Null_Mutex>::ITERATOR ITER_DEF;
01313 typedef ACE_Hash_Map_Manager<TAO_Storable_ExtId,
01314 TAO_Storable_IntId,
01315 ACE_Null_Mutex>::ENTRY ENTRY_DEF;
01316
01317 // Typedef to the type of BindingIterator servant for ease of use.
01318 typedef TAO_Bindings_Iterator<ITER_DEF, ENTRY_DEF> ITER_SERVANT;
01319
01320 // A pointer to BindingIterator servant.
01321 ITER_SERVANT *bind_iter = 0;
01322
01323 // Number of bindings that will go into the BindingList <bl>.
01324 CORBA::ULong n;
01325
01326 // Calculate number of bindings that will go into <bl>.
01327 if (this->context_->current_size () > how_many)
01328 n = how_many;
01329 else
01330 n = static_cast<CORBA::ULong> (this->context_->current_size ());
01331
01332 // Use the hash map iterator to populate <bl> with bindings.
01333 bl->length (n);
01334
01335 ENTRY_DEF *hash_entry = 0;
01336
01337 for (CORBA::ULong i = 0; i < n; i++)
01338 {
01339 hash_iter->next (hash_entry);
01340 hash_iter->advance ();
01341
01342 if (ITER_SERVANT::populate_binding (hash_entry, bl[i]) == 0)
01343 throw CORBA::NO_MEMORY();
01344 }
01345
01346 // Now we are done with the BindingsList, and we can follow up on
01347 // the BindingIterator business.
01348
01349 // If we do not need to pass back BindingIterator.
01350 if (this->context_->current_size () <= how_many)
01351 return;
01352 else
01353 {
01354 // *** This is a problem. Is there an exception we can throw? ***
01355 ACE_UNUSED_ARG (bind_iter);
01356 throw CORBA::NO_IMPLEMENT ();
01357
01358 #if 0
01359 // Create a BindingIterator for return.
01360 ACE_NEW_THROW_EX (bind_iter,
01361 ITER_SERVANT (this, hash_iter,
01362 this->poa_.in (), this->lock_),
01363 CORBA::NO_MEMORY ());
01364
01365 // Release <hash_iter> from auto pointer, and start using
01366 // reference counting to control our servant.
01367 temp.release ();
01368 PortableServer::ServantBase_var iter = bind_iter;
01369
01370 // Increment reference count on this Naming Context, so it doesn't get
01371 // deleted before the BindingIterator servant gets deleted.
01372 interface_->_add_ref ();
01373
01374 // Register with the POA.
01375 char poa_id[BUFSIZ];
01376 ACE_OS::sprintf (poa_id,
01377 "%s_%d",
01378 this->poa_id_.c_str (),
01379 this->counter_++);
01380 PortableServer::ObjectId_var id =
01381 PortableServer::string_to_ObjectId (poa_id);
01382
01383 this->poa_->activate_object_with_id (id.in (),
01384 bind_iter);
01385
01386 bi = bind_iter->_this ();
01387 #endif /* 0 */
01388 }
01389 }
|
|
|
Definition at line 350 of file Storable_Naming_Context.cpp. References ACE_NEW_THROW_EX, ACE_TRACE, TAO_Storable_Bindings_Map::bind(), TAO_Storable_Base::clear(), TAO_NS_Persistence_Header::destroyed(), TAO_Storable_Base::good(), hash_table_size_, TAO_NS_Persistence_Record::id(), TAO_NS_Persistence_Record::kind(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_NS_Persistence_Record::ref(), TAO_NS_Persistence_Header::size(), storable_context_, and TAO_NS_Persistence_Record::type(). Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check().
00351 {
00352 ACE_TRACE("load_map");
00353 // assume file already open for reading
00354 TAO_Storable_Bindings_Map *bindings_map;
00355
00356 // create the new bindings map
00357 ACE_NEW_THROW_EX (bindings_map,
00358 TAO_Storable_Bindings_Map (hash_table_size_,orb_.in()),
00359 CORBA::NO_MEMORY ());
00360
00361 // get the data for this bindings map from the file
00362
00363 TAO_NS_Persistence_Header header;
00364 TAO_NS_Persistence_Record record;
00365
00366 // we are only using the size from this header
00367 flck->peer() >> header;
00368 if (!flck->peer ().good ())
00369 {
00370 flck->peer ().clear ();
00371 throw CORBA::INTERNAL ();
00372 }
00373
00374 // reset the destroyed flag
00375 this->destroyed_ = header.destroyed();
00376
00377 // read in the data for the map
00378 for (unsigned int i= 0u; i<header.size(); ++i)
00379 {
00380 flck->peer() >> record;
00381 if (!flck->peer ().good ())
00382 {
00383 flck->peer ().clear ();
00384 throw CORBA::INTERNAL ();
00385 }
00386
00387 if (TAO_NS_Persistence_Record::LOCAL_NCONTEXT == record.type ())
00388 {
00389 PortableServer::ObjectId_var
00390 id = PortableServer::string_to_ObjectId (record.ref ().c_str ());
00391 const char
00392 *intf = interface_->_interface_repository_id ();
00393 CORBA::Object_var
00394 objref = poa_->create_reference_with_id (id.in (), intf);
00395 bindings_map->bind ( record.id ().c_str (),
00396 record.kind ().c_str (),
00397 objref.in (),
00398 CosNaming::ncontext );
00399 }
00400 else
00401 {
00402 CORBA::Object_var
00403 objref = orb_->string_to_object (record.ref ().c_str ());
00404 bindings_map->bind ( record.id ().c_str (),
00405 record.kind ().c_str (),
00406 objref.in (),
00407 ((TAO_NS_Persistence_Record::REMOTE_NCONTEXT == record.type ())
00408 ? CosNaming::ncontext // REMOTE_NCONTEXT
00409 : CosNaming::nobject )); // OBJREF
00410 }
00411 }
00412 storable_context_ = bindings_map;
00413 context_ = storable_context_;
00414 return 0;
00415 }
|
|
||||||||||||||||||||||||||||||||
|
This utility method factors out the code needed to create a new Storable Naming Context servant and activate it under the specified POA with the specified id. This function is static so that the code can be used, both from inside the class (e.g., ), and from outside (e.g., Naming_Utils.cpp). Definition at line 599 of file Storable_Naming_Context.cpp. References ACE_NEW_THROW_EX, ACE_TRACE, and ACE_Auto_Basic_Ptr< X >::release(). Referenced by new_context(), and recreate_all().
00607 {
00608 ACE_TRACE("make_new_context");
00609 // Store the stub we will return here.
00610 CosNaming::NamingContext_var result;
00611
00612 // Put together a servant for the new Naming Context.
00613
00614 TAO_Storable_Naming_Context *context_impl = 0;
00615 ACE_NEW_THROW_EX (context_impl,
00616 TAO_Storable_Naming_Context (orb,
00617 poa,
00618 poa_id,
00619 factory,
00620 persistence_directory,
00621 context_size),
00622 CORBA::NO_MEMORY ());
00623
00624 // Put <context_impl> into the auto pointer temporarily, in case next
00625 // allocation fails.
00626 ACE_Auto_Basic_Ptr<TAO_Storable_Naming_Context> temp (context_impl);
00627
00628 TAO_Naming_Context *context = 0;
00629 ACE_NEW_THROW_EX (context,
00630 TAO_Naming_Context (context_impl),
00631 CORBA::NO_MEMORY ());
00632
00633 // Let <implementation> know about it's <interface>.
00634 context_impl->interface (context);
00635
00636 // Release auto pointer, and start using reference counting to
00637 // control our servant.
00638 temp.release ();
00639 PortableServer::ServantBase_var s = context;
00640
00641 // Register the new context with the POA.
00642 PortableServer::ObjectId_var id =
00643 PortableServer::string_to_ObjectId (poa_id);
00644
00645 // If we try to register a naming context that is already registered,
00646 // the following activation causes a POA::ObjectAlreadyActive exception be
00647 // thrown which is transmitted as a CORBA::UNKNOWN on the wire. To rectify
00648 // this problem, we explicitly throw the correct INS exception in
00649 // this situation.
00650 try
00651 {
00652 poa->activate_object_with_id (id.in (), context);
00653 }
00654 catch (const PortableServer::POA::ObjectAlreadyActive&)
00655 {
00656 throw CosNaming::NamingContext::AlreadyBound();
00657 }
00658
00659
00660 result = context->_this ();
00661
00662 // return the address of the new context object so that caller can finish
00663 *new_context = context_impl;
00664
00665 return result._retn ();
00666 }
|
|
|
This operation returns a new naming context implemented by the same naming server in which the operation was invoked. The context is not bound. Implements TAO_Naming_Context_Impl. Definition at line 669 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_NEW_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TEXT_CHAR_TO_TCHAR, ACE_TRACE, TAO_Hash_Naming_Context::context_, TAO_NS_Persistence_Global::counter(), gcounter_, ACE_Auto_Basic_Ptr< X >::get(), gfl_, hash_table_size_, make_new_context(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), redundant_, ACE_Auto_Basic_Ptr< X >::release(), root_name_, ACE_OS::sprintf(), storable_context_, TAO_Storable_Bindings_Map::total_size(), and Write(). Referenced by bind_new_context().
00670 {
00671 ACE_TRACE("new_context");
00672 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX,
00673 ace_mon,
00674 this->lock_,
00675 CORBA::INTERNAL ());
00676
00677 {
00678 // Open the backing file
00679 File_Open_Lock_and_Check flck(this, "r");
00680
00681 // Check to make sure this object didn't have <destroy> method
00682 // invoked on it.
00683 if (this->destroyed_)
00684 throw CORBA::OBJECT_NOT_EXIST ();
00685 }
00686
00687 TAO_NS_Persistence_Global global;
00688
00689 // Generate a POA id for the new context.
00690 if(redundant_)
00691 {
00692 // acquire a lock on the file that holds our counter
00693 if (gfl_->open() != 0)
00694 {
00695 delete gfl_.release();
00696 throw CORBA::PERSIST_STORE();
00697 }
00698 if (gfl_ -> flock(0, 0, 0) != 0)
00699 throw CORBA::INTERNAL();
00700 // get the counter from disk
00701 *gfl_.get() >> global;
00702 if (!gfl_.get ()->good () &&
00703 gfl_.get ()->rdstate () != TAO_Storable_Base::eofbit)
00704 {
00705 gfl_.get ()->clear ();
00706 throw CORBA::INTERNAL ();
00707 }
00708 gcounter_ = global.counter();
00709 // use it to generate a new name
00710 }
00711 char poa_id[BUFSIZ];
00712 ACE_OS::sprintf (poa_id,
00713 "%s_%d",
00714 root_name_,
00715 gcounter_++);
00716 // then save it back on disk
00717 global.counter(gcounter_);
00718 *gfl_.get() << global;
00719 if(redundant_)
00720 {
00721 // and release our lock
00722 if (gfl_ -> flock(0, 0, 0) != 0)
00723 throw CORBA::INTERNAL();
00724 gfl_->close();
00725 }
00726
00727 // Create a new context.
00728 TAO_Storable_Naming_Context *new_context = 0;
00729 CosNaming::NamingContext_var result =
00730 make_new_context (this->orb_.in (),
00731 this->poa_.in (),
00732 poa_id,
00733 this->storable_context_->total_size (),
00734 this->factory_,
00735 ACE_TEXT_CHAR_TO_TCHAR (this->persistence_directory_.c_str ()),
00736 &new_context);
00737
00738 // Since this is a new context, make an empty map in it
00739 ACE_NEW_THROW_EX (new_context->storable_context_,
00740 TAO_Storable_Bindings_Map (hash_table_size_,orb_.in ()),
00741 CORBA::NO_MEMORY ());
00742 new_context->context_ = new_context->storable_context_;
00743
00744 File_Open_Lock_and_Check flck(new_context, "wc");
00745 new_context->Write(flck.peer());
00746
00747 return result._retn ();
00748 }
|
|
||||||||||||
|
This is similar to operation above, except for when the binding for the specified name already exists in the specified context. In that case, the existing binding is replaced with the new one. Reimplemented from TAO_Hash_Naming_Context. Definition at line 751 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Hash_Naming_Context::get_context(), CosNaming::Name, TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_Bindings_Map::rebind(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(), and Write().
00753 {
00754 ACE_TRACE("rebind");
00755 // Get the length of the name.
00756 CORBA::ULong name_len = n.length ();
00757
00758 // Check for invalid name.
00759 if (name_len == 0)
00760 throw CosNaming::NamingContext::InvalidName();
00761
00762 // we didn't need a lock to check the input arg, but now we do
00763 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
00764 this->lock_,
00765 CORBA::INTERNAL ());
00766
00767 // Open the backing file
00768 File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
00769
00770 // Check to make sure this object didn't have <destroy> method
00771 // invoked on it.
00772 if (this->destroyed_)
00773 throw CORBA::OBJECT_NOT_EXIST ();
00774
00775 // If we received compound name, resolve it to get the context in
00776 // which the rebinding should take place, then perform the rebinding
00777 // on target context.
00778 if (name_len > 1)
00779 {
00780 // This had been a read on the file so now we are done with it
00781 flck.release();
00782
00783 CosNaming::NamingContext_var context =
00784 get_context (n);
00785
00786 CosNaming::Name simple_name;
00787 simple_name.length (1);
00788 simple_name[0] = n[name_len - 1];
00789 context->rebind (simple_name, obj);
00790 }
00791 // If we received a simple name, we need to rebind it in this
00792 // context.
00793 else
00794 {
00795 int result = this->context_->rebind (n[0].id,
00796 n[0].kind,
00797 obj,
00798 CosNaming::nobject);
00799
00800 // Check for error conditions.
00801 if (result == -1)
00802 throw CORBA::INTERNAL ();
00803
00804 else if (result == -2)
00805 throw CosNaming::NamingContext::NotFound(
00806 CosNaming::NamingContext::not_object,
00807 n);
00808
00809 this->Write(flck.peer());
00810 }
00811 }
|
|
||||||||||||
|
This is a version of specifically for naming contexts, so that they can participate in name resolution when compound names are passed. Reimplemented from TAO_Hash_Naming_Context. Definition at line 878 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Hash_Naming_Context::get_context(), CosNaming::Name, TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_Bindings_Map::rebind(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(), and Write().
00880 {
00881 ACE_TRACE("rebind_context");
00882 // Get the length of the name.
00883 CORBA::ULong name_len = n.length ();
00884
00885 // Check for invalid name.
00886 if (name_len == 0)
00887 throw CosNaming::NamingContext::InvalidName();
00888
00889 // we didn't need a lock to check the input arg, but now we do
00890 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
00891 this->lock_,
00892 CORBA::INTERNAL ());
00893
00894 // Open the backing file
00895 File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
00896
00897 // Check to make sure this object didn't have <destroy> method
00898 // invoked on it.
00899 if (this->destroyed_)
00900 throw CORBA::OBJECT_NOT_EXIST ();
00901
00902 // If we received compound name, resolve it to get the context in
00903 // which the rebinding should take place, then perform the rebinding
00904 // on target context.
00905 if (name_len > 1)
00906 {
00907 // This had been a read on the file so now we are done with it
00908 flck.release();
00909
00910 CosNaming::NamingContext_var context =
00911 get_context (n);
00912
00913 CosNaming::Name simple_name;
00914 simple_name.length (1);
00915 simple_name[0] = n[name_len - 1];
00916 context->rebind_context (simple_name, nc);
00917 }
00918 // If we received a simple name, we need to rebind it in this
00919 // context.
00920 else
00921 {
00922 int result = this->context_->rebind (n[0].id,
00923 n[0].kind,
00924 nc,
00925 CosNaming::ncontext);
00926 // Check for error conditions.
00927 if (result == -1)
00928 throw CORBA::INTERNAL ();
00929 else if (result == -2)
00930 throw CosNaming::NamingContext::NotFound(
00931 CosNaming::NamingContext::not_context,
00932 n);
00933
00934 this->Write(flck.peer());
00935 }
00936 }
|
|
||||||||||||||||||||||||||||||||||||
|
Definition at line 1397 of file Storable_Naming_Context.cpp. References ACE_NEW_THROW_EX, ACE_TEXT, ACE_TEXT_ALWAYS_CHAR, ACE_TEXT_CHAR_TO_TCHAR, ACE_TRACE, ACE_TString, TAO_Hash_Naming_Context::context_, TAO_NS_Persistence_Global::counter(), TAO_Naming_Service_Persistence_Factory::create_stream(), gcounter_, ACE_Auto_Basic_Ptr< X >::get(), gfl_, make_new_context(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), redundant_, ACE_Auto_Basic_Ptr< X >::release(), ACE_Auto_Basic_Ptr< X >::reset(), root_name_, storable_context_, and Write(). Referenced by TAO_Naming_Server::init_new_naming().
01406 {
01407 ACE_TRACE("recreate_all");
01408
01409 ACE_UNUSED_ARG (reentering);
01410
01411 // Whether we are redundant is global
01412 redundant_ = use_redundancy;
01413
01414 // Save the root name for later use
01415 root_name_ = poa_id;
01416
01417 // Create a new context.
01418 TAO_Storable_Naming_Context *new_context = 0;
01419 CosNaming::NamingContext_var result =
01420 make_new_context (orb,
01421 poa,
01422 poa_id,
01423 context_size,
01424 factory,
01425 persistence_directory,
01426 &new_context);
01427
01428 // Now does this already exist on disk?
01429 ACE_TString file_name(persistence_directory);
01430 file_name += ACE_TEXT("/");
01431 file_name += ACE_TEXT_CHAR_TO_TCHAR(poa_id);
01432 ACE_Auto_Ptr<TAO_Storable_Base> fl (factory->create_stream(ACE_TEXT_ALWAYS_CHAR(file_name.c_str()), ACE_TEXT("r")));
01433 if (fl->exists())
01434 {
01435 // Load the map from disk
01436 File_Open_Lock_and_Check flck(new_context, "r");
01437 }
01438 else
01439 {
01440 // Since this is a new context, make and empty map in it
01441 ACE_NEW_THROW_EX (new_context->storable_context_,
01442 TAO_Storable_Bindings_Map (context_size,orb),
01443 CORBA::NO_MEMORY ());
01444 new_context->context_ = new_context->storable_context_;
01445 File_Open_Lock_and_Check flck(new_context, "wc");
01446 new_context->Write(flck.peer());
01447 }
01448
01449 // build the global file name
01450 file_name += ACE_TEXT("_global");
01451
01452 // Create the stream for the counter used to uniquely creat context names
01453 gfl_.reset(factory->create_stream(ACE_TEXT_ALWAYS_CHAR(file_name.c_str()), ACE_TEXT("crw")));
01454 if (gfl_->open() != 0)
01455 {
01456 delete gfl_.release();
01457 throw CORBA::PERSIST_STORE();
01458 }
01459
01460 // get the counter from disk
01461 TAO_NS_Persistence_Global global;
01462 *gfl_.get() >> global;
01463 if (!gfl_.get ()->good () &&
01464 gfl_.get ()->rdstate () != TAO_Storable_Base::eofbit)
01465 {
01466 gfl_.get ()->clear ();
01467 throw CORBA::INTERNAL ();
01468 }
01469 gcounter_ = global.counter();
01470 if(redundant_) gfl_->close();
01471
01472 return result._retn ();
01473 }
|
|
|
Return object reference that is bound to the name. Compound name resolve is defined as follows: ctx->resolve (<c1; c2; cn>) = ctx->resolve (<c1; c2 cn-1>)->resolve () The naming service does not return the type of the object. Clients are responsible for "narrowing" the object to the appropriate type. Reimplemented from TAO_Hash_Naming_Context. Definition at line 939 of file Storable_Naming_Context.cpp. References CORBA::Object::_nil(), ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Bindings_Map::find(), CORBA::is_nil(), CosNaming::Name, and TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release().
00940 {
00941 ACE_TRACE("resolve");
00942 // Get the length of the name.
00943 CORBA::ULong name_len = n.length ();
00944
00945 // Check for invalid name.
00946 if (name_len == 0)
00947 throw CosNaming::NamingContext::InvalidName();
00948
00949 // we didn't need a lock to check the input arg, but now we do
00950 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon, this->lock_,
00951 CORBA::INTERNAL ());
00952
00953 // Open the backing file
00954 File_Open_Lock_and_Check flck(this, "r");
00955
00956 // Check to make sure this object didn't have <destroy> method
00957 // invoked on it.
00958 if (this->destroyed_)
00959 throw CORBA::OBJECT_NOT_EXIST ();
00960
00961 // Resolve the first component of the name.
00962 flck.release();
00963
00964 // Stores the binding type for the first name component.
00965 CosNaming::BindingType type;
00966 // Stores the object reference bound to the first name component.
00967 CORBA::Object_ptr obj = CORBA::Object::_nil ();
00968
00969 if (this->context_->find (n[0].id,
00970 n[0].kind,
00971 obj,
00972 type) == -1)
00973 throw CosNaming::NamingContext::NotFound(
00974 CosNaming::NamingContext::missing_node,
00975 n);
00976
00977 // Store the value in var to avoid memory leaks.
00978 CORBA::Object_var result = obj;
00979
00980 // If the name we have to resolve is a compound name, we need to
00981 // resolve it recursively.
00982 if (name_len > 1)
00983 {
00984 CosNaming::NamingContext_var context =
00985 CosNaming::NamingContext::_nil ();
00986
00987 if (type == CosNaming::ncontext)
00988 {
00989 // Narrow to NamingContext.
00990 context = CosNaming::NamingContext::_narrow (result.in ());
00991 }
00992 else
00993 // The first name component wasn't bound to a NamingContext.
00994 throw CosNaming::NamingContext::NotFound(
00995 CosNaming::NamingContext::not_context,
00996 n);
00997
00998 // If narrow failed...
00999 if (CORBA::is_nil (context.in ()))
01000 throw CosNaming::NamingContext::NotFound(
01001 CosNaming::NamingContext::not_context,
01002 n);
01003 else
01004 {
01005 // Successfully resolved the first name component, need to
01006 // recursively call resolve on <n> without the first component.
01007
01008 // We need a name just like <n> but without the first
01009 // component. Instead of copying data we can reuse <n>'s
01010 // buffer since we will only be using it for 'in' parameters
01011 // (no modifications).
01012 CosNaming::Name rest_of_name
01013 (n.maximum () - 1,
01014 n.length () - 1,
01015 const_cast<CosNaming::NameComponent*> (n.get_buffer ()) + 1);
01016
01017 // If there are any exceptions, they will propagate up.
01018 return context->resolve (rest_of_name);
01019 }
01020 }
01021 // If the name we had to resolve was simple, we just need to return
01022 // the result.
01023 return result._retn ();
01024 }
|
|
|
Remove the name binding from the context. When compound names are used, unbind is defined as follows: ctx->unbind (<c1; c2; cn>) = (ctx->resolve (<c1; c2; cn-1>))->unbind () Reimplemented from TAO_Hash_Naming_Context. Definition at line 1027 of file Storable_Naming_Context.cpp. References ACE_GUARD_THROW_EX, ACE_SYNCH_RECURSIVE_MUTEX, ACE_TRACE, TAO_Hash_Naming_Context::get_context(), CosNaming::Name, TAO_Storable_Naming_Context::File_Open_Lock_and_Check::peer(), TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(), TAO_Bindings_Map::unbind(), and Write().
01028 {
01029 ACE_TRACE("unbind");
01030 // Get the length of the name.
01031 CORBA::ULong name_len = n.length ();
01032
01033 // Check for invalid name.
01034 if (name_len == 0)
01035 throw CosNaming::NamingContext::InvalidName();
01036
01037 // we didn't need a lock to check the input arg, but now we do
01038 ACE_GUARD_THROW_EX (ACE_SYNCH_RECURSIVE_MUTEX, ace_mon,
01039 this->lock_,
01040 CORBA::INTERNAL ());
01041
01042 // Open the backing file
01043 File_Open_Lock_and_Check flck(this, name_len > 1 ? "r" : "rw");
01044
01045 // Check to make sure this object didn't have <destroy> method
01046 // invoked on it.
01047 if (this->destroyed_)
01048 throw CORBA::OBJECT_NOT_EXIST ();
01049
01050 // If we received compound name, resolve it to get the context in
01051 // which the unbinding should take place, then perform the unbinding
01052 // on target context.
01053 if (name_len > 1)
01054 {
01055 // This had been a read on the file so now we are done with it
01056 flck.release();
01057
01058 CosNaming::NamingContext_var context =
01059 get_context (n);
01060
01061 CosNaming::Name simple_name;
01062 simple_name.length (1);
01063 simple_name[0] = n[name_len - 1];
01064 context->unbind (simple_name);
01065 }
01066 // If we received a simple name, we need to unbind it in this
01067 // context.
01068 else
01069 {
01070 if (this->context_->unbind (n[0].id,
01071 n[0].kind) == -1)
01072 throw CosNaming::NamingContext::NotFound(
01073 CosNaming::NamingContext::missing_node,
01074 n);
01075
01076 this->Write(flck.peer());
01077 }
01078 }
|
|
|
Definition at line 254 of file Storable_Naming_Context.cpp. References ACE_CString, ACE_TRACE, TAO_Storable_Bindings_Map::current_size(), TAO_NS_Persistence_Header::destroyed(), TAO_NS_Persistence_Record::id(), TAO_NS_Persistence_Record::kind(), TAO_Storable_Bindings_Map::map(), TAO_NS_Persistence_Record::ref(), TAO_NS_Persistence_Header::size(), storable_context_, and TAO_NS_Persistence_Record::type(). Referenced by bind(), bind_context(), destroy(), new_context(), rebind(), rebind_context(), recreate_all(), and unbind().
00255 {
00256 ACE_TRACE("Write");
00257 TAO_NS_Persistence_Header header;
00258
00259 header.size (static_cast<unsigned int> (storable_context_->current_size()));
00260 header.destroyed (destroyed_);
00261
00262 wrtr << header;
00263
00264 if (0u == header.size ())
00265 return;
00266
00267 ACE_Hash_Map_Iterator<TAO_Storable_ExtId,TAO_Storable_IntId,
00268 ACE_Null_Mutex> it = storable_context_->map().begin();
00269 ACE_Hash_Map_Iterator<TAO_Storable_ExtId,TAO_Storable_IntId,
00270 ACE_Null_Mutex> itend = storable_context_->map().end();
00271
00272 ACE_Hash_Map_Entry<TAO_Storable_ExtId,TAO_Storable_IntId> ent = *it;
00273
00274 while (!(it == itend))
00275 {
00276 TAO_NS_Persistence_Record record;
00277
00278 ACE_CString name;
00279 CosNaming::BindingType bt = (*it).int_id_.type_;
00280 if (bt == CosNaming::ncontext)
00281 {
00282 CORBA::Object_var
00283 obj = orb_->string_to_object ((*it).int_id_.ref_.in ());
00284 if (obj->_is_collocated ())
00285 {
00286 // This is a local (i.e. non federated context) we therefore
00287 // store only the ObjectID (persistence filename) for the object.
00288
00289 // The driving force behind storing ObjectIDs rather than IORs for
00290 // local contexts is to provide for a redundant naming service.
00291 // That is, a naming service that runs simultaneously on multiple
00292 // machines sharing a file system. It allows multiple redundant
00293 // copies to be started and stopped independently.
00294 // The original target platform was Tru64 Clusters where there was
00295 // a cluster address. In that scenario, clients may get different
00296 // servers on each request, hence the requirement to keep
00297 // synchronized to the disk. It also works on non-cluster system
00298 // where the client picks one of the redundant servers and uses it,
00299 // while other systems can pick different servers. (However in this
00300 // scenario, if a server fails and a client must pick a new server,
00301 // that client may not use any saved context IORs, instead starting
00302 // from the root to resolve names. So this latter mode is not quite
00303 // transparent to clients.) [Rich Seibel (seibel_r) of ociweb.com]
00304
00305 PortableServer::ObjectId_var
00306 oid = poa_->reference_to_id (obj.in ());
00307 CORBA::String_var
00308 nm = PortableServer::ObjectId_to_string (oid.in ());
00309 const char
00310 *newname = nm.in ();
00311 name.set (newname); // The local ObjectID (persistance filename)
00312 record.type (TAO_NS_Persistence_Record::LOCAL_NCONTEXT);
00313 }
00314 else
00315 {
00316 // Since this is a foreign (federated) context, we can not store
00317 // the objectID (because it isn't in our storage), if we did, when
00318 // we restore, we would end up either not finding a permanent
00319 // record (and thus ending up incorrectly assuming the context was
00320 // destroyed) or loading another context altogether (just because
00321 // the contexts shares its objectID filename which is very likely).
00322 // [Simon Massey (sma) of prismtech.com]
00323
00324 name.set ((*it).int_id_.ref_.in ()); // The federated context IOR
00325 record.type (TAO_NS_Persistence_Record::REMOTE_NCONTEXT);
00326 }
00327 }
00328 else // if (bt == CosNaming::nobject) // shouldn't be any other, can there?
00329 {
00330 name.set ((*it).int_id_.ref_.in ()); // The non-context object IOR
00331 record.type (TAO_NS_Persistence_Record::OBJREF);
00332 }
00333 record.ref(name);
00334
00335 const char *myid = (*it).ext_id_.id();
00336 ACE_CString id(myid);
00337 record.id(id);
00338
00339 const char *mykind = (*it).ext_id_.kind();
00340 ACE_CString kind(mykind);
00341 record.kind(kind);
00342
00343 wrtr << record;
00344 it.advance();
00345 }
00346 }
|
|
|
Definition at line 450 of file Storable_Naming_Context.h. |
|
|
Counter used for generation of transients.
Definition at line 361 of file Storable_Naming_Context.h. |
|
|
Definition at line 378 of file Storable_Naming_Context.h. Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check(). |
|
|
Global counter used for generation of POA ids for children Naming Contexts. Definition at line 27 of file Storable_Naming_Context.cpp. Referenced by new_context(), and recreate_all(). |
|
|
The pointer to the global file used to allocate new contexts.
Definition at line 28 of file Storable_Naming_Context.cpp. Referenced by new_context(), and recreate_all(). |
|
|
Save the hash table initial size.
Definition at line 384 of file Storable_Naming_Context.h. Referenced by load_map(), new_context(), and TAO_Storable_Naming_Context(). |
|
|
Disk time that match current memory state.
Definition at line 387 of file Storable_Naming_Context.h. Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check(), and TAO_Storable_Naming_Context(). |
|
|
Definition at line 374 of file Storable_Naming_Context.h. Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check(). |
|
|
Definition at line 372 of file Storable_Naming_Context.h. |
|
|
The directory in which to store the files.
Definition at line 381 of file Storable_Naming_Context.h. Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check(), and TAO_Storable_Naming_Context(). |
|
|
POA we are registered with.
Reimplemented from TAO_Hash_Naming_Context. Definition at line 376 of file Storable_Naming_Context.h. |
|
|
Flag to tell use whether we are redundant or not.
Definition at line 29 of file Storable_Naming_Context.cpp. Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check(), new_context(), recreate_all(), and TAO_Storable_Naming_Context::File_Open_Lock_and_Check::release(). |
|
|
Definition at line 26 of file Storable_Naming_Context.cpp. Referenced by new_context(), and recreate_all(). |
|
|
A pointer to the underlying data structure used to store name bindings. While our superclass (TAO_Hash_Naming_Context) also maintains a pointer to the data structure, keeping this pointer around saves us from the need to downcast when invoking non-virtual methods. Definition at line 370 of file Storable_Naming_Context.h. Referenced by TAO_Storable_Naming_Context::File_Open_Lock_and_Check::File_Open_Lock_and_Check(), list(), load_map(), new_context(), recreate_all(), TAO_Storable_Naming_Context(), and Write(). |
1.3.6