summaryrefslogtreecommitdiff
path: root/ACE/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h')
-rw-r--r--ACE/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h99
1 files changed, 99 insertions, 0 deletions
diff --git a/ACE/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h b/ACE/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h
new file mode 100644
index 00000000000..6dc6c919a42
--- /dev/null
+++ b/ACE/TAO/orbsvcs/orbsvcs/Notify/Refcountable.h
@@ -0,0 +1,99 @@
+// -*- C++ -*-
+
+/**
+ * @file Refcountable.h
+ *
+ * $Id$
+ *
+ * @author Pradeep Gore <pradeep@oomworks.com>
+ */
+
+#ifndef TAO_Notify_REFCOUNTABLE_H
+#define TAO_Notify_REFCOUNTABLE_H
+
+#include /**/ "ace/pre.h"
+
+#include "orbsvcs/Notify/notify_serv_export.h"
+#include "orbsvcs/Notify/Refcountable_Guard_T.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orbconf.h"
+#include "tao/Basic_Types.h"
+#include "ace/Synch_Traits.h"
+#include "ace/Thread_Mutex.h"
+#include "ace/Atomic_Op.h"
+
+// Debugging macros
+#ifndef TAO_NOTIFY_REFCOUNT_DIAGNOSTICS
+#define TAO_NOTIFY_REFCOUNT_DIAGNOSTICS 0
+#endif
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+/**
+ * @class TAO_Notify_Refcountable
+ *
+ * @brief Thread-safe refounting, calls the <release> method when refcount falls to 0.
+ *
+ * The refcount is initialized to 0. When an instance of a
+ * derived class becomes owned by a managed pointer
+ * (Refcountable_Guard_T) the reference count becomes non-zero.
+ *
+ * Instances declared on the stack should always have a
+ * refcount of zero.
+ *
+ * A method that creates or simply returns an instance of
+ * Refcountable should not increment the reference count. It is
+ * the responsibility of the client to increment the reference
+ * count (take ownership or guard against deletion). The client
+ * cannot know if the method will or will not incr the refcount
+ * on its behalf.
+ *
+ * Use Refcountable_Guard_T or similar service to guarantee the
+ * exception safe direct pairing of increments and decrements. Avoid
+ * calling _incr_refcnt and _decr_refcnt.
+ */
+
+class TAO_Notify_Serv_Export TAO_Notify_Refcountable
+{
+public:
+ typedef TAO_Notify_Refcountable_Guard_T< TAO_Notify_Refcountable > Ptr;
+
+ /// Constructor
+ TAO_Notify_Refcountable (void);
+
+ /// Destructor
+ /// public for stack allocated instances
+ virtual ~TAO_Notify_Refcountable ();
+
+ /// This method sigantures deliberately match the RefCounting methods required for ESF Proxy
+ /// Public for bridge implementations and various guard classes
+ CORBA::ULong _incr_refcnt (void);
+ CORBA::ULong _decr_refcnt (void);
+
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+ static void diagnostic_dump( const char* title = 0 );
+#endif
+
+private:
+ /// The release method is called when the refcount reaches 0.
+ virtual void release (void) = 0;
+
+ /// Use a signed counter so that we can more easily detect
+ /// boundary conditions such as too many _decr_refcnt() calls.
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX, CORBA::Long> refcount_;
+
+#if ( TAO_NOTIFY_REFCOUNT_DIAGNOSTICS != 0 )
+ friend class TAO_Notify_Tracker;
+ int ref_id_;
+#endif
+};
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_Notify_REFCOUNTABLE_H */