diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-11-25 02:00:20 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1999-11-25 02:00:20 +0000 |
commit | 08ce8bf95415754c02f210fc9894d97516b7eb59 (patch) | |
tree | 14f0c964a89d945d19bc0026bbe4d5d39eae3fee | |
parent | 4eb1a002398a96c280bc8c375862171b3c77d06c (diff) | |
download | ATCD-08ce8bf95415754c02f210fc9894d97516b7eb59.tar.gz |
ChangeLogTag:Wed Nov 24 19:14:57 1999 Carlos O'Ryan <coryan@cs.wustl.edu>
-rw-r--r-- | TAO/ChangeLog-99c | 29 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Defaults.h | 77 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.cpp | 1 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.h | 16 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_Event_Channel.i | 7 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp | 32 | ||||
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_ProxySupplier.cpp | 38 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/Event/Basic/Basic.dsw | 12 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/Event/Basic/Disconnect.cpp | 336 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/Event/Basic/Disconnect.dsp | 102 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/Event/Basic/Disconnect.h | 93 | ||||
-rw-r--r-- | TAO/orbsvcs/tests/Event/Basic/Makefile | 3 | ||||
-rwxr-xr-x | TAO/orbsvcs/tests/Event/Basic/run_test.pl | 10 |
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; |