summaryrefslogtreecommitdiff
path: root/apps/Gateway/Gateway/Event_Channel.h
blob: 4f739d1cd8b7d88fcfce7c4fa3426181d28d958e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* -*- C++ -*- */
// $Id$

// ============================================================================
//
// = LIBRARY
//    gateway
//
// = FILENAME
//    Event_Channel.h
//
// = AUTHOR
//    Doug Schmidt <schmidt@cs.wustl.edu>
//
// ============================================================================

#ifndef ACE_EVENT_CHANNEL
#define ACE_EVENT_CHANNEL

#include "Connection_Handler_Connector.h"
#include "Connection_Handler_Acceptor.h"
#include "Consumer_Dispatch_Set.h"
#include "Event_Forwarding_Discriminator.h"

typedef ACE_Null_Mutex MAP_MUTEX;

class ACE_Svc_Export Event_Channel : public ACE_Event_Handler
{
  // = TITLE
  //    Define a generic Event_Channel.
  //
  // = DESCRIPTION
  //    The inspiration for this class is derived from the CORBA COS
  //    Event Channel, though the design is simplified.
  //
  //    We inherit from <ACE_Event_Handler> so that we can be
  //    registered with an <ACE_Reactor> to handle timeouts.
public:
  // = Initialization and termination methods.
  Event_Channel (void);
  ~Event_Channel (void);

  virtual int open (void * = 0);
  // Open the channel.

  virtual int close (u_long = 0);
  // Close down the Channel.

  // = Proxy management methods.
  int initiate_connection_connection (Connection_Handler *, int sync_directly = 0);
  // Initiate the connection of the <Connection_Handler> to its peer.
  // Second paratemer is used for thread connection-handler which will
  // block the connecting procedure directly, need not care
  // Options::blocking_semantics().

  int complete_connection_connection (Connection_Handler *);
  // Complete the initialization of the <Connection_Handler> once it's
  // connected to its Peer.

  int reinitiate_connection_connection (Connection_Handler *);
  // Reinitiate a connection asynchronously when the Peer fails.
  int cancel_connection_connection (Connection_Handler *);
  // Cancel a asynchronous connection.

  int bind_proxy (Connection_Handler *);
  // Bind the <Connection_Handler> to the <connection_map_>.

  int find_proxy (ACE_INT32 connection_id,
                  Connection_Handler *&);
  // Locate the <Connection_Handler> with <connection_id>.

  int subscribe (const Event_Key &event_addr,
                 Consumer_Dispatch_Set *cds);
  // Subscribe the <Consumer_Dispatch_Set> to receive events that
  // match <Event_Key>.

  // = Event processing entry point.
  virtual int put (ACE_Message_Block *mb,
                   ACE_Time_Value * = 0);
  // Pass <mb> to the Event Channel so it can forward it to Consumers.

  void initiate_connector (void);
  // Actively initiate connections to the Peers.

  int initiate_acceptors (void);
  // Passively initiate the <Peer_Acceptor>s for Consumer and
  // Suppliers.

private:
  int parse_args (int argc, char *argv[]);
  // Parse the command-line arguments.

  // = Methods for handling events.
  void routing_event (Event_Key *event_key,
                    ACE_Message_Block *data);
  // Forwards the <data> to Consumer that have registered to receive
  // it, based on addressing information in the <event_key>.

  void subscription_event (ACE_Message_Block *data);
  // Add a Consumer subscription.

  int compute_performance_statistics (void);
  // Perform timer-based performance profiling.

  virtual int handle_timeout (const ACE_Time_Value &,
                              const void *arg);
  // Periodically callback to perform timer-based performance
  // profiling.

  Connection_Handler_Connector connector_;
  // Used to establish the connections actively.

  Connection_Handler_Acceptor supplier_acceptor_;
  // Used to establish connections passively and create Suppliers.

  Connection_Handler_Acceptor consumer_acceptor_;
  // Used to establish connections passively and create Consumers.

  // = Make life easier by defining typedefs.
  typedef ACE_Map_Manager<CONNECTION_ID, Connection_Handler *, MAP_MUTEX>
  CONNECTION_MAP;
  typedef ACE_Map_Iterator<CONNECTION_ID, Connection_Handler *, MAP_MUTEX>
  CONNECTION_MAP_ITERATOR;
  typedef ACE_Map_Entry<CONNECTION_ID, Connection_Handler *>
  CONNECTION_MAP_ENTRY;

  CONNECTION_MAP connection_map_;
  // Table that maps <CONNECTION_ID>s to <Connection_Handler> *'s.

  Event_Forwarding_Discriminator efd_;
  // Map that associates an event to a set of <Consumer_Handler> *'s.
};

#endif /* ACE_EVENT_CHANNEL */