summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/PortableServer/Servant_Base.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/PortableServer/Servant_Base.h')
-rw-r--r--trunk/TAO/tao/PortableServer/Servant_Base.h196
1 files changed, 196 insertions, 0 deletions
diff --git a/trunk/TAO/tao/PortableServer/Servant_Base.h b/trunk/TAO/tao/PortableServer/Servant_Base.h
new file mode 100644
index 00000000000..9dedba87c90
--- /dev/null
+++ b/trunk/TAO/tao/PortableServer/Servant_Base.h
@@ -0,0 +1,196 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Servant_Base.h
+ *
+ * $Id$
+ *
+ * @author Irfan Pyarali <irfan@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef TAO_SERVANT_BASE_H
+#define TAO_SERVANT_BASE_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/PortableServer/portableserver_export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/PS_ForwardC.h"
+#include "tao/PortableServer/Servant_var.h"
+#include "tao/Abstract_Servant_Base.h"
+#include "ace/Atomic_Op.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class TAO_Operation_Table;
+
+/**
+ * @class TAO_ServantBase
+ *
+ * @brief Base class for skeletons and servants.
+ *
+ * The POA spec requires that all servants inherit from this class'
+ * base class.
+ *
+ * An instance of a servant class derived from
+ * ServantBase initially has a reference count of
+ * one. Invoking _add_ref on the servant instance increases its
+ * reference count by one. Invoking _remove_ref on the servant
+ * instance decreases its reference count by one; if the
+ * resulting reference count equals zero, _remove_ref invokes
+ * delete on its this pointer in order to destroy the
+ * servant. For ORBs that operate in multi-threaded
+ * environments, the implementations of _add_ref and _remove_ref
+ * that the ServantBase class provides shall be
+ * thread-safe.
+ *
+ * Like ServantBase supports copy
+ * construction and the default assignment operation. Copy
+ * construction always sets the reference count of the new
+ * servant instance to one. The default assignment
+ * implementation merely returns *this and does not affect the
+ * reference count.
+ *
+ */
+class TAO_PortableServer_Export TAO_ServantBase
+ : public virtual TAO_Abstract_ServantBase
+{
+public:
+
+ /// Destructor.
+ virtual ~TAO_ServantBase (void);
+
+ /// Returns the default POA for this servant.
+ virtual PortableServer::POA_ptr _default_POA (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Local implementation of the CORBA::Object::_is_a method.
+ virtual CORBA::Boolean _is_a (const char *logical_type_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Default _non_existent: always returns false.
+ virtual CORBA::Boolean _non_existent (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Query the Interface Repository for the interface definition.
+ virtual CORBA::InterfaceDef_ptr _get_interface (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Default _get_component: always returns CORBA::Object::_nil().
+ virtual CORBA::Object_ptr _get_component (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// Get the repository id.
+ virtual char * _repository_id (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /// This is an auxiliary method for _this() and _narrow().
+ virtual TAO_Stub *_create_stub (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Dispatches a request to the object: find the operation, cast the
+ * type to the most derived type, demarshall all the parameters from
+ * the request and finally invokes the operation, storing the
+ * results and out parameters (if any) or the exceptions thrown into
+ * @a request.
+ */
+ virtual void _dispatch (TAO_ServerRequest &request,
+ void *servant_upcall
+ ACE_ENV_ARG_DECL) = 0;
+
+ /// Please see documentation in tao/Abstract_Servant_Base.h for
+ /// details.
+ virtual int _find (const char *opname,
+ TAO_Skeleton &skelfunc,
+ const size_t length = 0);
+
+ virtual int _find (const char *opname,
+ TAO_Collocated_Skeleton &skelfunc,
+ TAO::Collocation_Strategy st,
+ const size_t length = 0);
+
+ /// Get this interface's repository id (TAO specific).
+ virtual const char *_interface_repository_id (void) const = 0;
+
+ //@{
+ /**
+ * @name Reference Counting Operations
+ */
+ /// Increase reference count by one.
+ virtual void _add_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Decreases reference count by one; if the resulting reference
+ * count equals zero, _remove_ref invokes delete on its this pointer
+ * in order to destroy the servant.
+ */
+ virtual void _remove_ref (ACE_ENV_SINGLE_ARG_DECL);
+
+ /**
+ * Returns the current reference count value.
+ */
+ virtual CORBA::ULong _refcount_value (ACE_ENV_SINGLE_ARG_DECL) const;
+ //@}
+
+protected:
+
+ /// Default constructor, only derived classes can be created.
+ TAO_ServantBase (void);
+
+ /// Copy constructor, protected so no instances can be created.
+ TAO_ServantBase (const TAO_ServantBase &);
+
+ /// Assignment operator.
+ TAO_ServantBase &operator= (const TAO_ServantBase &);
+
+ virtual void synchronous_upcall_dispatch (TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * derived_this
+ ACE_ENV_ARG_DECL);
+
+ virtual void asynchronous_upcall_dispatch (TAO_ServerRequest & req,
+ void * servant_upcall,
+ void * derived_this
+ ACE_ENV_ARG_DECL);
+
+protected:
+ /// Reference counter.
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX, long> ref_count_;
+
+ /// The operation table for this servant. It is initialized by the
+ /// most derived class.
+ TAO_Operation_Table * optable_;
+};
+
+class TAO_PortableServer_Export TAO_Servant_Hash
+{
+public:
+ /// Returns hash value.
+ u_long operator () (PortableServer::Servant servant) const;
+};
+
+namespace PortableServer
+{
+ typedef Servant_var<TAO_ServantBase> ServantBase_var;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "tao/PortableServer/Servant_Base.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_SERVANT_BASE_H */