This replaces the classes array (which holds all ctor/dtor arrays) with a
linked list.

This patch is compile tested only.

Greetings
Bert Wesarg
Index: opal/class/opal_object.c
===================================================================
--- opal/class/opal_object.c	(revision 13923)
+++ opal/class/opal_object.c	(working copy)
@@ -51,17 +51,12 @@
  * Local variables
  */
 static opal_atomic_lock_t class_lock = { { OPAL_ATOMIC_UNLOCKED } };
-static void** classes = NULL;
-static int num_classes = 0;
-static int max_classes = 0;
-static const int increment = 10;
+static void *classes;

-
 /*
  * Local functions
  */
 static void save_class(opal_class_t *cls);
-static void expand_array(void);


 /*
@@ -72,6 +67,7 @@
     opal_class_t *c;
     opal_construct_t* cls_construct_array;
     opal_destruct_t* cls_destruct_array; 
+    void *base_pointer;
     int i;

     assert(cls);
@@ -104,15 +100,18 @@

     /*
      * Allocate arrays for hierarchy of constructors and destructors
+     * Plus one void pointer for the classes list
      */

-    cls->cls_construct_array = 
-        (void (**)(opal_object_t*))malloc((cls->cls_depth + 1)*
-                                          sizeof(opal_construct_t) * 2 );
-    if (NULL == cls->cls_construct_array) {
+    base_pointer = malloc((cls->cls_depth + 1) * sizeof(opal_construct_t) * 2 +
+                          sizeof(void *));
+    if (NULL == base_pointer) {
         perror("Out of memory");
         exit(-1);
     }
+    /* The arrays begin behind the void pointer */
+    cls->cls_destruct_array =
+        (void (**)(opal_object_t*))((char *)base_pointer + sizeof(void *));
     cls->cls_destruct_array = cls->cls_construct_array + cls->cls_depth + 1;
     cls_construct_array = cls->cls_construct_array;
     cls_destruct_array  = cls->cls_destruct_array; 
@@ -154,18 +153,10 @@
  */
 int opal_class_finalize(void)
 {
-    int i;
-
-    if (NULL != classes) {
-        for (i = 0; i < num_classes; ++i) {
-            if (NULL != classes[i]) {
-                free(classes[i]);
-            }
-        }
+    while (NULL != classes) {
+        void *next = *(void **)classes;
         free(classes);
-        classes = NULL;
-        num_classes = 0;
-        max_classes = 0;
+        classes = next;
     }

     return OPAL_SUCCESS;
@@ -174,27 +165,7 @@

 static void save_class(opal_class_t *cls)
 {
-    if (num_classes >= max_classes) {
-        expand_array();
-    }
-
-    classes[num_classes] = cls->cls_construct_array;
-    ++num_classes;
+    void *base_pointer = (char *)cls->cls_construct_array - sizeof(void *);
+    *(void **)base_pointer = classes;
+    classes = base_pointer;
 }
-
-
-static void expand_array(void)
-{
-    int i;
-
-    max_classes += increment;
-    classes = (void**)realloc(classes, sizeof(void *) * max_classes);
-    if (NULL == classes) {
-        perror("class malloc failed");
-        exit(-1);
-    }
-    for (i = num_classes; i < max_classes; ++i) {
-        classes[i] = NULL;
-    }
-}
-

Reply via email to