summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp
new file mode 100644
index 00000000000..ea15a0e703e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp
@@ -0,0 +1,120 @@
+// $Id$
+
+#ifndef TAO_ESF_COPY_ON_READ_CPP
+#define TAO_ESF_COPY_ON_READ_CPP
+
+#include "orbsvcs/ESF/ESF_Copy_On_Read.h"
+#include "orbsvcs/ESF/ESF_Worker.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Copy_On_Read (void)
+{
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ TAO_ESF_Copy_On_Read (const COLLECTION &collection)
+ : collection_ (collection)
+{
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ for_each (TAO_ESF_Worker<PROXY> *worker
+ ACE_ENV_ARG_DECL)
+{
+ // @@ Use an allocator for this memory...
+ PROXY **proxies = 0;
+ size_t size = 0;
+ ACE_TRY
+ {
+ {
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ size = this->collection_.size ();
+ ACE_NEW (proxies, PROXY*[size]);
+ PROXY **j = proxies;
+
+ for (; j != proxies + size; ++j)
+ *j = 0;
+
+ j = proxies;
+
+ ITERATOR end = this->collection_.end ();
+ for (ITERATOR i = this->collection_.begin (); i != end; ++i)
+ {
+ *j = *i;
+ (*j)->_incr_refcnt ();
+ ++j;
+ }
+ }
+ worker->set_size(size);
+ for (PROXY **j = proxies; j != proxies + size; ++j)
+ {
+ worker->work (*j ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ (*j)->_decr_refcnt ();
+ }
+ delete[] proxies;
+ }
+ ACE_CATCHANY
+ {
+ for (PROXY **j = proxies; j != proxies + size; ++j)
+ {
+ if (*j != 0)
+ (*j)->_decr_refcnt ();
+ }
+ delete[] proxies;
+
+ ACE_RE_THROW;
+ }
+ ACE_ENDTRY;
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ connected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ proxy->_incr_refcnt ();
+ this->collection_.connected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ reconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ proxy->_incr_refcnt ();
+ this->collection_.reconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ disconnected (PROXY *proxy
+ ACE_ENV_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ this->collection_.disconnected (proxy ACE_ENV_ARG_PARAMETER);
+}
+
+template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
+TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
+ shutdown (ACE_ENV_SINGLE_ARG_DECL)
+{
+ ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
+
+ this->collection_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ESF_COPY_ON_READ_CPP */