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; - } -} -