diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/ESF/ESF_Copy_On_Read.cpp | 120 |
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 */ |