Bert,

Thanks for this patch. I apply it in the trunk as revision r13939. Thanks again.

  george.

On Mar 5, 2007, at 12:10 PM, Bert Wesarg wrote:

This saves some memory for the constructors and destructors arrays of a class by counting the constructors and destructors while we are counting the cls_depth. And the reversion of the constructor array can now be done
without an extra loop.

The patch is only compile tested.

Greetings

Bert Wesarg

Index: opal/class/opal_object.c
===================================================================
--- opal/class/opal_object.c    (revision 13923)
+++ opal/class/opal_object.c    (working copy)
@@ -71,7 +71,9 @@
 {
     opal_class_t *c;
     opal_construct_t* cls_construct_array;
-    opal_destruct_t* cls_destruct_array;
+    opal_destruct_t* cls_destruct_array;
+    int cls_construct_array_count;
+    int cls_destruct_array_count;
     int i;

     assert(cls);
@@ -95,33 +97,51 @@

     /*
      * First calculate depth of class hierarchy
+     * And the number of constructors and destructors
      */

     cls->cls_depth = 0;
+    cls_construct_array_count = 0;
+    cls_destruct_array_count  = 0;
     for (c = cls; c; c = c->cls_parent) {
-        cls->cls_depth += 1;
+        if( NULL != c->cls_construct ) {
+            cls_construct_array_count++;
+        }
+        if( NULL != c->cls_destruct ) {
+            cls_destruct_array_count++;
+        }
+        cls->cls_depth++;
     }

     /*
      * Allocate arrays for hierarchy of constructors and destructors
+     * plus for each a NULL-sentinel
      */

     cls->cls_construct_array =
-        (void (**)(opal_object_t*))malloc((cls->cls_depth + 1)*
- sizeof(opal_construct_t) * 2 ); + (void (**)(opal_object_t*))malloc ((cls_construct_array_count + + cls_destruct_array_count + 2) *
+                                          sizeof(opal_construct_t) );
     if (NULL == cls->cls_construct_array) {
         perror("Out of memory");
         exit(-1);
     }
- 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;
-
+    cls->cls_destruct_array =
+        cls->cls_construct_array + cls_construct_array_count + 1;
+
+    /*
+     * The constructor array is reversed, so start at the end
+     */
+
+ cls_construct_array = cls->cls_construct_array + cls_construct_array_count;
+    cls_destruct_array  = cls->cls_destruct_array;
+
     c = cls;
+ *cls_construct_array = NULL; /* end marker for the constructors */
     for (i = 0; i < cls->cls_depth; i++) {
         if( NULL != c->cls_construct ) {
+            --cls_construct_array;
             *cls_construct_array = c->cls_construct;
-            cls_construct_array++;
         }
         if( NULL != c->cls_destruct ) {
             *cls_destruct_array = c->cls_destruct;
@@ -129,16 +149,7 @@
         }
         c = c->cls_parent;
     }
- *cls_construct_array = NULL; /* end marker for the constructors */
     *cls_destruct_array = NULL;  /* end marker for the destructors */
-    /* Now we have to invert the constructors */
-    for( i = 0, --cls_construct_array;
-         cls_construct_array > (cls->cls_construct_array + i);
-         i++, cls_construct_array-- ) {
-        opal_construct_t temp_construct = *cls_construct_array;
-        *cls_construct_array = cls->cls_construct_array[i];
-        cls->cls_construct_array[i] = temp_construct;
-    }

     cls->cls_initialized = 1;
     save_class(cls);
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

"Half of what I say is meaningless; but I say it so that the other half may reach you"
                                  Kahlil Gibran


Reply via email to