summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h')
-rw-r--r--TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h b/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h
new file mode 100644
index 00000000000..5503863c9be
--- /dev/null
+++ b/TAO/orbsvcs/tests/EC_Multiple/EC_Multiple.h
@@ -0,0 +1,156 @@
+/* -*- C++ -*- */
+// $Id$
+//
+// ============================================================================
+//
+// = DESCRIPTION
+// This test attempts to communicate several Event Channels.
+// The test hardcodes all the objects involved (consumers,
+// suppliers, proxies, etc.); the objective is to gain understanding
+// on the architecture needed to exploit locality in the Event
+// cycle, not to provide a definite solution.
+//
+// ============================================================================
+
+#if !defined (EC_MULTIPLE_H)
+#define EC_MULTIPLE_H
+
+#include "ace/SString.h"
+#include "orbsvcs/RtecEventChannelAdminC.h"
+#include "orbsvcs/RtecEventCommS.h"
+#include "orbsvcs/Channel_Clients_T.h"
+
+
+class EC_Proxy
+// = TITLE
+// Event Channel Proxy.
+//
+// = DESCRIPTION
+// This class mediates among two event channels, it connects as a
+// consumer of events with a remote event channel, and as a supplier
+// of events with the local EC.
+// As a consumer it gives a QoS designed to only accept the events
+// in which *local* consumers are interested.
+// Eventually the local EC should create this object and compute its
+// QoS in an automated manner; but this requires some way to filter
+// out the peers registered as consumers, otherwise we will get
+// loops in the QoS graph.
+// It uses exactly the same set of events in the publications list
+// when connected as a supplier.
+//
+// = NOTES
+// An alternative implementation would be to register with the
+// remote EC as a supplier, and then filter on the remote EC, but
+// one of the objectives is to minimize network traffic.
+// On the other hand the events will be pushed to remote consumers,
+// event though they will be dropped upon receipt (due to the TTL
+// field); IMHO this is another suggestion that the EC needs to know
+// (somehow) which consumers are truly its peers in disguise.
+//
+// = ALTERNATIVES
+// Check http://www.cs.wustl.edu/~coryan/Multiple_EC.html for a
+// discussion on that topic.
+//
+{
+public:
+ EC_Proxy (void);
+ ~EC_Proxy (void);
+
+ int open (RtecEventChannelAdmin::EventChannel_ptr remote_ec,
+ RtecEventChannelAdmin::EventChannel_ptr local_ec,
+ const RtecEventChannelAdmin::ConsumerQOS& subscriptions,
+ const RtecEventChannelAdmin::SupplierQOS& publications,
+ CORBA::Environment &_env);
+ // Establish the connections.
+
+ void disconnect_push_supplier (CORBA::Environment &);
+ // The channel is disconnecting.
+
+ void disconnect_push_consumer (CORBA::Environment &);
+ // The channel is disconnecting.
+
+ void push (const RtecEventComm::EventSet &events,
+ CORBA::Environment &);
+ // This is the Consumer side behavior, it pushes the events to the
+ // local event channel.
+
+private:
+ ACE_PushConsumer_Adapter<EC_Proxy> consumer_;
+ ACE_PushSupplier_Adapter<EC_Proxy> supplier_;
+
+ RtecEventChannelAdmin::ProxyPushConsumer_var consumer_proxy_;
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+};
+
+class Test_ECP
+//
+// = TITLE
+// A simple test for the EC_Proxy class.
+//
+// = DESCRIPTION
+// This class is design to exercise several features of the EC_Proxy
+// class and the multiple EC architecture.
+// We want to create two EC, each one having a single supplier and a
+// single consumer.
+// + To test the remote facilities the consumer register for both a
+// local event and a remote one.
+// + To test the remote filtering features the remote consumer only
+// wants one of the local events, and this event is generated less
+// frequently.
+//
+// This class creates the local ECP a consumer and a supplier, it
+// uses the command line to figure the
+//
+{
+public:
+ Test_ECP (void);
+
+ int run (int argc, char* argv[]);
+ // Execute the test.
+
+ void disconnect_push_supplier (CORBA::Environment &);
+ void disconnect_push_consumer (CORBA::Environment &);
+ void push (const RtecEventComm::EventSet &events,
+ CORBA::Environment &);
+ // Implement the consumer and supplier upcalls.
+
+
+private:
+ int parse_args (int argc, char* argv[]);
+
+ RtecEventChannelAdmin::EventChannel_ptr
+ get_ec (CosNaming::NamingContext_ptr naming_context,
+ const char* ec_name,
+ CORBA::Environment &_env);
+
+ int connect_supplier (RtecEventChannelAdmin::EventChannel_ptr local_ec,
+ CORBA::Environment &_env);
+ int connect_consumer (RtecEventChannelAdmin::EventChannel_ptr local_ec,
+ CORBA::Environment &_env);
+ int connect_ecp (RtecEventChannelAdmin::EventChannel_ptr local_ec,
+ RtecEventChannelAdmin::EventChannel_ptr remote_ec,
+ CORBA::Environment &_env);
+
+private:
+ ACE_PushConsumer_Adapter<Test_ECP> consumer_;
+ ACE_PushSupplier_Adapter<Test_ECP> supplier_;
+
+ EC_Proxy ecp_;
+
+ RtecEventChannelAdmin::ProxyPushConsumer_var consumer_proxy_;
+ RtecEventChannelAdmin::ProxyPushSupplier_var supplier_proxy_;
+
+ RtecEventComm::EventSourceID supplier_id_;
+
+ char* rmt_ec_name_;
+ char* lcl_ec_name_;
+
+ int event_a_;
+ int event_b_;
+ int event_c_;
+
+ int interval_;
+};
+
+
+#endif /* EC_MULTIPLE_H */