summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-11-25 02:00:20 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-11-25 02:00:20 +0000
commit08ce8bf95415754c02f210fc9894d97516b7eb59 (patch)
tree14f0c964a89d945d19bc0026bbe4d5d39eae3fee
parent4eb1a002398a96c280bc8c375862171b3c77d06c (diff)
downloadATCD-08ce8bf95415754c02f210fc9894d97516b7eb59.tar.gz
ChangeLogTag:Wed Nov 24 19:14:57 1999 Carlos O'Ryan <coryan@cs.wustl.edu>
-rw-r--r--TAO/ChangeLog-99c29
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h77
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp1
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h16
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.i7
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp32
-rw-r--r--TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp38
-rw-r--r--TAO/orbsvcs/tests/Event/Basic/Basic.dsw12
-rw-r--r--TAO/orbsvcs/tests/Event/Basic/Disconnect.cpp336
-rw-r--r--TAO/orbsvcs/tests/Event/Basic/Disconnect.dsp102
-rw-r--r--TAO/orbsvcs/tests/Event/Basic/Disconnect.h93
-rw-r--r--TAO/orbsvcs/tests/Event/Basic/Makefile3
-rwxr-xr-xTAO/orbsvcs/tests/Event/Basic/run_test.pl10
13 files changed, 736 insertions, 20 deletions
diff --git a/TAO/ChangeLog-99c b/TAO/ChangeLog-99c
index 1eeb621e059..638fa672aa2 100644
--- a/TAO/ChangeLog-99c
+++ b/TAO/ChangeLog-99c
@@ -1,3 +1,32 @@
+Wed Nov 24 19:14:57 1999 Carlos O'Ryan <coryan@cs.wustl.edu>
+
+ * orbsvcs/orbsvcs/Event/EC_Event_Channel.h:
+ * orbsvcs/orbsvcs/Event/EC_Event_Channel.i:
+ * orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp:
+ * orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp:
+ * orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp:
+ Tom Ziomek <tomz@cc.comm.mot.com> raises the issue as to whether
+ the event channel should invoke the disconnect_push_XXXX()
+ callback when the user calls disconnect_push_YYYY() on the
+ proxy. It seems like the tide is for performing the callback
+ all the time, not only when the event channel is going down, but
+ it is not clear if that is the case and we could break backwards
+ compatibility if we do that change.
+ Instead we added a flag to the EC to control its behavior, like
+ the supplier and consumer reconnections.
+
+ * orbsvcs/orbsvcs/Event/EC_Defaults.h:
+ Made it easier to override the default configuration for the
+ event channel.
+
+ * orbsvcs/tests/Event/Basic/Makefile:
+ * orbsvcs/tests/Event/Basic/Basic.dsw:
+ * orbsvcs/tests/Event/Basic/Disconnect.dsp:
+ * orbsvcs/tests/Event/Basic/run_test.pl:
+ * orbsvcs/tests/Event/Basic/Disconnect.h:
+ * orbsvcs/tests/Event/Basic/Disconnect.cpp:
+ Added a new test for the disconnect callback feature.
+
Tue Nov 23 00:30:00 1999 Kirthika Parameswaran <kirthika@cs.wustl.edu>
* tests/Smart_Proxies/client.cpp:
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h b/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
index 6aec9e25616..20b2a8a1155 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h
@@ -29,16 +29,33 @@
#ifndef TAO_EC_DEFAULTS_H
#define TAO_EC_DEFAULTS_H
+// Any of the definitions below can be overriden in the config.h file
+// or the compilation line.
// Control consumer and supplier reconnections
-#define TAO_EC_DEFAULT_CONSUMER_RECONNECT 0
+#ifndef TAO_EC_DEFAULT_CONSUMER_RECONNECT
+# define TAO_EC_DEFAULT_CONSUMER_RECONNECT 0
+#endif /* TAO_EC_DEFAULT_CONSUMER_RECONNECT */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_RECONNECT
#define TAO_EC_DEFAULT_SUPPLIER_RECONNECT 0
+#endif /* TAO_EC_DEFAULT_SUPPLIER_RECONNECT */
+
+// Control callbacks when proxies are disconnected
+#ifndef TAO_EC_DEFAULT_DISCONNECT_CALLBACKS
+# define TAO_EC_DEFAULT_DISCONNECT_CALLBACKS 0
+#endif /* TAO_EC_DEFAULT_DISCONNECT_CALLBACKS */
// Control the maximum degree of concurrency tolerated by the EC, some
// kind of limit is required to avoid starvation of delayed write
// operations.
-#define TAO_EC_DEFAULT_BUSY_HWM 1024
-#define TAO_EC_DEFAULT_MAX_WRITE_DELAY 2048
+#ifndef TAO_EC_DEFAULT_BUSY_HWM
+# define TAO_EC_DEFAULT_BUSY_HWM 1024
+#endif /* TAO_EC_DEFAULT_BUSY_HWM */
+
+#ifndef TAO_EC_DEFAULT_MAX_WRITE_DELAY
+# define TAO_EC_DEFAULT_MAX_WRITE_DELAY 2048
+#endif /* TAO_EC_DEFAULT_MAX_WRITE_DELAY */
// The defaults for the default factory.
// The TAO_EC_Default_Factory is a run-time configurable factory for
@@ -46,16 +63,48 @@
// specify what strategies should the factory produce.
// This macros control the default values for those strategies.
//
-#define TAO_EC_DEFAULT_DISPATCHING 0 /* reactive */
-#define TAO_EC_DEFAULT_CONSUMER_FILTER 1 /* type, disj. conj. timers */
-#define TAO_EC_DEFAULT_SUPPLIER_FILTER 1 /* per supplier */
-#define TAO_EC_DEFAULT_TIMEOUT 0 /* reactive */
-#define TAO_EC_DEFAULT_OBSERVER 0 /* null */
-#define TAO_EC_DEFAULT_SCHEDULING 0 /* null */
-#define TAO_EC_DEFAULT_SUPPLIER_SET 1 /* delayed MT-safe */
-#define TAO_EC_DEFAULT_CONSUMER_LOCK 1 /* thread */
-#define TAO_EC_DEFAULT_SUPPLIER_LOCK 1 /* thread */
-#define TAO_EC_DEFAULT_CONSUMER_ADMIN_LOCK 1 /* thread */
-#define TAO_EC_DEFAULT_SUPPLIER_ADMIN_LOCK 1 /* thread */
+#ifndef TAO_EC_DEFAULT_DISPATCHING
+# define TAO_EC_DEFAULT_DISPATCHING 0 /* reactive */
+#endif /* TAO_EC_DEFAULT_DISPATCHING */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_FILTER
+# define TAO_EC_DEFAULT_CONSUMER_FILTER 1 /* type, disj. conj. timers */
+#endif /* TAO_EC_DEFAULT_CONSUMER_FILTER */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_FILTER
+# define TAO_EC_DEFAULT_SUPPLIER_FILTER 1 /* per supplier */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_FILTER */
+
+#ifndef TAO_EC_DEFAULT_TIMEOUT
+# define TAO_EC_DEFAULT_TIMEOUT 0 /* reactive */
+#endif /* TAO_EC_DEFAULT_TIMEOUT */
+
+#ifndef TAO_EC_DEFAULT_OBSERVER
+# define TAO_EC_DEFAULT_OBSERVER 0 /* null */
+#endif /* TAO_EC_DEFAULT_OBSERVER */
+
+#ifndef TAO_EC_DEFAULT_SCHEDULING
+# define TAO_EC_DEFAULT_SCHEDULING 0 /* null */
+#endif /* TAO_EC_DEFAULT_SCHEDULING */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_SET
+# define TAO_EC_DEFAULT_SUPPLIER_SET 1 /* delayed MT-safe */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_SET */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_LOCK
+# define TAO_EC_DEFAULT_CONSUMER_LOCK 1 /* thread */
+#endif /* TAO_EC_DEFAULT_CONSUMER_LOCK */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_LOCK
+# define TAO_EC_DEFAULT_SUPPLIER_LOCK 1 /* thread */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_LOCK */
+
+#ifndef TAO_EC_DEFAULT_CONSUMER_ADMIN_LOCK
+# define TAO_EC_DEFAULT_CONSUMER_ADMIN_LOCK 1 /* thread */
+#endif /* TAO_EC_DEFAULT_CONSUMER_ADMIN_LOCK */
+
+#ifndef TAO_EC_DEFAULT_SUPPLIER_ADMIN_LOCK
+# define TAO_EC_DEFAULT_SUPPLIER_ADMIN_LOCK 1 /* thread */
+#endif /* TAO_EC_DEFAULT_SUPPLIER_ADMIN_LOCK */
#endif /* TAO_EC_DEFAULTS_H */
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp
index 240dd006d4c..92c5a92b64b 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp
@@ -25,6 +25,7 @@ TAO_EC_Event_Channel (const TAO_EC_Event_Channel_Attributes& attr,
own_factory_ (own_factory),
consumer_reconnect_ (attr.consumer_reconnect),
supplier_reconnect_ (attr.supplier_reconnect),
+ disconnect_callbacks_ (attr.disconnect_callbacks),
busy_hwm_ (attr.busy_hwm),
max_write_delay_ (attr.max_write_delay)
{
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h
index 0063ac2b7a1..5f19fbae273 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h
@@ -66,6 +66,15 @@ public:
int supplier_reconnect;
// Can consumers or suppliers invoke connect_push_* multiple times?
+ int disconnect_callbacks;
+ // It not zero the event channel will send disconnect callbacks when
+ // a disconnect method is called on a Proxy. In other words, if a
+ // consumer calls disconnect_push_supplier() on its proxy the EC
+ // will invoke disconnect_push_consumer() on the consumer. A
+ // similar thing is done for suppliers.
+ // It is a matter of debate what the spec requires for the regular
+ // event service.
+
int busy_hwm;
int max_write_delay;
// Flags for the Consumer Admin
@@ -194,6 +203,10 @@ public:
int supplier_reconnect (void) const;
// Can the suppliers reconnect to the EC?
+ int disconnect_callbacks (void) const;
+ // Should we send callback disconnect messages when a proxy is
+ // disconnected by the client
+
RtecScheduler::Scheduler_ptr scheduler (void);
// Obtain the scheduler, the user must release
@@ -279,6 +292,9 @@ private:
int supplier_reconnect_;
// Consumer/Supplier reconnection flags
+ int disconnect_callbacks_;
+ // If not zero we send callbacks when a proxy is disconnected
+
int busy_hwm_;
int max_write_delay_;
// Control the level of concurrency in the supplier sets with
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.i b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.i
index 35b4678ac6e..e401155157a 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.i
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.i
@@ -6,6 +6,7 @@ TAO_EC_Event_Channel_Attributes (PortableServer::POA_ptr s_poa,
PortableServer::POA_ptr c_poa)
: consumer_reconnect (TAO_EC_DEFAULT_CONSUMER_RECONNECT),
supplier_reconnect (TAO_EC_DEFAULT_SUPPLIER_RECONNECT),
+ disconnect_callbacks (TAO_EC_DEFAULT_DISCONNECT_CALLBACKS),
busy_hwm (TAO_EC_DEFAULT_BUSY_HWM),
max_write_delay (TAO_EC_DEFAULT_MAX_WRITE_DELAY),
scheduler (RtecScheduler::Scheduler::_nil ()),
@@ -164,6 +165,12 @@ TAO_EC_Event_Channel::supplier_reconnect (void) const
return this->supplier_reconnect_;
}
+ACE_INLINE int
+TAO_EC_Event_Channel::disconnect_callbacks (void) const
+{
+ return this->disconnect_callbacks_;
+}
+
ACE_INLINE RtecScheduler::Scheduler_ptr
TAO_EC_Event_Channel::scheduler (void)
{
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
index 7dee4cee165..8aea88c96a1 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp
@@ -128,7 +128,17 @@ TAO_EC_ProxyPushConsumer::shutdown (CORBA::Environment &ACE_TRY_ENV)
this->deactivate (ACE_TRY_ENV);
ACE_CHECK;
- supplier->disconnect_push_supplier (ACE_TRY_ENV);
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
}
void
@@ -278,6 +288,8 @@ TAO_EC_ProxyPushConsumer::disconnect_push_consumer (
CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+ RtecEventComm::PushSupplier_var supplier;
+
{
ACE_GUARD_THROW_EX (
ACE_Lock, ace_mon, *this->lock_,
@@ -288,6 +300,8 @@ TAO_EC_ProxyPushConsumer::disconnect_push_consumer (
if (this->is_connected_i () == 0)
ACE_THROW (CORBA::BAD_INV_ORDER ()); // @@ add user exception?
+ supplier = this->supplier_._retn ();
+
this->cleanup_i ();
}
@@ -296,6 +310,22 @@ TAO_EC_ProxyPushConsumer::disconnect_push_consumer (
// Notify the event channel...
this->event_channel_->disconnected (this, ACE_TRY_ENV);
+ ACE_CHECK;
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ supplier->disconnect_push_supplier (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // failures on this one.
+ }
+ ACE_ENDTRY;
+ }
this->_decr_refcnt ();
}
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp
index 4a6ee4f78e7..8ee0b682bc5 100644
--- a/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp
+++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp
@@ -37,7 +37,7 @@ void
TAO_EC_ProxyPushSupplier::connected (TAO_EC_ProxyPushConsumer* consumer,
CORBA::Environment &ACE_TRY_ENV)
{
- TAO_EC_Scheduling_Strategy *s =
+ TAO_EC_Scheduling_Strategy *s =
this->event_channel_->scheduling_strategy ();
s->add_proxy_supplier_dependencies (this,
@@ -66,6 +66,8 @@ TAO_EC_ProxyPushSupplier::disconnected (TAO_EC_ProxyPushSupplier*,
void
TAO_EC_ProxyPushSupplier::shutdown (CORBA::Environment &ACE_TRY_ENV)
{
+ // Save the consumer we where connected to, we need to send a
+ // disconnect message to it.
RtecEventComm::PushConsumer_var consumer;
{
@@ -85,9 +87,19 @@ TAO_EC_ProxyPushSupplier::shutdown (CORBA::Environment &ACE_TRY_ENV)
this->deactivate (ACE_TRY_ENV);
ACE_CHECK;
- consumer->disconnect_push_consumer (ACE_TRY_ENV);
-
this->_decr_refcnt ();
+
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ }
+ ACE_ENDTRY;
}
void
@@ -216,6 +228,8 @@ TAO_EC_ProxyPushSupplier::disconnect_push_supplier (
CORBA::Environment &ACE_TRY_ENV)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+ RtecEventComm::PushConsumer_var consumer;
+
{
ACE_GUARD_THROW_EX (
ACE_Lock, ace_mon, *this->lock_,
@@ -226,6 +240,8 @@ TAO_EC_ProxyPushSupplier::disconnect_push_supplier (
if (this->is_connected_i () == 0)
ACE_THROW (CORBA::BAD_INV_ORDER ());
+ consumer = this->consumer_._retn ();
+
this->cleanup_i ();
}
@@ -234,6 +250,22 @@ TAO_EC_ProxyPushSupplier::disconnect_push_supplier (
// Notify the event channel....
this->event_channel_->disconnected (this, ACE_TRY_ENV);
+ ACE_CHECK;
+
+ if (this->event_channel_->disconnect_callbacks ())
+ {
+ ACE_TRY
+ {
+ consumer->disconnect_push_consumer (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ }
+ ACE_CATCHANY
+ {
+ // Ignore exceptions, we must isolate other clients from
+ // problems on this one.
+ }
+ ACE_ENDTRY;
+ }
this->_decr_refcnt ();
}
diff --git a/TAO/orbsvcs/tests/Event/Basic/Basic.dsw b/TAO/orbsvcs/tests/Event/Basic/Basic.dsw
index 3fe67eef370..22754f57106 100644
--- a/TAO/orbsvcs/tests/Event/Basic/Basic.dsw
+++ b/TAO/orbsvcs/tests/Event/Basic/Basic.dsw
@@ -99,6 +99,18 @@ Package=<4>
###############################################################################
+Project: "Disconnect"=.\Disconnect.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
Global:
Package=<5>
diff --git a/TAO/orbsvcs/tests/Event/Basic/Disconnect.cpp b/TAO/orbsvcs/tests/Event/Basic/Disconnect.cpp
new file mode 100644
index 00000000000..a80a40f4ae1
--- /dev/null
+++ b/TAO/orbsvcs/tests/Event/Basic/Disconnect.cpp
@@ -0,0 +1,336 @@
+// $Id$
+
+#include "Disconnect.h"
+
+#include "orbsvcs/Time_Utilities.h"
+#include "orbsvcs/Event_Utilities.h"
+#include "orbsvcs/Event/EC_Event_Channel.h"
+#include "orbsvcs/Event/EC_Default_Factory.h"
+
+ACE_RCSID(EC_Tests, Disconnect, "$Id$")
+
+static void run_test (PortableServer::POA_ptr poa,
+ int use_callbacks,
+ CORBA::Environment &ACE_TRY_ENV);
+
+int
+main (int argc, char* argv[])
+{
+ TAO_EC_Default_Factory::init_svcs ();
+
+ ACE_DECLARE_NEW_CORBA_ENV;
+ ACE_TRY
+ {
+ // ORB initialization boiler plate...
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "", ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var object =
+ orb->resolve_initial_references ("RootPOA", ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ PortableServer::POA_var poa =
+ PortableServer::POA::_narrow (object.in (), ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ PortableServer::POAManager_var poa_manager =
+ poa->the_POAManager (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+ poa_manager->activate (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ // ****************************************************************
+
+ run_test (poa.in (), 0, ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ run_test (poa.in (), 1, ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ // ****************************************************************
+
+ poa->destroy (1, 1, ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ orb->destroy (ACE_TRY_ENV);
+ ACE_TRY_CHECK;
+
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Service");
+ return 1;
+ }
+ ACE_ENDTRY;
+ return 0;
+}
+
+// ****************************************************************
+
+void
+deactivate_servant (PortableServer::Servant servant,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ PortableServer::POA_var poa =
+ servant->_default_POA (ACE_TRY_ENV);
+ ACE_CHECK;
+ PortableServer::ObjectId_var id =
+ poa->servant_to_id (servant, ACE_TRY_ENV);
+ ACE_CHECK;
+ poa->deactivate_object (id.in (), ACE_TRY_ENV);
+ ACE_CHECK;
+}
+
+void
+run_test (PortableServer::POA_ptr poa,
+ int use_callbacks,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ TAO_EC_Event_Channel_Attributes attributes (poa, poa);
+ attributes.disconnect_callbacks = use_callbacks;
+
+ TAO_EC_Event_Channel ec_impl (attributes);
+ ec_impl.activate (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ RtecEventChannelAdmin::EventChannel_var event_channel =
+ ec_impl._this (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ // ****************************************************************
+
+ // Obtain the consumer admin..
+ RtecEventChannelAdmin::ConsumerAdmin_var consumer_admin =
+ event_channel->for_consumers (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ // and the supplier admin..
+ RtecEventChannelAdmin::SupplierAdmin_var supplier_admin =
+ event_channel->for_suppliers (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ // ****************************************************************
+
+ int iterations = 100;
+
+ Supplier supplier_0;
+ Supplier supplier_1;
+ Consumer consumer_0;
+ Consumer consumer_1;
+
+ const int event_type = 20;
+ const int event_source = 10;
+
+ ACE_ConsumerQOS_Factory consumer_qos;
+ consumer_qos.start_disjunction_group ();
+ consumer_qos.insert (event_source, event_type, 0);
+
+ ACE_SupplierQOS_Factory supplier_qos;
+ supplier_qos.insert (event_source,
+ event_type,
+ 0, 1);
+
+ for (int i = 0; i != iterations; ++i)
+ {
+ supplier_0.connect (supplier_admin.in (),
+ supplier_qos.get_SupplierQOS (),
+ ACE_TRY_ENV);
+ ACE_CHECK;
+ consumer_0.connect (consumer_admin.in (),
+ consumer_qos.get_ConsumerQOS (),
+ ACE_TRY_ENV);
+ ACE_CHECK;
+ if (i % 2 == 1)
+ {
+ supplier_1.connect (supplier_admin.in (),
+ supplier_qos.get_SupplierQOS (),
+ ACE_TRY_ENV);
+ ACE_CHECK;
+ consumer_1.connect (consumer_admin.in (),
+ consumer_qos.get_ConsumerQOS (),
+ ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+ supplier_0.disconnect (ACE_TRY_ENV);
+ ACE_CHECK;
+ consumer_0.disconnect (ACE_TRY_ENV);
+ ACE_CHECK;
+ if (i % 2 == 1)
+ {
+ consumer_1.disconnect (ACE_TRY_ENV);
+ ACE_CHECK;
+ supplier_1.disconnect (ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+ }
+
+ supplier_0.connect (supplier_admin.in (),
+ supplier_qos.get_SupplierQOS (),
+ ACE_TRY_ENV);
+ ACE_CHECK;
+ consumer_0.connect (consumer_admin.in (),
+ consumer_qos.get_ConsumerQOS (),
+ ACE_TRY_ENV);
+ ACE_CHECK;
+
+ event_channel->destroy (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ deactivate_servant (&supplier_0, ACE_TRY_ENV);
+ ACE_CHECK;
+
+ deactivate_servant (&consumer_0, ACE_TRY_ENV);
+ ACE_CHECK;
+
+ deactivate_servant (&ec_impl, ACE_TRY_ENV);
+ ACE_CHECK;
+
+ CORBA::ULong count_0 = 1;
+ CORBA::ULong count_1 = 0;
+ if (use_callbacks)
+ {
+ count_0 += iterations;
+ count_1 += iterations / 2;
+ }
+
+ if (consumer_0.disconnect_count != count_0)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: incorrect number of disconnect calls (%d/%d) for "
+ "consumer 0 (%d)\n",
+ consumer_0.disconnect_count, count_0,
+ use_callbacks));
+ if (supplier_0.disconnect_count != count_0)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: incorrect number of disconnect calls (%d/%d) for "
+ "supplier 0 (%d)\n",
+ supplier_0.disconnect_count, count_0,
+ use_callbacks));
+
+ if (consumer_1.disconnect_count != count_1)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: incorrect number of disconnect calls (%d/%d) for "
+ "consumer 1 (%d)\n",
+ consumer_1.disconnect_count, count_1,
+ use_callbacks));
+ if (supplier_1.disconnect_count != count_1)
+ ACE_ERROR ((LM_ERROR,
+ "ERROR: incorrect number of disconnect calls (%d/%d) for "
+ "supplier 1 (%d)\n",
+ supplier_1.disconnect_count, count_1,
+ use_callbacks));
+}
+
+// ****************************************************************
+
+Consumer::Consumer (void)
+ : disconnect_count (0)
+{
+}
+
+void
+Consumer::connect (RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin,
+ const RtecEventChannelAdmin::ConsumerQOS &qos,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ // The canonical protocol to connect to the EC
+
+ RtecEventComm::PushConsumer_var consumer =
+ this->_this (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ this->supplier_proxy_ =
+ consumer_admin->obtain_push_supplier (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ this->supplier_proxy_->connect_push_consumer (consumer.in (),
+ qos,
+ ACE_TRY_ENV);
+ ACE_CHECK;
+}
+
+void
+Consumer::disconnect (CORBA::Environment &ACE_TRY_ENV)
+{
+ this->supplier_proxy_->disconnect_push_supplier (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ PortableServer::POA_var consumer_poa =
+ this->_default_POA (ACE_TRY_ENV);
+ ACE_CHECK;
+ PortableServer::ObjectId_var consumer_id =
+ consumer_poa->servant_to_id (this, ACE_TRY_ENV);
+ ACE_CHECK;
+ consumer_poa->deactivate_object (consumer_id.in (), ACE_TRY_ENV);
+ ACE_CHECK;
+}
+
+void
+Consumer::push (const RtecEventComm::EventSet&,
+ CORBA::Environment &)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ // Ignore events, it does not happen on this test.
+}
+
+void
+Consumer::disconnect_push_consumer (CORBA::Environment &)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->disconnect_count++;
+}
+
+// ****************************************************************
+
+Supplier::Supplier (void)
+ : disconnect_count (0)
+{
+}
+
+void
+Supplier::connect (RtecEventChannelAdmin::SupplierAdmin_ptr supplier_admin,
+ const RtecEventChannelAdmin::SupplierQOS &qos,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ RtecEventComm::PushSupplier_var supplier =
+ this->_this (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ this->consumer_proxy_ =
+ supplier_admin->obtain_push_consumer (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ this->consumer_proxy_->connect_push_supplier (supplier.in (),
+ qos,
+ ACE_TRY_ENV);
+ ACE_CHECK;
+}
+
+void
+Supplier::disconnect (CORBA::Environment &ACE_TRY_ENV)
+{
+ this->consumer_proxy_->disconnect_push_consumer (ACE_TRY_ENV);
+ ACE_CHECK;
+
+ PortableServer::POA_var supplier_poa =
+ this->_default_POA (ACE_TRY_ENV);
+ ACE_CHECK;
+ PortableServer::ObjectId_var supplier_id =
+ supplier_poa->servant_to_id (this, ACE_TRY_ENV);
+ ACE_CHECK;
+ supplier_poa->deactivate_object (supplier_id.in (), ACE_TRY_ENV);
+ ACE_CHECK;
+}
+
+void
+Supplier::disconnect_push_supplier (CORBA::Environment &)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ this->disconnect_count++;
+}
+
+// ****************************************************************
+
+#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
+
+#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
+
+#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
diff --git a/TAO/orbsvcs/tests/Event/Basic/Disconnect.dsp b/TAO/orbsvcs/tests/Event/Basic/Disconnect.dsp
new file mode 100644
index 00000000000..2c228ca2924
--- /dev/null
+++ b/TAO/orbsvcs/tests/Event/Basic/Disconnect.dsp
@@ -0,0 +1,102 @@
+# Microsoft Developer Studio Project File - Name="Disconnect" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=Disconnect - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "Disconnect.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "Disconnect.mak" CFG="Disconnect - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "Disconnect - Win32 Release" (based on\
+ "Win32 (x86) Console Application")
+!MESSAGE "Disconnect - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "Disconnect - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\lib" /I "..\..\.." /I "..\..\..\.." /I "..\..\..\..\.." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ECTest.lib orbsvcs.lib TAO.lib ace.lib /nologo /subsystem:console /machine:I386 /libpath:"..\lib" /libpath:"..\..\..\orbsvcs" /libpath:"..\..\..\..\tao" /libpath:"..\..\..\..\..\ace"
+
+!ELSEIF "$(CFG)" == "Disconnect - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\lib" /I "..\..\.." /I "..\..\..\.." /I "..\..\..\..\.." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ECTestd.lib orbsvcsd.lib TAOd.lib aced.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\lib" /libpath:"..\..\..\orbsvcs" /libpath:"..\..\..\..\tao" /libpath:"..\..\..\..\..\ace"
+
+!ENDIF
+
+# Begin Target
+
+# Name "Disconnect - Win32 Release"
+# Name "Disconnect - Win32 Debug"
+# Begin Group "Header Files"
+
+# PROP Default_Filter ".h"
+# Begin Source File
+
+SOURCE=.\Disconnect.h
+# End Source File
+# End Group
+# Begin Group "Source Files"
+
+# PROP Default_Filter ".cpp"
+# Begin Source File
+
+SOURCE=.\Disconnect.cpp
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/TAO/orbsvcs/tests/Event/Basic/Disconnect.h b/TAO/orbsvcs/tests/Event/Basic/Disconnect.h
new file mode 100644
index 00000000000..86e12e4c8c3
--- /dev/null
+++ b/TAO/orbsvcs/tests/Event/Basic/Disconnect.h
@@ -0,0 +1,93 @@
+/* -*- C++ -*- */
+// $Id$
+//
+// ============================================================================
+//
+// = LIBRARY
+// ORBSVCS Real-time Event Channel tests
+//
+// = FILENAME
+// Disconnect.h
+//
+// = AUTHOR
+// Carlos O'Ryan (coryan@cs.wustl.edu)
+//
+// ============================================================================
+
+#ifndef EC_DISCONNECT_H
+#define EC_DISCONNECT_H
+
+#include "orbsvcs/RtecEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+class Consumer : public POA_RtecEventComm::PushConsumer
+{
+ // = TITLE
+ // Simple consumer object
+ //
+ // = DESCRIPTION
+ //
+public:
+ Consumer (void);
+ // Constructor
+
+ void connect (RtecEventChannelAdmin::ConsumerAdmin_ptr consumer_admin,
+ const RtecEventChannelAdmin::ConsumerQOS &qos,
+ CORBA::Environment &ACE_TRY_ENV);
+ void disconnect (CORBA::Environment &ACE_TRY_ENV);
+ // Simple connect/disconnect methods..
+
+ // = The RtecEventComm::PushConsumer methods
+
+ virtual void push (const RtecEventComm::EventSet& events,
+ CORBA::Environment &_env)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void disconnect_push_consumer (CORBA::Environment &)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // The skeleton methods.
+
+ CORBA::ULong disconnect_count;
+ // Keep track of the number of disconnect calls received.
+
+private:
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+ // The proxy
+};
+
+class Supplier : public POA_RtecEventComm::PushSupplier
+{
+ // = TITLE
+ // Simple supplier object
+ //
+ // = DESCRIPTION
+ //
+public:
+ Supplier (void);
+ // Constructor
+
+ // = The RtecEventComm::PushSupplier methods
+
+ void connect (RtecEventChannelAdmin::SupplierAdmin_ptr supplier_admin,
+ const RtecEventChannelAdmin::SupplierQOS &qos,
+ CORBA::Environment &ACE_TRY_ENV);
+ void disconnect (CORBA::Environment &ACE_TRY_ENV);
+ // Simple connect/disconnect methods..
+
+ // = The RtecEventComm::PushSupplier methods
+
+ virtual void disconnect_push_supplier (CORBA::Environment &)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+ // The skeleton methods.
+
+ CORBA::ULong disconnect_count;
+ // Keep track of the number of disconnect calls received.
+
+private:
+ RtecEventChannelAdmin::ProxyPushConsumer_var consumer_proxy_;
+ // Our proxy
+};
+
+#endif /* EC_DISCONNECT_H */
diff --git a/TAO/orbsvcs/tests/Event/Basic/Makefile b/TAO/orbsvcs/tests/Event/Basic/Makefile
index b63317cb8e1..21dad051ddc 100644
--- a/TAO/orbsvcs/tests/Event/Basic/Makefile
+++ b/TAO/orbsvcs/tests/Event/Basic/Makefile
@@ -19,7 +19,8 @@ BIN2 = Reconnect \
BCast \
Timeout \
Wildcard \
- Negation
+ Negation \
+ Disconnect
#### If the orbsvcs library wasn't built with all components, don't
#### try to build certain tests.
diff --git a/TAO/orbsvcs/tests/Event/Basic/run_test.pl b/TAO/orbsvcs/tests/Event/Basic/run_test.pl
index e0a80165dfc..7d88094f506 100755
--- a/TAO/orbsvcs/tests/Event/Basic/run_test.pl
+++ b/TAO/orbsvcs/tests/Event/Basic/run_test.pl
@@ -74,7 +74,7 @@ if ($T->TimedWait (60) == -1) {
$T->Kill (); $T->TimedWait (1);
}
-print STDERR "\n\nWildcard tests\n";
+print STDERR "\n\nNegation tests\n";
$T = Process::Create ($prefix . "Negation".$EXE_EXT);
if ($T->TimedWait (60) == -1) {
print STDERR "ERROR: Test timedout\n";
@@ -82,4 +82,12 @@ if ($T->TimedWait (60) == -1) {
$T->Kill (); $T->TimedWait (1);
}
+print STDERR "\n\nDisconnect callbacks test\n";
+$T = Process::Create ($prefix . "Disconnect".$EXE_EXT);
+if ($T->TimedWait (60) == -1) {
+ print STDERR "ERROR: Test timedout\n";
+ $status = 1;
+ $T->Kill (); $T->TimedWait (1);
+}
+
exit $status;