int mempool_init(MemPool *mempool, PoolCount num_objects, size_t obj_size) { PoolCount i; if(mempool == NULL) return 1; if(num_objects < 1) return 1; if(obj_size < 1) return 1; mempool->obj_size = obj_size; /* this is the basis pool that represents all the *data pointers in the list */ mempool->datapool = calloc(num_objects, obj_size); if(mempool->datapool == NULL) return 1; mempool->listpool = calloc(num_objects, sizeof(SDListItem)); if(mempool->listpool == NULL) { /* well, that sucked, lets clean up */ ErrorMessage("%s(%d) mempool_init(): listpool is null\n", __FILE__, __LINE__); mempool_free_pools(mempool); return 1; } mempool->bucketpool = calloc(num_objects, sizeof(MemBucket)); if(mempool->bucketpool == NULL) { ErrorMessage("%s(%d) mempool_init(): bucketpool is null\n", __FILE__, __LINE__); mempool_free_pools(mempool); return 1; } /* sets up the 2 memory lists */ if(sf_sdlist_init(&mempool->used_list, NULL)) { ErrorMessage("%s(%d) mempool_init(): Failed to initialize used list\n", __FILE__, __LINE__); mempool_free_pools(mempool); return 1; } if(sf_sdlist_init(&mempool->free_list, NULL)) { ErrorMessage("%s(%d) mempool_init(): Failed to initialize free list\n", __FILE__, __LINE__); mempool_free_pools(mempool); return 1; } for(i=0; i<num_objects; i++) { SDListItem *itemp; MemBucket *bp; bp = &mempool->bucketpool[i]; itemp = &mempool->listpool[i]; /* each bucket knows where it resides in the list */ bp->key = itemp; #ifdef TEST_MEMPOOL printf("listpool: %p itemp: %p diff: %u\n", mempool->listpool, itemp, (((char *) itemp) - ((char *) mempool->listpool))); #endif bp->data = ((char *) mempool->datapool) + (i * mempool->obj_size); #ifdef TEST_MEMPOOL printf("datapool: %p bp.data: %p diff: %u\n", mempool->datapool, mempool->datapool + (i * mempool->obj_size), (((char *) bp->data) - ((char *) mempool->datapool))); #endif if(sf_sdlist_append(&mempool->free_list, &mempool->bucketpool[i], &mempool->listpool[i])) { ErrorMessage("%s(%d) mempool_init(): Failed to add to free list\n", __FILE__, __LINE__); mempool_free_pools(mempool); return 1; } mempool->total++; } return 0; }
int mempool_init(MemPool *mempool, PoolCount num_objects, size_t obj_size) { PoolCount i; if(mempool == NULL) return 1; if(num_objects < 1) return 1; if(obj_size < 1) return 1; mempool->obj_size = obj_size; /* this is the basis pool that represents all the *data pointers in the list */ mempool->datapool = calloc(num_objects, obj_size); if(mempool->datapool == NULL) { return 1; } mempool->listpool = calloc(num_objects, sizeof(SDListItem)); if(mempool->listpool == NULL) { /* well, that sucked, lets clean up */ fprintf(stderr, "mempool: listpool is null\n"); free(mempool->datapool); return 1; } mempool->bucketpool = calloc(num_objects, sizeof(MemBucket)); if(mempool->bucketpool == NULL) { fprintf(stderr, "mempool: bucketpool is null\n"); free(mempool->datapool); free(mempool->listpool); return 1; } /* sets up the 2 memory lists */ if(sf_sdlist_init(&mempool->used_list, NULL)) { fprintf(stderr, "mempool: used_list failed\n"); free(mempool->datapool); free(mempool->listpool); free(mempool->bucketpool); return 1; } if(sf_sdlist_init(&mempool->free_list, NULL)) { fprintf(stderr, "mempool: free_list failed\n"); free(mempool->datapool); free(mempool->listpool); free(mempool->bucketpool); return 1; } for(i=0; i<num_objects; i++) { SDListItem *itemp; MemBucket *bp; bp = &mempool->bucketpool[i]; itemp = &mempool->listpool[i]; /* each bucket knows where it resides in the list */ bp->key = itemp; #ifdef TEST_MEMPOOL printf("listpool: %p itemp: %p diff: %u\n", mempool->listpool, itemp, (((char *) itemp) - ((char *) mempool->listpool))); #endif /* TEST_MEMPOOL */ bp->data = ((char *) mempool->datapool) + (i * mempool->obj_size); #ifdef TEST_MEMPOOL printf("datapool: %p bp.data: %p diff: %u\n", mempool->datapool, mempool->datapool + (i * mempool->obj_size), (((char *) bp->data) - ((char *) mempool->datapool))); #endif /* TEST_MEMPOOL */ if(sf_sdlist_append(&mempool->free_list, &mempool->bucketpool[i], &mempool->listpool[i])) { fprintf(stderr, "mempool: free_list_append failed\n"); free(mempool->datapool); free(mempool->listpool); free(mempool->bucketpool); return 1; } mempool->free++; } mempool->used = 0; mempool->total = num_objects; return 0; }