summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelliott_c <elliott_c@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2008-07-07 12:11:54 +0000
committerelliott_c <elliott_c@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2008-07-07 12:11:54 +0000
commita7fd5f78ebab9373c22ab4e3be155016190605e0 (patch)
tree83725c0370adc3a6aea1eca52e56797e84a96e5b
parent4f5a0ca8fbac5cdda79aca78f9626db27ca3c7fb (diff)
downloadATCD-a7fd5f78ebab9373c22ab4e3be155016190605e0.tar.gz
ChangeLogTag: Mon Jul 7 12:09:10 UTC 2008 Chad Elliott <elliott_c@ociweb.com>
-rw-r--r--TAO/ChangeLog44
-rw-r--r--TAO/orbsvcs/examples/Notify/MC/TkMonitor/README2
-rwxr-xr-xTAO/orbsvcs/examples/Notify/MC/TkMonitor/external_idl.pl24
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Admin.cpp7
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Admin.h4
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp13
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Consumer.h4
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp6
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/EventChannel.h3
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.cpp69
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.h8
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/NotifyMonitoringExt.idl3
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp2
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp8
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h4
-rw-r--r--TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp6
16 files changed, 181 insertions, 26 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog
index ae2e5367e47..7c8292435f1 100644
--- a/TAO/ChangeLog
+++ b/TAO/ChangeLog
@@ -1,3 +1,47 @@
+Mon Jul 7 12:09:10 UTC 2008 Chad Elliott <elliott_c@ociweb.com>
+
+ * orbsvcs/examples/Notify/MC/TkMonitor/README:
+
+ Added more info on how to run the example.
+
+ * orbsvcs/examples/Notify/MC/TkMonitor/external_idl.pl:
+
+ Fixed up the script for the monitor idl changes.
+
+ * orbsvcs/orbsvcs/Notify/Admin.h:
+ * orbsvcs/orbsvcs/Notify/Admin.cpp:
+ * orbsvcs/orbsvcs/Notify/EventChannel.h:
+ * orbsvcs/orbsvcs/Notify/EventChannel.cpp:
+
+ Added a parameter to cleanup_proxy that allows the caller to
+ indicate if a timeout was experienced.
+
+ * orbsvcs/orbsvcs/Notify/Consumer.h:
+ * orbsvcs/orbsvcs/Notify/Consumer.cpp:
+ * orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp:
+
+ If a timeout occurred, indicate this by returning a status of
+ DISPATCH_FAIL_TIMEOUT.
+
+ * orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp:
+
+ We're not keeping track of consumer proxies, so pass false to the
+ cleanup_proxy method.
+
+ * orbsvcs/orbsvcs/Notify/ProxySupplier.h:
+ * orbsvcs/orbsvcs/Notify/ProxySupplier.cpp:
+
+ Added a destroy method that takes a boolean to indicate if a
+ timeout had occurred. This flag is passed to cleanup_proxy called
+ on the consumer admin.
+
+ * orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.h:
+ * orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.cpp:
+ * orbsvcs/orbsvcs/Notify/MonitorControlExt/NotifyMonitoringExt.idl:
+
+ Added a text based monitor to keep track of consumers that were
+ removed due to a timeout.
+
Mon Jul 7 11:44:40 UTC 2008 Chad Elliott <elliott_c@ociweb.com>
* orbsvcs/ImplRepo_Service/ImR_Activator_i.cpp:
diff --git a/TAO/orbsvcs/examples/Notify/MC/TkMonitor/README b/TAO/orbsvcs/examples/Notify/MC/TkMonitor/README
index 83b19f720ab..0af58a9b919 100644
--- a/TAO/orbsvcs/examples/Notify/MC/TkMonitor/README
+++ b/TAO/orbsvcs/examples/Notify/MC/TkMonitor/README
@@ -5,7 +5,7 @@ It will require some form of make (GNU make, nmake, Borland make, etc.)
You must have the TAO_ROOT environment variable set to the full path of the
TAO directory and you must also have the OPALORB_ROOT environment variable
set to the full path of opalORB. Then run make. It will generate the stubs
-and at that point you are ready to run monitor.pl.
+and at that point you are ready to run monitor.pl -ORBInitRef NameService=...
By default, the monitor interface will use the Name Service to locate the
monitor service. However, an IOR can be passed as the first parameter to
diff --git a/TAO/orbsvcs/examples/Notify/MC/TkMonitor/external_idl.pl b/TAO/orbsvcs/examples/Notify/MC/TkMonitor/external_idl.pl
index 6f6d48762f1..c5923350f83 100755
--- a/TAO/orbsvcs/examples/Notify/MC/TkMonitor/external_idl.pl
+++ b/TAO/orbsvcs/examples/Notify/MC/TkMonitor/external_idl.pl
@@ -26,15 +26,15 @@ if (!defined $ENV{OPALORB_ROOT}) {
exit(1);
}
-my($rm) = undef;
-my($root) = undef;
+my $rm;
+my @includes;
for(my $i = 0; $i <= $#ARGV; $i++) {
if ($ARGV[$i] eq '-r') {
$rm = $i + 1;
last;
}
else {
- $root = $ARGV[$i];
+ push(@includes, $ARGV[$i]);
}
}
@@ -45,16 +45,16 @@ if ($rm) {
exit(0);
}
-if (!defined $root) {
+if (!defined $includes[0]) {
if (defined $ENV{NOTIFY_ROOT}) {
- $root = $ENV{NOTIFY_ROOT};
+ push(@includes, $ENV{NOTIFY_ROOT});
}
elsif (defined $ENV{TAO_ROOT}) {
- $root = "$ENV{TAO_ROOT}/orbsvcs/orbsvcs";
+ push(@includes, $ENV{TAO_ROOT}, "$ENV{TAO_ROOT}/orbsvcs/orbsvcs");
}
}
-if (!defined $root) {
+if (!defined $includes[0]) {
print STDERR "Please provide the full path ",
"to the Notify Service IDL files\n";
exit(1);
@@ -62,5 +62,13 @@ if (!defined $root) {
foreach my $i ('Notify/MonitorControl/NotificationServiceMC.idl',
'Notify/MonitorControlExt/NotifyMonitoringExt.idl') {
- system("$ENV{OPALORB_ROOT}/idl/idl.pl --include $root --include $root/.. --client $root/$i");
+ my $root;
+ my $cmd = "$ENV{OPALORB_ROOT}/idl/idl.pl --client";
+ foreach my $include (@includes) {
+ $cmd .= " --include $include --include $include/..";
+ if (-r "$include/$i") {
+ $cmd .= " $include/$i";
+ }
+ }
+ system($cmd);
}
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp b/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp
index 76a5973b439..a0969d81032 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/Admin.cpp
@@ -68,13 +68,14 @@ TAO_Notify_Admin::init (TAO_Notify::Topology_Parent* parent)
}
void
-TAO_Notify_Admin::cleanup_proxy (TAO_Notify_Proxy *proxy
- , bool is_supplier)
+TAO_Notify_Admin::cleanup_proxy (TAO_Notify_Proxy *proxy,
+ bool is_supplier,
+ bool experienced_timeout)
{
// We must clean up the proxy before calling remove. Doing it in the
// opposite order causes us to use invalid memory (through the call of
// id() into the proxy).
- ec_->cleanup_proxy (proxy->id(), is_supplier);
+ ec_->cleanup_proxy (proxy->id(), is_supplier, experienced_timeout);
this->remove (proxy);
}
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Admin.h b/TAO/orbsvcs/orbsvcs/Notify/Admin.h
index 62065013559..62037ff3c31 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/Admin.h
+++ b/TAO/orbsvcs/orbsvcs/Notify/Admin.h
@@ -57,7 +57,9 @@ public:
void insert (TAO_Notify_Proxy* proxy);
/// Remove type from container_ and cleanup any EC resources.
- void cleanup_proxy (TAO_Notify_Proxy *proxy, bool is_supplier);
+ void cleanup_proxy (TAO_Notify_Proxy *proxy,
+ bool is_supplier,
+ bool experienced_timeout);
/// Access Admin FilterAdmin.
TAO_Notify_FilterAdmin& filter_admin (void);
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp
index f461665e9cc..a25b15f0189 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/Consumer.cpp
@@ -149,6 +149,7 @@ TAO_Notify_Consumer::deliver (TAO_Notify_Method_Request_Event * request)
bool queued = enqueue_if_necessary (request);
if (!queued)
{
+ bool from_timeout = false;
DispatchStatus status = this->dispatch_request (request);
switch (status)
{
@@ -181,6 +182,9 @@ TAO_Notify_Consumer::deliver (TAO_Notify_Method_Request_Event * request)
request->complete ();
break;
}
+ case DISPATCH_FAIL_TIMEOUT:
+ from_timeout = true;
+ // Fall through
case DISPATCH_FAIL:
{
if (DEBUG_LEVEL > 0)
@@ -193,7 +197,7 @@ TAO_Notify_Consumer::deliver (TAO_Notify_Method_Request_Event * request)
request->complete ();
try
{
- this->proxy_supplier ()->destroy ();
+ this->proxy_supplier ()->destroy (from_timeout);
}
catch (const CORBA::Exception&)
{
@@ -282,7 +286,7 @@ TAO_Notify_Consumer::dispatch_request (TAO_Notify_Method_Request_Event * request
this->proxy ()->id (),
ex._info().c_str ()
));
- result = DISPATCH_FAIL;
+ result = DISPATCH_FAIL_TIMEOUT;
}
catch (const CORBA::COMM_FAILURE& ex)
{
@@ -322,7 +326,8 @@ TAO_Notify_Consumer::dispatch_request (TAO_Notify_Method_Request_Event * request
// for persistent events that haven't timed out
// convert "FAIL" & "DISCARD" to "RETRY"
// for transient events, convert RETRY to DISCARD (hey, best_effort.)
- if (result == DISPATCH_FAIL || result == DISPATCH_DISCARD)
+ if (result == DISPATCH_FAIL ||
+ result == DISPATCH_FAIL_TIMEOUT || result == DISPATCH_DISCARD)
{
if (request->should_retry ())
{
@@ -408,7 +413,7 @@ TAO_Notify_Consumer::dispatch_batch (const CosNotification::EventBatch& batch)
this->proxy ()->id (),
ex._info().c_str ()
));
- result = DISPATCH_FAIL;
+ result = DISPATCH_FAIL_TIMEOUT;
}
catch (const CORBA::COMM_FAILURE& ex)
{
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Consumer.h b/TAO/orbsvcs/orbsvcs/Notify/Consumer.h
index 57d309bee27..a81c6e22b02 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/Consumer.h
+++ b/TAO/orbsvcs/orbsvcs/Notify/Consumer.h
@@ -52,7 +52,9 @@ public:
DISPATCH_SUCCESS,
DISPATCH_RETRY, // retry this message
DISPATCH_DISCARD, // discard this message
- DISPATCH_FAIL}; // discard all messages and disconnect consumer
+ DISPATCH_FAIL, // discard all messages and disconnect consumer
+ DISPATCH_FAIL_TIMEOUT // Same as DISPATCH_FAIL, but due to a timeout
+ };
public:
/// Constructor
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp
index 2292e6ef782..7a94054fb86 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.cpp
@@ -196,8 +196,10 @@ TAO_Notify_EventChannel::release (void)
}
void
-TAO_Notify_EventChannel::cleanup_proxy (CosNotifyChannelAdmin::ProxyID, bool)
-{ }
+TAO_Notify_EventChannel::cleanup_proxy (CosNotifyChannelAdmin::ProxyID,
+ bool, bool)
+{
+}
int
TAO_Notify_EventChannel::shutdown (void)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h
index 4ae9d9c1f9f..f1db9a72c67 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h
+++ b/TAO/orbsvcs/orbsvcs/Notify/EventChannel.h
@@ -95,7 +95,8 @@ public:
// cleanup any proxy resources held by the EC
virtual void cleanup_proxy (CosNotifyChannelAdmin::ProxyID id,
- bool is_supplier);
+ bool is_supplier,
+ bool experienced_timeout);
/// Shutdown
virtual int shutdown (void);
diff --git a/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.cpp b/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.cpp
index a514cc2dc69..6c5d033694a 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.cpp
@@ -73,6 +73,27 @@ private:
bool is_supplier_;
};
+class EventChannelTimedoutConsumers
+ : public TAO_Dynamic_Statistic<TAO_MonitorEventChannel>
+{
+public:
+ EventChannelTimedoutConsumers (TAO_MonitorEventChannel* ec,
+ const ACE_CString& name,
+ Monitor_Base::Information_Type type)
+ : TAO_Dynamic_Statistic<TAO_MonitorEventChannel> (ec,
+ name.c_str (),
+ type)
+ {
+ }
+
+ virtual void update (void)
+ {
+ Monitor_Control_Types::NameList list;
+ this->interf_->get_timedout_consumers (&list);
+ this->receive (list);
+ }
+};
+
class EventChannelConsumerSupplierAdmins
: public TAO_Dynamic_Statistic<TAO_MonitorEventChannel>
{
@@ -438,7 +459,8 @@ TAO_MonitorEventChannel::map_consumer_proxy (
void
TAO_MonitorEventChannel::cleanup_proxy (CosNotifyChannelAdmin::ProxyID id,
- bool is_supplier)
+ bool is_supplier,
+ bool experienced_timeout)
{
ACE_CString name;
@@ -454,6 +476,16 @@ TAO_MonitorEventChannel::cleanup_proxy (CosNotifyChannelAdmin::ProxyID id,
// cause an unexpected exception call which will cause the program to
// abort.
this->supplier_map_.unbind (id, name);
+
+ // If this supplier proxy is being cleaned up because it
+ // experienced a timeout, we need to add it to the timeout supplier
+ // map.
+ if (experienced_timeout && name.length () != 0)
+ {
+ ACE_WRITE_GUARD (ACE_SYNCH_RW_MUTEX, tguard,
+ this->timedout_supplier_mutex_);
+ this->timedout_supplier_map_.bind (id, name);
+ }
}
else
{
@@ -563,6 +595,26 @@ TAO_MonitorEventChannel::add_stats (const char* name)
consumers->remove_ref ();
stat_name = dir_name
+ + NotifyMonitoringExt::EventChannelTimedoutConsumerNames;
+ EventChannelTimedoutConsumers* tconsumers = 0;
+ ACE_NEW_THROW_EX (tconsumers,
+ EventChannelTimedoutConsumers (
+ this,
+ stat_name.c_str (),
+ Monitor_Base::MC_LIST),
+ CORBA::NO_MEMORY ());
+
+ if (!this->register_statistic (stat_name, tconsumers))
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Unable to add statistic %s\n",
+ stat_name.c_str ()));
+ }
+
+ // Registry manages refcount, so we do this regardless.
+ tconsumers->remove_ref ();
+
+ stat_name = dir_name
+ NotifyMonitoringExt::EventChannelSupplierCount;
EventChannelConsumersSuppliers* suppliers = 0;
ACE_NEW_THROW_EX (suppliers,
@@ -964,6 +1016,21 @@ TAO_MonitorEventChannel::get_consumers (
return count;
}
+void
+TAO_MonitorEventChannel::get_timedout_consumers (
+ Monitor_Control_Types::NameList* names)
+{
+ ACE_READ_GUARD (ACE_SYNCH_RW_MUTEX, guard, this->timedout_supplier_mutex_);
+
+ Map::const_iterator itr (this->timedout_supplier_map_);
+ Map::value_type* entry = 0;
+ while (itr.next (entry))
+ {
+ names->push_back (entry->item ());
+ itr.advance ();
+ }
+}
+
size_t
TAO_MonitorEventChannel::get_suppliers (
Monitor_Control_Types::NameList* names)
diff --git a/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.h b/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.h
index 7a08d133b22..e4185d6a642 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.h
+++ b/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/MonitorEventChannel.h
@@ -69,7 +69,8 @@ public:
/// Remove the supplier/consumer proxy id/name mapping.
virtual void cleanup_proxy (CosNotifyChannelAdmin::ProxyID id,
- bool is_supplier);
+ bool is_supplier,
+ bool experienced_timeout);
/// Remove the consumer admin id/name mapping.
virtual void remove_consumeradmin (CosNotifyChannelAdmin::AdminID id);
@@ -105,6 +106,7 @@ public:
private:
size_t get_consumers (Monitor_Control_Types::NameList* names);
size_t get_suppliers (Monitor_Control_Types::NameList* names);
+ void get_timedout_consumers (Monitor_Control_Types::NameList* names);
size_t get_consumeradmins (Monitor_Control_Types::NameList* names);
size_t get_supplieradmins (Monitor_Control_Types::NameList* names);
TAO_Notify_ThreadPool_Task* get_threadpool_task (
@@ -118,6 +120,7 @@ private:
friend class RemoveConsumerSupplierControl;
friend class EventChannelConsumersSuppliers;
+ friend class EventChannelTimedoutConsumers;
friend class EventChannelConsumerSupplierAdmins;
friend class SlowestConsumers;
friend class QueuedEvents;
@@ -148,6 +151,9 @@ private:
mutable TAO_SYNCH_RW_MUTEX consumer_mutex_;
Map consumer_map_;
+ mutable TAO_SYNCH_RW_MUTEX timedout_supplier_mutex_;
+ Map timedout_supplier_map_;
+
mutable TAO_SYNCH_RW_MUTEX supplieradmin_mutex_;
Map supplieradmin_map_;
diff --git a/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/NotifyMonitoringExt.idl b/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/NotifyMonitoringExt.idl
index cc3c37acc04..811e0a8390e 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/NotifyMonitoringExt.idl
+++ b/TAO/orbsvcs/orbsvcs/Notify/MonitorControlExt/NotifyMonitoringExt.idl
@@ -44,6 +44,9 @@ module NotifyMonitoringExt
/// This corresponds to the EventChannel supplier names
const string EventChannelSupplierNames = "SupplierNames";
+ /// This corresponds to the timed out EventChannel consumer names
+ const string EventChannelTimedoutConsumerNames = "TimedoutConsumerNames";
+
/// This corresponds to the EventChannel consumer admin count
const string EventChannelConsumerAdminCount = "ConsumerAdminCount";
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp
index f17b804df6f..742ac748116 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxyConsumer.cpp
@@ -177,7 +177,7 @@ void
TAO_Notify_ProxyConsumer::destroy (void)
{
this->shutdown ();
- this->supplier_admin_->cleanup_proxy (this, false);
+ this->supplier_admin_->cleanup_proxy (this, false, false);
// Do not reset this->supplier_.
// It is not safe to delete the non-refcounted supplier here.
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp
index c18b2bba7a6..82de35d8736 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.cpp
@@ -132,8 +132,14 @@ TAO_Notify_ProxySupplier::shutdown (void)
void
TAO_Notify_ProxySupplier::destroy (void)
{
+ this->destroy (false);
+}
+
+void
+TAO_Notify_ProxySupplier::destroy (bool from_timeout)
+{
this->shutdown ();
- this->consumer_admin_->cleanup_proxy (this, true);
+ this->consumer_admin_->cleanup_proxy (this, true, from_timeout);
// Do not reset this->consumer_.
// It is not safe to delete the non-refcounted consumer here.
diff --git a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h
index 6824e357f87..8f7d1d7792f 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h
+++ b/TAO/orbsvcs/orbsvcs/Notify/ProxySupplier.h
@@ -63,6 +63,10 @@ public:
/// Destroy this object.
virtual void destroy (void);
+ /// Destroy this object, but also indicate if it is due to a timeout or
+ /// not.
+ void destroy (bool from_timeout);
+
/// Override, TAO_Notify_Proxy::qos_changed to apply MaxEventssPerConsumer QoS.
virtual void qos_changed (const TAO_Notify_QoSProperties& qos_properties);
diff --git a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp
index 70d2a45b2d0..a63e5274eae 100644
--- a/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp
+++ b/TAO/orbsvcs/orbsvcs/Notify/Sequence/SequencePushConsumer.cpp
@@ -147,6 +147,7 @@ TAO_Notify_SequencePushConsumer::dispatch_from_queue (Request_Queue& requests, A
ACE_ASSERT (pos > 0);
ace_mon.release ();
+ bool from_timeout = false;
TAO_Notify_Consumer::DispatchStatus status =
this->dispatch_batch (batch);
ace_mon.acquire ();
@@ -163,6 +164,9 @@ TAO_Notify_SequencePushConsumer::dispatch_from_queue (Request_Queue& requests, A
result = true;
break;
}
+ case DISPATCH_FAIL_TIMEOUT:
+ from_timeout = true;
+ // Fall through
case DISPATCH_FAIL:
{
TAO_Notify_Method_Request_Event_Queueable * request = 0;
@@ -211,7 +215,7 @@ TAO_Notify_SequencePushConsumer::dispatch_from_queue (Request_Queue& requests, A
ace_mon.release();
try
{
- this->proxy_supplier ()->destroy ();
+ this->proxy_supplier ()->destroy (from_timeout);
}
catch (const CORBA::Exception&)
{