summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h')
-rw-r--r--TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h182
1 files changed, 182 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h
new file mode 100644
index 00000000000..fa84ba336da
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/CosEvent/CEC_ProxyPullSupplier.h
@@ -0,0 +1,182 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file CEC_ProxyPullSupplier.h
+ *
+ * $Id$
+ *
+ * @author Carlos O'Ryan (coryan@cs.wustl.edu)
+ */
+//=============================================================================
+
+
+#ifndef TAO_CEC_PROXYPULLSUPPLIER_H
+#define TAO_CEC_PROXYPULLSUPPLIER_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/CosEventChannelAdminS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Message_Queue.h"
+#include "ace/Condition_Thread_Mutex.h"
+#include "ace/Unbounded_Queue.h"
+
+#include "orbsvcs/CosEvent/event_serv_export.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_CEC_EventChannel;
+class TAO_CEC_ProxyPullConsumer;
+
+/**
+ * @class TAO_CEC_ProxyPullSupplier
+ *
+ * @brief ProxyPullSupplier
+ *
+ * Implement the CosEventChannelAdmin::ProxyPullSupplier interface,
+ * remember that this class is used to communicate with a
+ * PullConsumer, so, in effect, this is the ambassador for a
+ * consumer inside the event channel.
+ * = MEMORY MANAGMENT
+ * It does not assume ownership of the TAO_CEC_Dispatching object.
+ * It makes a copy of the ConsumerQOS and the consumer object
+ * reference.
+ * = LOCKING
+ * Locking is strategized, the event channel acts as a factory for
+ * the locking strategies.
+ */
+class TAO_Event_Serv_Export TAO_CEC_ProxyPullSupplier : public POA_CosEventChannelAdmin::ProxyPullSupplier
+{
+public:
+ typedef CosEventChannelAdmin::ProxyPullSupplier_ptr _ptr_type;
+ typedef CosEventChannelAdmin::ProxyPullSupplier_var _var_type;
+
+ /// constructor...
+ TAO_CEC_ProxyPullSupplier (TAO_CEC_EventChannel* event_channel,
+ const ACE_Time_Value &timeout);
+
+ /// destructor...
+ virtual ~TAO_CEC_ProxyPullSupplier (void);
+
+ /// Activate in the POA
+ virtual void activate (
+ CosEventChannelAdmin::ProxyPullSupplier_ptr &activated_proxy
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Deactivate from the POA
+ virtual void deactivate (ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Return 0 if no consumer is connected...
+ CORBA::Boolean is_connected (void) const;
+
+ /**
+ * Return the consumer object reference. It returns nil() if it has
+ * not connected yet.
+ * NOTE: This method does not return a new reference!!! Doing so
+ * will increase the locking overhead on the critical path.
+ */
+ CosEventComm::PullConsumer_ptr consumer (void) const;
+
+ /// The event channel is shutting down
+ virtual void shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Invoke the _non_existent() pseudo-operation on the consumer. If
+ * it is disconnected then it returns true and sets the
+ * <disconnected> flag.
+ */
+ CORBA::Boolean consumer_non_existent (CORBA::Boolean_out disconnected
+ ACE_ENV_ARG_DECL);
+
+ /// Push an event into the queue.
+ void push (const CORBA::Any &event
+ ACE_ENV_ARG_DECL);
+
+ // = The CosEventChannelAdmin::ProxyPullSupplier methods...
+ virtual void connect_pull_consumer (
+ CosEventComm::PullConsumer_ptr pull_consumer
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ CosEventChannelAdmin::AlreadyConnected));
+ virtual CORBA::Any * pull (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected));
+ virtual CORBA::Any * try_pull (CORBA::Boolean_out has_event
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException,CosEventComm::Disconnected));
+ virtual void disconnect_pull_supplier (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ /// Increment and decrement the reference count.
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+ // = The Servant methods
+ virtual PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+protected:
+ /// Set the consumer, used by some implementations to change the
+ /// policies used when invoking operations on the consumer.
+ void consumer (CosEventComm::PullConsumer_ptr consumer);
+ void consumer_i (CosEventComm::PullConsumer_ptr consumer);
+
+ /// The private version (without locking) of is_connected().
+ CORBA::Boolean is_connected_i (void) const;
+
+ /// Release the child and the consumer
+ void cleanup_i (void);
+
+ /// Assigns the parameter to both consumer_ and nopolicy_consumer_, and
+ /// applies policies (when appropriate) to consumer_.
+ CosEventComm::PullConsumer_ptr apply_policy
+ (CosEventComm::PullConsumer_ptr c);
+
+private:
+ /// The Event Channel that owns this object.
+ TAO_CEC_EventChannel* event_channel_;
+
+ ACE_Time_Value timeout_;
+
+ /// The locking strategy.
+ ACE_Lock* lock_;
+
+ /// The reference count.
+ CORBA::ULong refcount_;
+
+ /// The consumer -- use apply_policy() instead of assigning directly to
+ /// consumer_. This will keep consumer_ and nopolicy_consumer_ in sync.
+ CosEventComm::PullConsumer_var consumer_;
+
+ /// The consumer without any policies applied
+ CosEventComm::PullConsumer_var nopolicy_consumer_;
+
+ /// If the flag is not zero then we are connected, notice that the
+ /// consumer can be nil.
+ int connected_;
+
+ /// Store the default POA.
+ PortableServer::POA_var default_POA_;
+
+ /// Use a message queue to pass the
+ TAO_SYNCH_MUTEX queue_lock_;
+ TAO_SYNCH_CONDITION wait_not_empty_;
+ ACE_Unbounded_Queue<CORBA::Any> queue_;
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "orbsvcs/CosEvent/CEC_ProxyPullSupplier.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_CEC_PROXYPULLSUPPLIER_H */