summaryrefslogtreecommitdiff
path: root/TAO/tao/Leader_Follower.i
diff options
context:
space:
mode:
authorirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-01-26 02:34:55 +0000
committerirfan <irfan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-01-26 02:34:55 +0000
commit00814bd49c0a4ddac4f53924aca723a1f7aff590 (patch)
treecec94f491276648b74ffd67bed6670573a891a4a /TAO/tao/Leader_Follower.i
parent058614abbaf5b468773deedd5165036401f136f4 (diff)
downloadATCD-00814bd49c0a4ddac4f53924aca723a1f7aff590.tar.gz
Change:Tue Jan 25 20:33:28 2000 Irfan Pyarali <irfan@cs.wustl.edu>
Diffstat (limited to 'TAO/tao/Leader_Follower.i')
-rw-r--r--TAO/tao/Leader_Follower.i66
1 files changed, 63 insertions, 3 deletions
diff --git a/TAO/tao/Leader_Follower.i b/TAO/tao/Leader_Follower.i
index f9fe04716b6..0309806d6d2 100644
--- a/TAO/tao/Leader_Follower.i
+++ b/TAO/tao/Leader_Follower.i
@@ -9,7 +9,8 @@ TAO_Leader_Follower::TAO_Leader_Follower (TAO_ORB_Core* orb_core)
reverse_lock_ (lock_),
leaders_ (0),
clients_ (0),
- reactor_ (0)
+ reactor_ (0),
+ client_thread_is_leader_ (0)
{
}
@@ -19,14 +20,25 @@ TAO_Leader_Follower::get_tss_resources (void) const
return this->orb_core_->get_tss_resources ();
}
-ACE_INLINE void
-TAO_Leader_Follower::set_server_thread (void)
+ACE_INLINE int
+TAO_Leader_Follower::set_server_thread (ACE_Time_Value *max_wait_time)
{
+ if (this->client_thread_is_leader_)
+ {
+ int result =
+ this->wait_for_client_leader_to_complete (max_wait_time);
+
+ if (result != 0)
+ return result;
+ }
+
// Set the TSS flag to remember that we are a leader thread...
TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
tss->is_server_thread_ = 1;
++this->leaders_;
+
+ return 0;
}
ACE_INLINE void
@@ -92,6 +104,7 @@ TAO_Leader_Follower::set_leader_thread (void)
if (tss->is_leader_thread_ == 0)
{
++this->leaders_;
+ this->client_thread_is_leader_ = 1;
}
++tss->is_leader_thread_;
}
@@ -104,6 +117,7 @@ TAO_Leader_Follower::reset_leader_thread (void)
if (tss->is_leader_thread_ == 0)
{
--this->leaders_;
+ this->client_thread_is_leader_ = 0;
}
}
@@ -162,24 +176,70 @@ TAO_Leader_Follower::has_clients (void) const
return this->clients_;
}
+ACE_INLINE
TAO_LF_Client_Thread_Helper::TAO_LF_Client_Thread_Helper (TAO_Leader_Follower &leader_follower)
: leader_follower_ (leader_follower)
{
this->leader_follower_.set_client_thread ();
}
+ACE_INLINE
TAO_LF_Client_Thread_Helper::~TAO_LF_Client_Thread_Helper (void)
{
this->leader_follower_.reset_client_thread ();
}
+ACE_INLINE
TAO_LF_Leader_Thread_Helper::TAO_LF_Leader_Thread_Helper (TAO_Leader_Follower &leader_follower)
: leader_follower_ (leader_follower)
{
this->leader_follower_.set_leader_thread ();
}
+ACE_INLINE
TAO_LF_Leader_Thread_Helper::~TAO_LF_Leader_Thread_Helper (void)
{
this->leader_follower_.reset_leader_thread ();
}
+
+ACE_INLINE
+TAO_LF_Server_Thread_Helper::TAO_LF_Server_Thread_Helper (TAO_Leader_Follower &leader_follower)
+ : leader_follower_ (leader_follower),
+ auto_reset_ (0)
+{
+}
+
+ACE_INLINE
+TAO_LF_Server_Thread_Helper::~TAO_LF_Server_Thread_Helper (void)
+{
+ if (this->auto_reset_)
+ this->reset_server_thread ();
+}
+
+ACE_INLINE int
+TAO_LF_Server_Thread_Helper::set_server_thread (ACE_Time_Value *max_wait_time)
+{
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->leader_follower_.lock (), -1);
+
+ int result =
+ this->leader_follower_.set_server_thread (max_wait_time);
+
+ // If successful, reset has to be called.
+ if (result == 0)
+ this->auto_reset_ = 1;
+
+ return result;
+}
+
+ACE_INLINE int
+TAO_LF_Server_Thread_Helper::reset_server_thread (void)
+{
+ // Reset has been called explicitly, no need to auto reset.
+ this->auto_reset_ = 0;
+
+ ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->leader_follower_.lock (), -1);
+
+ this->leader_follower_.reset_server_thread ();
+
+ return this->leader_follower_.elect_new_leader ();
+}