summary refs log tree commit diff
path: root/third_party/gldc/src/yalloc/yalloc_dump.c
blob: f0dfdcbcd75be4be33b95ae250f5eb5ac405fbde (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "yalloc_internals.h"

#include <stdio.h>

static void printOffset(void * pool, char * name, uint16_t offset)
{
  if (isNil(offset))
    printf("  %s: nil\n", name);
  else
    printf("  %s: %td\n", name, (char*)HDR_PTR(offset) - (char*)pool);
}

void yalloc_dump(void * pool, char * name)
{
  printf("---- %s ----\n", name);
  Header * cur = (Header*)pool;
  for (;;)
  {
    printf(isFree(cur) ? "%td: free @%p\n" : "%td: used @%p\n", (char*)cur - (char*)pool, cur);
    printOffset(pool, cur == pool ? "first free" : "prev", cur->prev);
    printOffset(pool, "next", cur->next);
    if (isFree(cur))
    {
      printOffset(pool, "prevFree", cur[1].prev);
      printOffset(pool, "nextFree", cur[1].next);
    }
    else
      printf("  payload includes padding: %i\n", isPadded(cur));

    if (isNil(cur->next))
      break;

    printf("  %td bytes payload\n", (char*)HDR_PTR(cur->next) - (char*)cur - sizeof(Header));

    cur = HDR_PTR(cur->next);
  }

  fflush(stdout);
}