00001
00002
00003
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
00073
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
00085
00086
00087
00088
00089
00090
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
00104
00105
00106
00107
00108
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