summaryrefslogtreecommitdiff
path: root/ace
diff options
context:
space:
mode:
authorlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-07-29 03:31:08 +0000
committerlevine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1997-07-29 03:31:08 +0000
commit9d8218d215479e86eb34278116a3fea4869d1784 (patch)
treea5946f0b8beef753e93a7a9247b0a3e02ce8039e /ace
parent25aa954eea3b2b057b6580869eb802f29263c51f (diff)
downloadATCD-9d8218d215479e86eb34278116a3fea4869d1784.tar.gz
(delete_at_exit,delete_array_at_exit): made these (inline) static functions, with return values.
Diffstat (limited to 'ace')
-rw-r--r--ace/Object_Manager.cpp53
-rw-r--r--ace/Object_Manager.h27
-rw-r--r--ace/Object_Manager.i16
3 files changed, 82 insertions, 14 deletions
diff --git a/ace/Object_Manager.cpp b/ace/Object_Manager.cpp
index a452fd3bc67..850875dfb1b 100644
--- a/ace/Object_Manager.cpp
+++ b/ace/Object_Manager.cpp
@@ -5,15 +5,19 @@
#include "ace/Object_Manager.h"
#include "ace/Service_Repository.h"
+#if !defined (__ACE_INLINE__)
+#include "ace/Object_Manager.i"
+#endif /* __ACE_INLINE__ */
+
ACE_Object_Manager *ACE_Object_Manager::instance_ = 0;
+
ACE_Object_Manager::ACE_Object_Manager ()
: registered_objects_ (),
registered_arrays_ ()
{
}
-
ACE_Object_Manager::~ACE_Object_Manager ()
{
void *p;
@@ -35,7 +39,6 @@ ACE_Object_Manager::~ACE_Object_Manager ()
ACE_Service_Config::close ();
}
-
ACE_Object_Manager *
ACE_Object_Manager::instance ()
{
@@ -50,18 +53,48 @@ ACE_Object_Manager::instance ()
return instance_;
}
-
-void
-ACE_Object_Manager::delete_at_exit (void *object)
+int
+ACE_Object_Manager::delete_at_exit_ (void *object)
{
- registered_objects_.enqueue_tail (object);
-}
+ // Check for already in queue, and return 1 if so.
+ ACE_Unbounded_Queue_Iterator<void *> i (registered_objects_);
+ void **obj;
+
+ while (i.next (obj))
+ {
+ i.advance ();
+ if (obj == object)
+ {
+ // The object has already been registered.
+ return 1;
+ }
+ }
+
+ // Returns -1 if unable to allocate storage.
+ return registered_objects_.enqueue_tail (object);
+}
-void
-ACE_Object_Manager::delete_array_at_exit (void *array)
+int
+ACE_Object_Manager::delete_array_at_exit_ (void *array)
{
- registered_arrays_.enqueue_tail (array);
+ // Check for already in queue, and return 1 if so.
+ ACE_Unbounded_Queue_Iterator<void *> i (registered_arrays_);
+ void **obj;
+
+ while (i.next (obj))
+ {
+ i.advance ();
+
+ if (obj == array)
+ {
+ // The array has already been registered.
+ return 1;
+ }
+ }
+
+ // Returns -1 if unable to allocate storage.
+ return registered_arrays_.enqueue_tail (array);
}
diff --git a/ace/Object_Manager.h b/ace/Object_Manager.h
index 9352123ee99..099e73a733e 100644
--- a/ace/Object_Manager.h
+++ b/ace/Object_Manager.h
@@ -35,18 +35,25 @@ class ACE_Export ACE_Object_Manager
// own cleanup.
// It would be worth adding a capability to do the shutdown prior to
// static object destruction, e.g., via an at_exit () call. Without
- // that capability, on VxWorks, for example, the program must be unloaded
- // for this to work.
+ // that capability, on VxWorks, for example, the program can be unloaded
+ // for this to work. (On VxWorks, alternatively, the explicity OS calls
+ // to call all static destructors and constructors could be used.)
{
public:
static ACE_Object_Manager *instance ();
// Accessor to singleton instance.
- void delete_at_exit (void *);
+ static int delete_at_exit (void *object);
// Register an object for deletion at program termination.
+ // Returns 0 on success, non-zero on failure: -1 if virtual
+ // memory is exhausted or 1 if the object had already been
+ // registered.
- void delete_array_at_exit (void *);
+ static int delete_array_at_exit (void *array);
// Register an array for deletion at program termination.
+ // Returns 0 on success, non-zero on failure: -1 if virtual
+ // memory is exhausted or 1 if the object had already been
+ // registered.
private:
static ACE_Object_Manager *instance_;
@@ -57,7 +64,19 @@ private:
ACE_Object_Manager ();
~ACE_Object_Manager ();
+ int delete_at_exit_ (void *);
+ // Register an object for deletion at program termination.
+ // See description of static version above for return values.
+
+ int delete_array_at_exit_ (void *);
+ // Register an array for deletion at program termination.
+ // See description of static version above for return values.
+
friend class ACE_Object_Manager_Destroyer;
};
+#if defined (__ACE_INLINE__)
+#include "ace/Object_Manager.i"
+#endif /* __ACE_INLINE__ */
+
#endif /* ACE_OBJECT_MANAGER_H */
diff --git a/ace/Object_Manager.i b/ace/Object_Manager.i
new file mode 100644
index 00000000000..de18c702d31
--- /dev/null
+++ b/ace/Object_Manager.i
@@ -0,0 +1,16 @@
+/* -*- C++ -*- */
+// $Id$
+
+ACE_INLINE
+int
+ACE_Object_Manager::delete_at_exit (void *object)
+{
+ return ACE_Object_Manager::instance ()->delete_at_exit_ (object);
+}
+
+ACE_INLINE
+int
+ACE_Object_Manager::delete_array_at_exit (void *array)
+{
+ return ACE_Object_Manager::instance ()->delete_array_at_exit_ (array);
+}