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