summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h b/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h
new file mode 100644
index 00000000000..7e85834f857
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/Naming/Bindings_Iterator_T.h
@@ -0,0 +1,139 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Bindings_Iterator_T.h
+ *
+ * $Id$
+ *
+ * @author Marina Spivak <marina@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef TAO_BINDINGS_ITERATOR_T_H
+#define TAO_BINDINGS_ITERATOR_T_H
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Naming/Hash_Naming_Context.h"
+
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Bindings_Iterator
+ *
+ * @brief This class implements the <BindingIterator> interface that is
+ * part of the <CosNaming> idl module. This class works with Hash_Map-based
+ * implementations of CosNaming::NamingContext.
+ *
+ * This class is templatized by the types of the underlying
+ * hash table iterator and hash table entry, so that it can be
+ * used for both TAO_Transient_Naming_Context and
+ * TAO_Persistent_Naming_Context (and any other classes with
+ * underlying data structures supporting
+ * ACE_Hash_Map_Manager/Iterator - like interfaces).
+ *
+ * Instances of <TAO_Bindings_Iterator>s affect reference counts
+ * of corresponding Naming Contexts. Reference count on a
+ * Naming Context is incremented by one for a lifetime of each
+ * instance of <TAO_Bindings_Iterator> created for that
+ * context, i.e., a Naming Context cannot
+ * be cleaned up (but, of course, it can be invalidated) before
+ * all of its iterators have been cleaned up. When <destroy>
+ * method is invoked on a Naming Context, all of its iterators are
+ * destroyed in a "lazy evaluation" fashion, i.e., whenever a next
+ * operation is invoked on an iterator, and it can detect that
+ * the corresponding Naming Context has been invalidated, the
+ * iterator is destroyed.
+ */
+template <class ITERATOR, class TABLE_ENTRY>
+class TAO_Bindings_Iterator : public virtual POA_CosNaming::BindingIterator
+{
+public:
+ // = Intialization and termination methods.
+ /**
+ * Constructor expects a pointer to a
+ * dynamically allocated hash map iterator (destructor
+ * deallocates hash map iterator).
+ */
+ TAO_Bindings_Iterator (TAO_Hash_Naming_Context *context,
+ ITERATOR *hash_iter,
+ PortableServer::POA_ptr poa,
+ TAO_SYNCH_RECURSIVE_MUTEX &lock);
+
+
+ /// Destructor.
+ ~TAO_Bindings_Iterator (void);
+
+ /// Returns the Default POA of this Servant object
+ virtual PortableServer::POA_ptr _default_POA (void);
+
+ // = Idl methods.
+
+ /// This operation passes back the next unseen binding. True is
+ /// returned if a binding is passed back, and false is returned otherwise.
+ CORBA::Boolean next_one (CosNaming::Binding_out b);
+
+ /**
+ * This operation passes back at most <how_many> unseen bindings.
+ * True is returned if bindings were passed back, and false is
+ * returned if no bindings were passed back.
+ */
+ CORBA::Boolean next_n (CORBA::ULong how_many,
+ CosNaming::BindingList_out bl);
+
+ /// This operation destroys the iterator.
+ void destroy (void);
+
+ // = Helper method.
+
+ /**
+ * Helper function used by TAO_*_Naming_Context and
+ * TAO_BindingIterator: populate a binding <b> with info contained
+ * in <hash_entry>. Return 1 if everything went smoothly, 0 if an
+ * allocation failed.
+ */
+ static int populate_binding (TABLE_ENTRY *hash_entry, CosNaming::Binding &b);
+
+private:
+ /**
+ * Flag indicating whether this iterator is still valid. (The
+ * iterator becomes invalid when <destroy> method has been invoked
+ * on it, or when <destroy> method has been invoked on the
+ * corresponding Naming Context.) This flag is necessary
+ * because immediate destruction of this servant might not be possible
+ * due to pending requests in the POA.
+ */
+ bool destroyed_;
+
+ /**
+ * Pointer to the Naming Context we are iterating over. We need
+ * this pointer to make sure the context is still valid before
+ * each iteration, and to decrement its reference count once we are <destroyed>.
+ */
+ TAO_Hash_Naming_Context *context_;
+
+ /// A pointer to the hash map iterator.
+ ITERATOR *hash_iter_;
+
+ /// Lock passed on from Naming Context to serialize access to the
+ /// internal data structure.
+ TAO_SYNCH_RECURSIVE_MUTEX &lock_;
+
+ /// Implement a different _default_POA().
+ PortableServer::POA_var poa_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "orbsvcs/Naming/Bindings_Iterator_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Bindings_Iterator_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+#endif /* TAO_BINDINGS_ITERATOR_T_H */