https://github.com/Unipisa/CMM
Tip revision: c0f12bb6f3ea8f1350371695b42990a5c2eb93f2 authored by Giuseppe Attardi on 02 March 1998, 23:00:00 UTC
1.9 -
1.9 -
Tip revision: c0f12bb
test4.cpp
/* The following program tests the expansion capabilities of the garbage
collector during collection.
*/
/* Externals */
#include <stdio.h>
#include <stdlib.h>
#include "cmm.h"
/* Define two types of cells, big_cell and little_cell. Sizes are chosen so
that one big_cell and one little_cell can be allocated out of the same
page, but two big_cell's can't be.
*/
struct big_cell : public CmmObject {
big_cell *car;
big_cell *cdr;
int value;
int pad[67];
big_cell();
void traverse();
};
void big_cell::traverse()
{
CmmHeap *heap = Cmm::heap;
heap->scavenge((CmmObject **)&car);
heap->scavenge((CmmObject **)&cdr);
}
big_cell::big_cell()
{
car = cdr = 0;
}
typedef big_cell* bp;
struct little_cell : public CmmObject {
little_cell *car;
little_cell *cdr;
int value;
int pad[47];
little_cell();
void traverse();
};
void little_cell::traverse()
{
CmmHeap *heap = Cmm::heap;
heap->scavenge((CmmObject **)&car);
heap->scavenge((CmmObject **)&cdr);
}
little_cell::little_cell()
{
car = cdr = 0;
}
typedef little_cell* lp;
Cmm dummy(CMM_MINHEAP, CMM_MAXHEAP, CMM_INCHEAP, 50, 45,
CMM_GCTHRESHOLD, CMM_FLAGS, 0);
void
main()
{
bp bl = 0, b1, b2;
lp ll = 0, l1, l2;
int i;
for (i = 1; i <= 7000; i++) {
if (i % 700 == 0)
{ printf("."); fflush(stdout); }
b1 = new big_cell;
l1 = new little_cell;
b2 = new big_cell;
l2 = new little_cell;
b1->car = b2;
b1->cdr = bl;
b1->value = b2->value = i;
bl = b1;
l1->car = l2;
l1->cdr = ll;
l1->value = l2->value = i;
ll = l1;
}
printf("\n");
for (i = 7000; i >= 1; i--) {
if (i % 700 == 0)
{ printf("."); fflush(stdout); }
if (bl->value != i || ll->value != i) {
fprintf(stderr, "Inconsistent list\n");
abort();
}
bl = bl->cdr;
ll = ll->cdr;
}
printf("\n");
}