Leader_Follower.i

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Leader_Follower.i,v 1.24 2005/11/02 07:13:03 ossama Exp
00004 
00005 // ****************************************************************
00006 
00007 #include "tao/ORB_Core_TSS_Resources.h"
00008 #include "tao/ORB_Core.h"
00009 
00010 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00011 
00012 ACE_INLINE
00013 TAO_Leader_Follower::TAO_Leader_Follower (TAO_ORB_Core* orb_core,
00014                                           TAO_New_Leader_Generator *new_leader_generator)
00015   : orb_core_ (orb_core),
00016     reverse_lock_ (lock_),
00017     leaders_ (0),
00018     clients_ (0),
00019     reactor_ (0),
00020     client_thread_is_leader_ (0),
00021     event_loop_threads_waiting_ (0),
00022     event_loop_threads_condition_ (lock_),
00023     new_leader_generator_ (new_leader_generator)
00024 {
00025 }
00026 
00027 ACE_INLINE TAO_ORB_Core_TSS_Resources *
00028 TAO_Leader_Follower::get_tss_resources (void) const
00029 {
00030   return this->orb_core_->get_tss_resources ();
00031 }
00032 
00033 ACE_INLINE int
00034 TAO_Leader_Follower::follower_available (void) const
00035 {
00036   return !this->follower_set_.empty ();
00037 }
00038 
00039 ACE_INLINE void
00040 TAO_Leader_Follower::no_leaders_available (void)
00041 {
00042   if (this->new_leader_generator_)
00043     this->new_leader_generator_->no_leaders_available ();
00044 }
00045 
00046 ACE_INLINE int
00047 TAO_Leader_Follower::elect_new_leader (void)
00048 {
00049   if (this->leaders_ == 0)
00050     {
00051       if (this->event_loop_threads_waiting_)
00052         {
00053           return this->event_loop_threads_condition_.broadcast ();
00054         }
00055       else if (this->follower_available ())
00056         {
00057           return this->elect_new_leader_i ();
00058         }
00059       else
00060         {
00061           this->no_leaders_available ();
00062         }
00063     }
00064   return 0;
00065 }
00066 
00067 ACE_INLINE int
00068 TAO_Leader_Follower::set_event_loop_thread (ACE_Time_Value *max_wait_time)
00069 {
00070   TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
00071 
00072   // Make sure that there is no other client thread run the show.  If
00073   // we are the client thread running the show, then it is ok.
00074   if (this->client_thread_is_leader_ &&
00075       tss->client_leader_thread_ == 0)
00076     {
00077       int result =
00078         this->wait_for_client_leader_to_complete (max_wait_time);
00079 
00080       if (result != 0)
00081         return result;
00082     }
00083 
00084   // If <event_loop_thread_> == 0 and <client_leader_thread_> == 0, we
00085   // are running the event loop for the first time.  Therefore,
00086   // increment the leaders.  Otherwise, simply increment
00087   // <event_loop_thread_> since either (a) if <event_loop_thread_> !=
00088   // 0 this is a nested call to the event loop, or (b)
00089   // <client_leader_thread_> != 0 this is a call to the event loop
00090   // while we are a client leader.
00091   if (tss->event_loop_thread_ == 0 &&
00092       tss->client_leader_thread_ == 0)
00093     ++this->leaders_;
00094 
00095   ++tss->event_loop_thread_;
00096 
00097   return 0;
00098 }
00099 
00100 ACE_INLINE void
00101 TAO_Leader_Follower::reset_event_loop_thread_i (TAO_ORB_Core_TSS_Resources *tss)
00102 {
00103   // Always decrement <event_loop_thread_>. If <event_loop_thread_>
00104   // reaches 0 and we are not a client leader, we are done with our
00105   // duties of running the event loop. Therefore, decrement the
00106   // leaders.  Otherwise, we just got done with a nested call to the
00107   // event loop or a call to the event loop when we were the client
00108   // leader.
00109   --tss->event_loop_thread_;
00110 
00111   if (tss->event_loop_thread_ == 0 &&
00112       tss->client_leader_thread_ == 0)
00113     --this->leaders_;
00114 }
00115 
00116 ACE_INLINE void
00117 TAO_Leader_Follower::reset_event_loop_thread (void)
00118 {
00119   TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
00120   if (tss->event_loop_thread_ > 0)
00121     this->reset_event_loop_thread_i (tss);
00122 }
00123 
00124 ACE_INLINE TAO_SYNCH_MUTEX &
00125 TAO_Leader_Follower::lock (void)
00126 {
00127   return this->lock_;
00128 }
00129 
00130 ACE_INLINE void
00131 TAO_Leader_Follower::set_upcall_thread (void)
00132 {
00133   TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
00134 
00135   if (tss->event_loop_thread_ > 0)
00136     {
00137       ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->lock ());
00138       this->reset_event_loop_thread_i (tss);
00139 
00140       this->elect_new_leader ();
00141     }
00142 }
00143 
00144 ACE_INLINE int
00145 TAO_Leader_Follower::leader_available (void) const
00146 {
00147   return this->leaders_ != 0;
00148 }
00149 
00150 ACE_INLINE void
00151 TAO_Leader_Follower::set_client_leader_thread (void)
00152 {
00153   TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
00154   ++this->leaders_;
00155   ++this->client_thread_is_leader_;
00156   ++tss->client_leader_thread_;
00157 }
00158 
00159 ACE_INLINE void
00160 TAO_Leader_Follower::reset_client_leader_thread (void)
00161 {
00162   TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
00163   --tss->client_leader_thread_;
00164   --this->leaders_;
00165   --this->client_thread_is_leader_;
00166 }
00167 
00168 ACE_INLINE int
00169 TAO_Leader_Follower::is_client_leader_thread (void) const
00170 {
00171   TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
00172   return tss->client_leader_thread_ != 0;
00173 }
00174 
00175 ACE_INLINE void
00176 TAO_Leader_Follower::add_follower (TAO_LF_Follower *follower)
00177 {
00178   this->follower_set_.push_back (follower);
00179 }
00180 
00181 ACE_INLINE void
00182 TAO_Leader_Follower::remove_follower (TAO_LF_Follower *follower)
00183 {
00184   this->follower_set_.remove (follower);
00185 }
00186 
00187 ACE_INLINE ACE_Reverse_Lock<TAO_SYNCH_MUTEX> &
00188 TAO_Leader_Follower::reverse_lock (void)
00189 {
00190   return this->reverse_lock_;
00191 }
00192 
00193 ACE_INLINE int
00194 TAO_Leader_Follower::has_clients (void) const
00195 {
00196   return this->clients_;
00197 }
00198 
00199 // ****************************************************************
00200 
00201 ACE_INLINE
00202 TAO_LF_Client_Thread_Helper::TAO_LF_Client_Thread_Helper (TAO_Leader_Follower &leader_follower)
00203   : leader_follower_ (leader_follower)
00204 {
00205   this->leader_follower_.set_client_thread ();
00206 }
00207 
00208 ACE_INLINE
00209 TAO_LF_Client_Thread_Helper::~TAO_LF_Client_Thread_Helper (void)
00210 {
00211   this->leader_follower_.reset_client_thread ();
00212 }
00213 
00214 ACE_INLINE
00215 TAO_LF_Client_Leader_Thread_Helper::TAO_LF_Client_Leader_Thread_Helper (TAO_Leader_Follower &leader_follower)
00216   : leader_follower_ (leader_follower)
00217 {
00218   this->leader_follower_.set_client_leader_thread ();
00219 }
00220 
00221 ACE_INLINE
00222 TAO_LF_Client_Leader_Thread_Helper::~TAO_LF_Client_Leader_Thread_Helper (void)
00223 {
00224   this->leader_follower_.reset_client_leader_thread ();
00225 }
00226 
00227 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 11:54:14 2006 for TAO by doxygen 1.3.6