enum
{
propagator = 3, /* gc marking color */
/* STRUCTALIGN is the unit to which the compiler aligns structs. */
/* It really should be defined somewhere else */
STRUCTALIGN = sizeof(int) /* must be >=2 because of Strings */
};
typedef struct GC GC;
typedef struct Heap Heap;
typedef struct Marker Marker;
typedef struct Type Type;
struct GC
{
int mutator;
int marker;
int sweeper;
int color;
int nprop;
int halt;
int visit;
Marker *markers;
void (*print)(char*, ...);
void (*panic)(char*, ...);
/* throttling */
long heapb;
long heapbs[3];
int sweepc;
/* statistics */
int aflags;
int broken;
int busy;
int halted;
int propped;
};
enum /* gc.aflags */
{
GCsweep = (1<<0),
GCaudit = (1<<1),
GCepoch = (1<<2),
GCmark = (1<<3),
GCcreate = (1<<4),
GCdestroy = (1<<5)
};
struct Heap
{
int color; /* Allocation color */
ulong ref;
Type* t;
};
struct Marker
{
void (*mark)(void*);
void *x;
Marker *next;
};
struct Type
{
char *name;
int ref;
void (*free)(Heap*, int);
void (*mark)(Type*, void*);
char *(*namefn)(Heap*, Type*, char*, char*);
int size;
int np;
void* destroy;
void* initialize;
long sig;
uchar map[STRUCTALIGN];
};
#define H2D(t, x) ((t)(((uchar*)(x))+sizeof(Heap)))
#define D2H(x) ((Heap*)(((uchar*)(x))-sizeof(Heap)))
#define H ((void*)(-1))
#define Setmark(h) if((h)->color!=gc.mutator) { (h)->color = propagator; gc.nprop=1; }
#define gclock() gc.halt++
#define gcunlock() gc.halt--
#define gcruns() (gc.halt == 0)
extern Type Tptr;
extern GC gc;
extern void addmarker(void (*)(void*), void*);
extern void destroy(void*);
extern char* defnamefn(Heap*, Type*, char*, char*);
extern Type* dtype(char*, char*(*)(Heap*, Type*, char*, char*), void (*)(Heap*, int), int, uchar*, int);
extern void freeheap(Heap*, int);
extern void freeptrs(void*, Type*);
extern void freetype(Type*);
extern Heap* heap(Type*);
extern void heapassign(void*, void*);
extern int heapmsize(Heap*);
extern int heapref(void*);
extern void heapstate(Heap*, char*);
extern Heap* heapz(Type*);
extern void initgc(void);
extern void incmem(void*, Type*);
extern void initmem(Type*, void*);
extern void markheap(Type*, void*);
extern Heap* nheap(int);
extern void noptrs(Type*, void*);
extern char* printtype(Heap*, Type*, char*, char*);
extern void ptradd(Heap*);
extern void ptrdel(Heap*);
extern void ptrmark(void*);
extern void rungc(void);
extern void safemem(void*, Type*, void (*)(void*));
syntax highlighted by Code2HTML, v. 0.9.1