forked from pikelang/Pike
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgc_header.h
73 lines (66 loc) · 2.04 KB
/
gc_header.h
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef GC_HEADER_H
#define GC_HEADER_H
#include "pike_memory.h"
#include "global.h"
/* Note: Keep in sync to struct marker below */
#ifdef PIKE_DEBUG
# define DEBUG_GC_MARKER_MEMBERS \
INT32 xrefs; \
INT32 saved_refs; \
unsigned INT32 gc_flags
#else
# define DEBUG_GC_MARKER_MEMBERS \
unsigned INT16 gc_flags
#endif
#define GC_MARKER_MEMBERS \
INT32 refs; \
INT32 gc_refs; \
struct gc_rec_frame *frame; \
INT32 weak_refs; \
unsigned INT16 gc_generation; \
DEBUG_GC_MARKER_MEMBERS
/* Note: Keep in sync to GC_MARKER_MEMBERS above */
struct marker
{
/* this should not be modified through a struct marker pointer */
INT32 refs_do_not_touch;
INT32 gc_refs;
struct gc_rec_frame *frame; /* Pointer to the cycle check rec frame. */
/* Internal references (both weak and nonweak). Increased during
* check pass. */
INT32 weak_refs;
/* Weak (implying internal) references. Increased during check pass.
* Set to -1 during check pass if it reaches the total number of
* references. Set to 0 during mark pass if a nonweak reference is
* found. Decreased during zap weak pass as gc_do_weak_free() is
* called. */
unsigned INT16 gc_generation;
#ifdef PIKE_DEBUG
INT32 xrefs;
/* Known external references. Increased by gc_mark_external(). */
INT32 saved_refs;
/* References at beginning of gc. Set by pretouch and check passes.
* Decreased by gc_do_weak_free() as weak references are removed. */
unsigned INT32 gc_flags;
#else
unsigned INT16 gc_flags;
#endif
};
#ifdef PIKE_DEBUG
#define GC_HEADER_INIT(REFS) (REFS), 0, NULL, 0, 0, 0, -1, 0
#else
#define GC_HEADER_INIT(REFS) (REFS), 0, NULL, 0, 0, 0
#endif
static inline void gc_init_marker(void *ptr) {
struct marker *m = ptr;
m->gc_refs = 0;
m->frame = NULL;
m->weak_refs = 0;
m->gc_generation = 0;
#ifdef PIKE_DEBUG
m->xrefs = 0;
m->saved_refs = -1;
#endif
m->gc_flags = 0;
}
#endif