ESF_Copy_On_Read.cpp

Go to the documentation of this file.
00001 // ESF_Copy_On_Read.cpp,v 1.12 2006/03/14 06:14:25 jtc Exp
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   // @@ Use an allocator for this memory...
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 /* TAO_ESF_COPY_ON_READ_CPP */

Generated on Thu Nov 9 13:08:12 2006 for TAO_ESF by doxygen 1.3.6