summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp')
-rw-r--r--TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp118
1 files changed, 70 insertions, 48 deletions
diff --git a/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp b/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
index 3539b4548b0..c9ca79c4368 100644
--- a/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
+++ b/TAO/orbsvcs/ImplRepo_Service/LiveCheck.cpp
@@ -102,32 +102,14 @@ LiveEntry::status (LiveStatus l)
ACE_Time_Value now (ACE_OS::time());
this->next_check_ = now + owner_->ping_interval();
}
-#if 0
- for (ACE_Vector_Iterator<LiveListener *> i (this->listeners_);
- !i.done();
- i.advance())
- {
- LiveListener **ll = 0;
- i.next(ll);
- if (*ll != 0)
- {
- (*ll)->status_changed (this->liveliness_, this->reping_available());
- }
- }
-#else
- // ACE_DEBUG ((LM_DEBUG,
- // ACE_TEXT ("(%P|%t) LiveEntry::status(%d), server = %s,")
- // ACE_TEXT (" listeners.size = %d\n"),
- // l, this->server_.c_str(), listeners_.size()));
for (size_t i = 0; i < this->listeners_.size(); i++)
{
LiveListener *ll = this->listeners_[i];
if (ll != 0)
{
- (ll)->status_changed (this->liveliness_, this->reping_available());
+ ll->status_changed (this->liveliness_, this->reping_available());
}
}
-#endif
this->listeners_.clear();
}
@@ -141,7 +123,12 @@ bool
LiveEntry::do_ping (PortableServer::POA_ptr poa)
{
ACE_Time_Value now (ACE_OS::time());
- if (this->next_check_ > now || this->liveliness_ == LS_DEAD || this->ping_away_)
+ if (this->ping_away_)
+ {
+ return true;
+ }
+
+ if (this->next_check_ > now || this->liveliness_ == LS_DEAD)
{
return false;
}
@@ -200,7 +187,6 @@ PingReceiver::~PingReceiver (void)
void
PingReceiver::ping (void)
{
- // ACE_DEBUG ((LM_DEBUG,"ping received\n"));
this->entry_->status (LS_ALIVE);
PortableServer::ObjectId_var oid = this->poa_->servant_to_id (this);
poa_->deactivate_object (oid.in());
@@ -284,14 +270,28 @@ int
LiveCheck::handle_timeout (const ACE_Time_Value &,
const void *)
{
- for (LiveEntryMap::iterator i (this->entry_map_);
- !i.done();
- i.advance ())
+ for (LiveEntryMap::iterator le (this->entry_map_);
+ !le.done ();
+ le.advance ())
{
LiveEntryMap::value_type *pair = 0;
- i.next(pair);
- pair->item()->do_ping(poa_.in());
+ le.next(pair);
+ pair->item()->do_ping (poa_.in());
}
+ for (PerClientStack::ITERATOR pe (this->per_client_);
+ !pe.done ();
+ pe.advance ())
+ {
+ LiveEntry *entry = 0;
+ LiveEntry **n = &entry;
+ pe.next(n);
+ if (entry != 0 && !entry->do_ping (poa_.in()))
+ {
+ this->per_client_.remove (entry);
+ }
+
+ }
+
return 0;
}
@@ -322,37 +322,59 @@ LiveCheck::remove_server (const char *server)
}
void
+LiveCheck::remove_per_client_entry (LiveEntry *e)
+{
+ this->per_client_.remove (e);
+}
+
+bool
+LiveCheck::add_per_client_listener (LiveListener *l,
+ ImplementationRepository::ServerObject_ptr ref)
+{
+ LiveEntry *entry = 0;
+ ACE_NEW_RETURN (entry, LiveEntry (this, 0, ref), false);
+ if (this->per_client_.push(entry) == 0)
+ {
+ entry->add_listener (l);
+ this->reactor()->schedule_timer (this,0,ACE_Time_Value::zero);
+ return true;
+ }
+ return false;
+}
+
+bool
LiveCheck::add_listener (LiveListener *l)
{
LiveEntry *entry = 0;
ACE_CString key (l->server());
int result = entry_map_.find (key, entry);
-
- if (result == 0 && entry != 0)
+ if (result == -1 || entry == 0)
{
- entry->add_listener (l);
- ACE_Time_Value now (ACE_OS::time());
- ACE_Time_Value next = entry->next_check ();
+ return false;
+ }
- if (next <= now)
- {
- // ACE_DEBUG ((LM_DEBUG,
- // ACE_TEXT ("(%P|%t) LiveCheck::add_listener %x, ")
- // ACE_TEXT ("immediate callback for <%C>\n"),
- // l, l->server()));
- this->reactor()->schedule_timer (this,0,ACE_Time_Value::zero);
- }
- else
- {
- ACE_Time_Value delay = next - now;
- // ACE_DEBUG ((LM_DEBUG,
- // ACE_TEXT ("(%P|%t) LiveCheck::add_listener %x, ")
- // ACE_TEXT ("callback in %d ms for <%C>\n"),
- // l, delay.sec() * 1000 + delay.usec() / 1000, l->server()));
- this->reactor()->schedule_timer (this, 0, delay);
- }
+ entry->add_listener (l);
+ ACE_Time_Value now (ACE_OS::time());
+ ACE_Time_Value next = entry->next_check ();
+ if (next <= now)
+ {
+ // ACE_DEBUG ((LM_DEBUG,
+ // ACE_TEXT ("(%P|%t) LiveCheck::add_listener %x, ")
+ // ACE_TEXT ("immediate callback for <%C>\n"),
+ // l, l->server()));
+ this->reactor()->schedule_timer (this,0,ACE_Time_Value::zero);
}
+ else
+ {
+ ACE_Time_Value delay = next - now;
+ // ACE_DEBUG ((LM_DEBUG,
+ // ACE_TEXT ("(%P|%t) LiveCheck::add_listener %x, ")
+ // ACE_TEXT ("callback in %d ms for <%C>\n"),
+ // l, delay.sec() * 1000 + delay.usec() / 1000, l->server()));
+ this->reactor()->schedule_timer (this, 0, delay);
+ }
+ return true;
}
LiveStatus