2023-03-26 19:15:17 +08:00

158 lines
4.0 KiB
C

#include "test.h"
#include "../src/allocate.h"
#include "../src/error.h"
#include "../src/resources.h"
static void
test_arena_basic (void)
{
assert (sizeof (word) == sizeof (void *));
assert (kissat_aligned_word (sizeof (word)));
assert (kissat_aligned_pointer (0));
DECLARE_AND_INIT_SOLVER (solver);
unsigned size = 3;
while (size < 20)
kissat_allocate_clause (solver, size++);
while (size <= (1u << 23))
kissat_allocate_clause (solver, size *= 2);
const int n = tissat_big ? 407 : 10;
for (int i = 0; i < n; i++)
{
printf ("iteration %d\n", i);
(void) kissat_allocate_clause (solver, size);
}
RELEASE_STACK (solver->arena);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
#endif
}
static void
test_arena_realloc (void)
{
format format;
memset (&format, 0, sizeof format);
DECLARE_AND_INIT_SOLVER (solver);
#ifndef QUIET
const char *formatted =
kissat_format_bytes (&format, kissat_maximum_resident_set_size ());
printf ("before allocating arena %s\n", formatted);
#endif
const unsigned bytes = (1u << 22);
const unsigned size = bytes / 4 - 3;
const unsigned n = tissat_big ? (1u << 8) : (1u << 3);
for (unsigned i = 0; i < n; i++)
{
reference ref = kissat_allocate_clause (solver, size);
clause *c = kissat_unchecked_dereference_clause (solver, ref);
c->size = size;
c->shrunken = false;
for (unsigned i = 0; i < size; i++)
c->lits[i] = 42;
#ifndef QUIET
formatted = kissat_format_bytes (&format,
kissat_maximum_resident_set_size ());
printf ("after allocated %u size %u clause %s\n",
i + 1, size, formatted);
#endif
}
#ifndef NMETRICS
assert (solver->statistics.allocated_current == n * bytes);
#endif
unsigned count = 0;
for (all_clauses (c))
count++;
assert (count == n);
RELEASE_STACK (solver->arena);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
#endif
}
static void
test_arena_traverse (void)
{
DECLARE_AND_INIT_SOLVER (solver);
const unsigned n = 1000;
for (unsigned size = 3; size < n + 3; size++)
{
reference ref = kissat_allocate_clause (solver, size);
clause *c = kissat_unchecked_dereference_clause (solver, ref);
c->size = size;
c->shrunken = false;
for (unsigned i = 0; i < size; i++)
c->lits[i] = size;
}
unsigned found = 0, size = 3;
for (all_clauses (c))
{
found++;
assert (c->size == size);
assert (!c->shrunken);
assert (c->lits[0] == size);
size++;
}
assert (found == n);
RELEASE_STACK (solver->arena);
#ifndef NMETRICS
assert (!solver->statistics.allocated_current);
#endif
}
#include <setjmp.h>
static jmp_buf jump_buffer;
static void
abort_call_back (void)
{
longjmp (jump_buffer, 42);
}
static void
test_arena_fatal (void)
{
kissat_call_function_instead_of_abort (abort_call_back);
int val = setjmp (jump_buffer);
if (val)
{
kissat_call_function_instead_of_abort (0);
if (val != 42)
FATAL ("expected '42' as result from 'setjmp'");
}
else
{
{
DECLARE_AND_INIT_SOLVER (solver);
arena *arena = &solver->arena;;
arena->end = arena->begin + MAX_ARENA - 1;
arena->allocated = arena->end + 1;
tissat_verbose ("word size: %zu", sizeof (word));
tissat_verbose ("maximum arena size: %s",
FORMAT_BYTES (MAX_ARENA * sizeof (word)));
size_t size = SIZE_STACK (*arena);
size_t capacity = CAPACITY_STACK (*arena);
assert (size + 1 == capacity);
tissat_verbose ("size of arena: %s",
FORMAT_BYTES (size * sizeof (word)));
tissat_verbose ("capacity of arena: %s",
FORMAT_BYTES (capacity * sizeof (word)));
assert (capacity == MAX_ARENA);
assert (size + 1 == MAX_ARENA);
kissat_allocate_clause (solver, 3);
}
kissat_call_function_instead_of_abort (0);
FATAL ("long jump not taken");
}
}
void
tissat_schedule_arena (void)
{
SCHEDULE_FUNCTION (test_arena_basic);
SCHEDULE_FUNCTION (test_arena_realloc);
SCHEDULE_FUNCTION (test_arena_traverse);
SCHEDULE_FUNCTION (test_arena_fatal);
}