Hello,

thanks, but I was in preparation to submit a superseded patch, which is
more intrusive to the class object system.

Bert

George Bosilca wrote:
> 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
> 
> 
> _______________________________________________
> devel mailing list
> de...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/devel

Reply via email to