00001
00002
00003 #ifndef TAO_ESF_COPY_ON_READ_CPP
00004 #define TAO_ESF_COPY_ON_READ_CPP
00005
00006 #include "orbsvcs/ESF/ESF_Copy_On_Read.h"
00007 #include "orbsvcs/ESF/ESF_Worker.h"
00008
00009 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00010
00011 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
00012 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00013 TAO_ESF_Copy_On_Read (void)
00014 {
00015 }
00016
00017 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK>
00018 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00019 TAO_ESF_Copy_On_Read (const COLLECTION &collection)
00020 : collection_ (collection)
00021 {
00022 }
00023
00024 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
00025 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00026 for_each (TAO_ESF_Worker<PROXY> *worker
00027 ACE_ENV_ARG_DECL)
00028 {
00029
00030 PROXY **proxies = 0;
00031 size_t size = 0;
00032 ACE_TRY
00033 {
00034 {
00035 ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
00036
00037 size = this->collection_.size ();
00038 ACE_NEW (proxies, PROXY*[size]);
00039 PROXY **j = proxies;
00040
00041 for (; j != proxies + size; ++j)
00042 *j = 0;
00043
00044 j = proxies;
00045
00046 ITERATOR end = this->collection_.end ();
00047 for (ITERATOR i = this->collection_.begin (); i != end; ++i)
00048 {
00049 *j = *i;
00050 (*j)->_incr_refcnt ();
00051 ++j;
00052 }
00053 }
00054 worker->set_size(size);
00055 for (PROXY **j = proxies; j != proxies + size; ++j)
00056 {
00057 worker->work (*j ACE_ENV_ARG_PARAMETER);
00058 ACE_TRY_CHECK;
00059 (*j)->_decr_refcnt ();
00060 }
00061 delete[] proxies;
00062 }
00063 ACE_CATCHANY
00064 {
00065 for (PROXY **j = proxies; j != proxies + size; ++j)
00066 {
00067 if (*j != 0)
00068 (*j)->_decr_refcnt ();
00069 }
00070 delete[] proxies;
00071
00072 ACE_RE_THROW;
00073 }
00074 ACE_ENDTRY;
00075 }
00076
00077 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
00078 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00079 connected (PROXY *proxy
00080 ACE_ENV_ARG_DECL)
00081 {
00082 ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
00083
00084 proxy->_incr_refcnt ();
00085 this->collection_.connected (proxy ACE_ENV_ARG_PARAMETER);
00086 }
00087
00088 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
00089 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00090 reconnected (PROXY *proxy
00091 ACE_ENV_ARG_DECL)
00092 {
00093 ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
00094
00095 proxy->_incr_refcnt ();
00096 this->collection_.reconnected (proxy ACE_ENV_ARG_PARAMETER);
00097 }
00098
00099 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
00100 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00101 disconnected (PROXY *proxy
00102 ACE_ENV_ARG_DECL)
00103 {
00104 ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
00105
00106 this->collection_.disconnected (proxy ACE_ENV_ARG_PARAMETER);
00107 }
00108
00109 template<class PROXY, class COLLECTION, class ITERATOR, class ACE_LOCK> void
00110 TAO_ESF_Copy_On_Read<PROXY,COLLECTION,ITERATOR,ACE_LOCK>::
00111 shutdown (ACE_ENV_SINGLE_ARG_DECL)
00112 {
00113 ACE_GUARD (ACE_LOCK, ace_mon, this->lock_);
00114
00115 this->collection_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00116 }
00117
00118 TAO_END_VERSIONED_NAMESPACE_DECL
00119
00120 #endif