Files
FAT-Allocator/allocator/freelist/binary_trees.c

119 lines
2.8 KiB
C

/* The Computer Language Benchmarks Game
* https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
contributed by Kevin Carson
compilation:
gcc -O3 -fomit-frame-pointer -funroll-loops -static binary-trees.c -lm
icc -O3 -ip -unroll -static binary-trees.c -lm
*reset*
*/
/* modified by @jsinger for CHERI example allocators */
#include "freelist_allocator.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct tn
{
struct tn *left;
struct tn *right;
} treeNode;
treeNode *NewTreeNode(treeNode *left, treeNode *right)
{
treeNode *new;
new = (treeNode *) alloc(sizeof(treeNode));
new->left = left;
new->right = right;
return new;
} /* NewTreeNode() */
long ItemCheck(treeNode *tree)
{
if (tree->left == NULL)
return 1;
else
return 1 + ItemCheck(tree->left) + ItemCheck(tree->right);
} /* ItemCheck() */
treeNode *BottomUpTree(unsigned depth)
{
if (depth > 0)
return NewTreeNode(BottomUpTree(depth - 1), BottomUpTree(depth - 1));
else
return NewTreeNode(NULL, NULL);
} /* BottomUpTree() */
void DeleteTree(treeNode *tree)
{
if (tree->left != NULL)
{
DeleteTree(tree->left);
DeleteTree(tree->right);
}
dealloc(tree);
} /* DeleteTree() */
int main(int argc, char *argv[])
{
unsigned N, depth, minDepth, maxDepth, stretchDepth;
treeNode *stretchTree, *longLivedTree, *tempTree;
unsigned pages; /* mem required */
N = (argc > 1) ? atol(argv[1]) : 0;
minDepth = 4;
if ((minDepth + 2) > N)
maxDepth = minDepth + 2;
else
maxDepth = N;
stretchDepth = maxDepth + 1;
/* calculate mem requirements, with allocator-specific
* size-class assumptions
*/
pages = ((2 << (stretchDepth + 3)) * sizeof(treeNode)) / BYTES_IN_PAGE;
printf("treenode size is %u bytes\n", (unsigned int) sizeof(treeNode));
printf("we need %u pages\n", pages);
/* allocate memory pool */
initialize(pages);
/* start creating tree data structures */
stretchTree = BottomUpTree(stretchDepth);
printf("stretch tree of depth %u\t check: %li\n", stretchDepth, ItemCheck(stretchTree));
DeleteTree(stretchTree);
longLivedTree = BottomUpTree(maxDepth);
for (depth = minDepth; depth <= maxDepth; depth += 2)
{
long i, iterations, check;
iterations = pow(2, maxDepth - depth + minDepth);
check = 0;
for (i = 1; i <= iterations; i++)
{
tempTree = BottomUpTree(depth);
check += ItemCheck(tempTree);
DeleteTree(tempTree);
} /* for(i = 1...) */
printf("%li\t trees of depth %u\t check: %li\n", iterations, depth, check);
} /* for(depth = minDepth...) */
printf("long lived tree of depth %u\t check: %li\n", maxDepth, ItemCheck(longLivedTree));
return 0;
} /* main() */