Servant for CosEventChannelAdmin::EventChannel objects, also inherits from omni_thread. More...
#include <EventChannel.h>
Public Member Functions | |
CosEventChannelAdmin::ConsumerAdmin_ptr | for_consumers () |
CosEventChannelAdmin::SupplierAdmin_ptr | for_suppliers () |
void | destroy () |
CORBA::Boolean | is_alive () |
'ping' method inherited from FT::PullMonitorable. | |
EventChannel_i (EventChannelStore *store=NULL) | |
~EventChannel_i () | |
Cleans up the _poa, if this object is deleted before its thread starts. | |
void | activate (const char *channelName, const PersistNode *node=NULL) |
Creates the channel's POA, and any child objects. | |
void | start () |
Warn about interface change. | |
void * | run_undetached (void *) |
Entry point for the channel's thread. | |
void | mainLoop () |
The main loop for a channel. | |
void | _add_ref () |
void | _remove_ref () |
Shutdown the thread when refCount reaches zero. | |
void | output (ostream &os) |
ConsumerAdmin_i & | consumerAdmin () const |
const PersistNode & | properties () const |
CORBA::ULong | pullRetryPeriod_ms () const |
CORBA::ULong | maxQueueLength () const |
CORBA::ULong | maxNumProxies () const |
unsigned long | cyclePeriod_ns () const |
Private Member Functions | |
void | setInsName (const string v) |
Construct a new Mapper object, and registers it in the INSPOA. | |
void | createPoa (const char *channelName) |
Constructs the main POA for this channel. | |
Private Attributes | |
EventChannelStore * | _eventChannelStore |
SupplierAdmin_i * | _supplierAdmin |
ConsumerAdmin_i * | _consumerAdmin |
PortableServer::POAManager_var | _poaManager |
bool | _shutdownRequested |
PersistNode | _properties |
Mapper * | _mapper |
omni_mutex | _lock |
int | _refCount |
Servant for CosEventChannelAdmin::EventChannel objects, also inherits from omni_thread.
Each EventChannel contains five POAs, one for each of the proxy types, and one for the XXXAdmins and EventChannel itself. This POA also contains the ProxyManager objects that are used to manage three of the four proxy object types.
Here's a summary of the POAs, and their contents:
+-POA: EventChannel-----------------------------------------------+ | | | Obj: EventChannel_i | | | | Obj: SupplierAdmin_i Obj: ConsumerAdmin_i | | | | Obj: ProxyPushSupplierManager | | | | +-POA: ProxyPushConsumer---+ +-POA: ProxyPushSupplier---+ | | | | | | | | | Obj: ProxyPushConsumer_i | | Obj: ProxyPushSupplier_i | | | | (DEFAULT SERVANT) | | Obj: ProxyPushSupplier_i | | | | | | Obj: ProxyPushSupplier_i | | | | | | . | | | | | | . | | | | | | . | | | | | | | | | +--------------------------+ +--------------------------+ | | | | Obj: ProxyPullConsumerManager Obj: ProxyPullSupplierManager | | | | +-POA: ProxyPullConsumer---+ +-POA: ProxyPullSupplier---+ | | | | | | | | | Obj: ProxyPullConsumer_i | | Obj: ProxyPullSupplier_i | | | | Obj: ProxyPullConsumer_i | | Obj: ProxyPullSupplier_i | | | | Obj: ProxyPullConsumer_i | | Obj: ProxyPullSupplier_i | | | | . | | . | | | | . | | . | | | | . | | . | | | | | | | | | +--------------------------+ +--------------------------+ | | | +-----------------------------------------------------------------+
All five POAs are single threaded, and managed by the same POAmanager. This enables the top level event loop (EventChannel::run()) to hold all incoming calls while it passes events from the ProxyConsumers over to the ProxySuppliers. This single threaded model simplifies[*] the implementation and avoids all of the locking overheads of a multi-threaded solution.
[*] That's the theory anyway... Actually the single threaded model complicates the underlying implementation, because omniORB treats single threaded POAs as a special case on top of multi-threaded ones, rather than the other way round! Ironic!
Definition at line 111 of file EventChannel.h.
OmniEvents::EventChannel_i::EventChannel_i | ( | EventChannelStore * | store = NULL |
) |
Definition at line 65 of file EventChannel.cc.
OmniEvents::EventChannel_i::~EventChannel_i | ( | ) |
Cleans up the _poa, if this object is deleted before its thread starts.
Definition at line 123 of file EventChannel.cc.
void OmniEvents::EventChannel_i::_add_ref | ( | ) |
Definition at line 244 of file EventChannel.cc.
void OmniEvents::EventChannel_i::_remove_ref | ( | ) |
Shutdown the thread when refCount reaches zero.
Definition at line 254 of file EventChannel.cc.
void OmniEvents::EventChannel_i::activate | ( | const char * | channelName, | |
const PersistNode * | node = NULL | |||
) |
Creates the channel's POA, and any child objects.
Must to be called just after construction, and before start()/run().
Definition at line 79 of file EventChannel.cc.
Referenced by OmniEvents::EventChannelFactory_i::EventChannelFactory_i(), and main().
ConsumerAdmin_i& OmniEvents::EventChannel_i::consumerAdmin | ( | ) | const [inline] |
Definition at line 168 of file EventChannel.h.
References _consumerAdmin.
Referenced by OmniEvents::SupplierAdmin_i::SupplierAdmin_i().
void OmniEvents::EventChannel_i::createPoa | ( | const char * | channelName | ) | [private] |
Constructs the main POA for this channel.
Policies are: PERSISTENT, USER_ID, SINGLE_THREAD_MODEL. POA name is set to channelName.
Definition at line 318 of file EventChannel.cc.
unsigned long OmniEvents::EventChannel_i::cyclePeriod_ns | ( | ) | const [inline] |
Definition at line 181 of file EventChannel.h.
References _properties, OmniEvents::PersistNode::attrLong(), and CYCLE_PERIOD_NS.
Referenced by OmniEvents::SupplierAdmin_i::SupplierAdmin_i().
void OmniEvents::EventChannel_i::destroy | ( | ) |
Definition at line 47 of file EventChannel.cc.
CosEventChannelAdmin::ConsumerAdmin_ptr OmniEvents::EventChannel_i::for_consumers | ( | ) |
Definition at line 31 of file EventChannel.cc.
References _consumerAdmin, and _shutdownRequested.
CosEventChannelAdmin::SupplierAdmin_ptr OmniEvents::EventChannel_i::for_suppliers | ( | ) |
Definition at line 39 of file EventChannel.cc.
CORBA::Boolean OmniEvents::EventChannel_i::is_alive | ( | ) | [inline] |
'ping' method inherited from FT::PullMonitorable.
Definition at line 121 of file EventChannel.h.
void OmniEvents::EventChannel_i::mainLoop | ( | ) |
The main loop for a channel.
Work is strictly separated into two phases. Most of the time, all of the POAs are active, and receiving incoming calls. Periodically, incoming calls are held and the channel collects new events from the consumers and sends them to the suppliers.
Incoming call handlers are all designed to complete in the absolute minimum time. This enables the POAs to be single threaded, and to hold incoming calls without having to wait a long time for ongoing invokations to complete. Sadly, it's not possible to implement ProxyPullSupplier::pull() 'properly' without blocking, so our version just raises TRANSIENT if there is no event immediately available.
Outgoing calls are always sent as deferred requests, to avoid blocking while we wait for them to return.
Definition at line 217 of file EventChannel.cc.
CORBA::ULong OmniEvents::EventChannel_i::maxNumProxies | ( | ) | const [inline] |
Definition at line 179 of file EventChannel.h.
References _properties, OmniEvents::PersistNode::attrLong(), and MAX_NUM_PROXIES.
Referenced by OmniEvents::ProxyPullSupplierManager::incarnate().
CORBA::ULong OmniEvents::EventChannel_i::maxQueueLength | ( | ) | const [inline] |
Definition at line 177 of file EventChannel.h.
References _properties, OmniEvents::PersistNode::attrLong(), and MAX_QUEUE_LENGTH.
void OmniEvents::EventChannel_i::output | ( | ostream & | os | ) |
Definition at line 277 of file EventChannel.cc.
References _consumerAdmin, OmniEvents::Servant::_poa, _properties, _supplierAdmin, OmniEvents::SupplierAdmin_i::output(), and OmniEvents::PersistNode::output().
const PersistNode& OmniEvents::EventChannel_i::properties | ( | ) | const [inline] |
Definition at line 170 of file EventChannel.h.
References _properties.
CORBA::ULong OmniEvents::EventChannel_i::pullRetryPeriod_ms | ( | ) | const [inline] |
Definition at line 175 of file EventChannel.h.
References _properties, OmniEvents::PersistNode::attrLong(), and PULL_RETRY_PERIOD_MS.
Referenced by OmniEvents::SupplierAdmin_i::SupplierAdmin_i().
void * OmniEvents::EventChannel_i::run_undetached | ( | void * | ) |
Entry point for the channel's thread.
Calls mainLoop() and waits for it to exit. Handles any exceptions, and shuts down the channel once the main loop has finished.
Definition at line 149 of file EventChannel.cc.
void OmniEvents::EventChannel_i::setInsName | ( | const string | v | ) | [private] |
Construct a new Mapper object, and registers it in the INSPOA.
Definition at line 289 of file EventChannel.cc.
void OmniEvents::EventChannel_i::start | ( | ) | [inline] |
Definition at line 198 of file EventChannel.h.
Referenced by consumerAdmin(), for_consumers(), and output().
Definition at line 196 of file EventChannel.h.
omni_mutex OmniEvents::EventChannel_i::_lock [private] |
Definition at line 203 of file EventChannel.h.
Mapper* OmniEvents::EventChannel_i::_mapper [private] |
Definition at line 202 of file EventChannel.h.
PortableServer::POAManager_var OmniEvents::EventChannel_i::_poaManager [private] |
Definition at line 199 of file EventChannel.h.
Definition at line 201 of file EventChannel.h.
Referenced by cyclePeriod_ns(), maxNumProxies(), maxQueueLength(), output(), properties(), and pullRetryPeriod_ms().
int OmniEvents::EventChannel_i::_refCount [private] |
Definition at line 204 of file EventChannel.h.
bool OmniEvents::EventChannel_i::_shutdownRequested [private] |
Definition at line 200 of file EventChannel.h.
Referenced by for_consumers().
Definition at line 197 of file EventChannel.h.
Referenced by output().