summaryrefslogtreecommitdiff
path: root/TAO/tao/TAO_Singleton_Manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/TAO_Singleton_Manager.h')
-rw-r--r--TAO/tao/TAO_Singleton_Manager.h188
1 files changed, 188 insertions, 0 deletions
diff --git a/TAO/tao/TAO_Singleton_Manager.h b/TAO/tao/TAO_Singleton_Manager.h
new file mode 100644
index 00000000000..97faf5dda2d
--- /dev/null
+++ b/TAO/tao/TAO_Singleton_Manager.h
@@ -0,0 +1,188 @@
+// -*- C++ -*-
+//
+// $Id$
+
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO
+//
+// = FILENAME
+// TAO_Singleton_Manager.h
+//
+// = DESCRIPTION
+// Header file for the TAO-specific Singleton Manager. Based
+// entirely on ace/Object_Manager.{h,i,cpp}.
+//
+// = AUTHOR
+// Ossama Othman <ossama@uci.edu>
+//
+// ============================================================================
+
+#ifndef TAO_OBJECT_MANAGER_H
+#define TAO_OBJECT_MANAGER_H
+
+#include "ace/pre.h"
+
+#include "tao/TAO_Export.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/OS.h"
+
+// Forward declarations
+class ACE_Recursive_Thread_Mutex;
+
+// Adapter for cleanup, used to register cleanup function with the
+// ACE_Object_Manager.
+extern "C"
+void
+TAO_Singleton_Manager_cleanup_destroyer (void *, void *);
+
+class TAO_Export TAO_Singleton_Manager : public ACE_Object_Manager_Base
+{
+ // = TITLE
+ // Manager for TAO library services and singleton cleanup.
+ //
+ // = DESCRIPTION
+ // The <TAO_Singleton_Manager> is basically simplified version of
+ // the ACE_Object_Manager. It is designed specifically to
+ // manage singletons created by TAO. For example, Singleton
+ // instances created by TAO will be automatically registered
+ // with the Singleton instance of this Singleton Manager.
+ //
+ // This class is necessary to ensure that TAO-specific
+ // Singletons are centrally isolated. The idea is that
+ // destruction of the instance of the <TAO_Singleton_Manager>
+ // triggers destruction of all objects/services registered with
+ // it.
+
+ friend void TAO_Singleton_Manager_cleanup_destroyer (void *, void *);
+
+public:
+ virtual int init (void);
+ // Explicitly initialize.
+
+ int init (int register_with_object_manager);
+ // Explicitly initialize the TAO_Singleton_Manager, in addition to
+ // explicitly registering (or not registering) with the
+ // ACE_Object_Manager.
+
+ virtual int fini (void);
+ // Explicitly destroy.
+
+ static int starting_up (void);
+ // Returns 1 before the <TAO_Singleton_Manager> has been
+ // constructed. See <ACE_Object_Manager::starting_up> for more
+ // information.
+
+ static int shutting_down (void);
+ // Returns 1 after the <TAO_Singleton_Manager> has been destroyed.
+ // See <ACE_Object_Manager::shutting_down> for more information.
+
+ enum Preallocated_Object
+ {
+# if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ // @@ No MT-specific preallocated objects (yet). Remove the
+ // below dummy enum once a preallocated object is added.
+ TAO_EMPTY_PREALLOCATED_OBJECT,
+# else
+ // Without ACE_MT_SAFE, There are no preallocated objects. Make
+ // sure that the preallocated_array size is at least one by
+ // declaring this dummy . . .
+ TAO_EMPTY_PREALLOCATED_OBJECT,
+# endif /* ACE_MT_SAFE */
+
+ TAO_PREALLOCATED_OBJECTS // This enum value must be last!
+ };
+ // Unique identifiers for preallocated objects.
+
+ static sigset_t *default_mask (void);
+ // Accesses a default signal set used, for example, in
+ // <ACE_Sig_Guard> methods.
+
+ static ACE_Thread_Hook *thread_hook (void);
+ // Returns the current thread hook for the process.
+
+ static ACE_Thread_Hook *thread_hook (ACE_Thread_Hook *new_thread_hook);
+ // Returns the existing thread hook and assign a <new_thread_hook>.
+
+ static TAO_Singleton_Manager *instance (void);
+ // Accessor to singleton instance.
+
+ static int at_exit (ACE_Cleanup *object, void *param = 0);
+ // Register an ACE_Cleanup object for cleanup at process
+ // termination. The object is deleted via the
+ // <ace_cleanup_destroyer>. If you need more flexiblity, see the
+ // <other at_exit> method below. For OS's that do not have
+ // processes, cleanup takes place at the end of <main>. Returns 0
+ // on success. On failure, returns -1 and sets errno to: EAGAIN if
+ // shutting down, ENOMEM if insufficient virtual memory, or EEXIST
+ // if the object (or array) had already been registered.
+
+ static int at_exit (void *object,
+ ACE_CLEANUP_FUNC cleanup_hook,
+ void *param);
+ // Register an object (or array) for cleanup at process termination.
+ // "cleanup_hook" points to a (global, or static member) function
+ // that is called for the object or array when it to be destroyed.
+ // It may perform any necessary cleanup specific for that object or
+ // its class. "param" is passed as the second parameter to the
+ // "cleanup_hook" function; the first parameter is the object (or
+ // array) to be destroyed. "cleanup_hook", for example, may delete
+ // the object (or array). For OS's that do not have processes, this
+ // function is the same as <at_thread_exit>. Returns 0 on success.
+ // On failure, returns -1 and sets errno to: EAGAIN if shutting
+ // down, ENOMEM if insufficient virtual memory, or EEXIST if the
+ // object (or array) had already been registered.
+
+private:
+ // Force allocation on the heap.
+ TAO_Singleton_Manager (void);
+ ~TAO_Singleton_Manager (void);
+
+ // Disallow copying by not implementing the following . . .
+ TAO_Singleton_Manager (const TAO_Singleton_Manager &);
+ TAO_Singleton_Manager &operator= (const TAO_Singleton_Manager &);
+
+ int at_exit_i (void *object, ACE_CLEANUP_FUNC cleanup_hook, void *param);
+ // Register an object or array for deletion at program termination.
+ // See description of static version above for return values.
+
+private:
+
+ static TAO_Singleton_Manager *instance_;
+ // Singleton instance pointer.
+
+ static void *preallocated_object[TAO_PREALLOCATED_OBJECTS];
+ // Table of preallocated objects.
+
+ sigset_t *default_mask_;
+ // Default signal set used, for example, in ACE_Sig_Guard.
+
+ ACE_Thread_Hook *thread_hook_;
+ // Thread hook that's used by this process.
+
+ ACE_OS_Exit_Info exit_info_;
+ // For at_exit support.
+
+ int registered_with_object_manager_;
+ // Indicates if TAO_Singleton_Manager is registered with the
+ // ACE_Object_Manager.
+
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ ACE_Recursive_Thread_Mutex *internal_lock_;
+ // Lock that is used to guard internal structures.
+#endif /* ACE_MT_SAFE */
+};
+
+#if defined (__ACE_INLINE__)
+# include "tao/TAO_Singleton_Manager.inl"
+#endif /* __ACE_INLINE__ */
+
+#include "ace/post.h"
+
+#endif /* TAO_OBJECT_MANAGER_H */