YAP 7.1.0
heapgc.h
1/*************************************************************************
2* *
3* YAP Prolog *
4* *
5* Yap Prolog was developed at NCCUP - Universidade do Porto *
6* *
7* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
8* *
9**************************************************************************
10* *
11* File: heapgc.c *
12* Last rev: *
13* mods: *
14* comments: Header for Global Stack garbage collector *
15* *
16*************************************************************************/
17
18#ifndef HEAPGC_H
19#define HEAPGC_H 1
20
21#include "Yap.h"
22
23/* macros used by garbage collection */
24
25#if TAG_64BITS
26#define MaskAdr (~((CELL)0x7))
27#endif
28
29/* return pointer from object pointed to by ptr (remove tag & mark) */
30#ifdef TAGS_FAST_OPS
31#define GET_NEXT(val) ((CELL *)(IsVarTerm((val)) ? \
32 (val) & MaskAdr : \
33 ( IsPairTerm((val)) ? \
34 Unsigned(RepPair((val))) & MaskAdr : \
35 ( IsApplTerm((val)) ? \
36 Unsigned(RepAppl((val))) & MaskAdr : \
37 (val) & MaskAdr \
38 ) \
39 ) \
40 ) \
41 )
42#else
43#ifdef TAG_LOW_BITS_32
44#define GET_NEXT(val) ((CELL *) ((val) & ~LowTagBits))
45#else
46#define GET_NEXT(val) ((CELL *) ((val) & MaskAdr))
47#endif
48#endif
49
50/* is ptr a pointer to the heap? */
51#define ONHEAP(ptr) (CellPtr(ptr) >= H0 && CellPtr(ptr) < HR)
52
53/* is val pointing to something bound to the heap? */
54
55
56/* is ptr a pointer to code space? */
57#if USE_SYSTEM_MALLOC
58#define ONCODE(ptr) ((ptr < H0||ptr>HR)&&find_ref_in_dbtable((void*)ptr) != LOCAL_db_nil)
59#else
60#define ONCODE(ptr) (Addr(ptr) < HeapTop && Addr(ptr) >= Yap_HeapBase)
61#endif
62
63#define GCIsPrimitiveTerm(X) (/* not really needed !IsVarTerm(X) && */ IsAtomOrIntTerm(X))
64
65/* Does X point to an object in the heap */
66#define HEAP_PTR(val) (!GCIsPrimitiveTerm(val) && ONHEAP(GET_NEXT(val)))
67
68/*
69 Heap_trail_entry must be very careful. We are looking at a valid
70 trail entry if: it was between H0 and HB or between B and LCLO
71 (that is, if it was covered by choicepoints at the time), and if it
72 was a heap pointer.
73
74 We can join the two conditions: (H0 =< val < HB || ((B < val < LCL0)
75 && H0 <= *DETAG(val) < H))
76*/
77
78#define HEAP_TRAIL_ENTRY(val) ((IsVarTerm(val)) && \
79 ((H0 <= CellPtr(val) && CellPtr(val)\
80 < cp_H) || \
81 (CellPtr(B) < CellPtr(val) && CellPtr(val) <= \
82 LCL0 && HEAP_PTR(val))))
83
84/* is the object pointed to by ptr marked as in a relocation chain? */
85
86#ifdef TAG_64BITS00
87
88#define MARK_BIT MKTAG(0x2,0x0)
89#define RMARK_BIT MKTAG(0x4,0x0)
90
91#define MARKED_PTR(P) MARKED_PTR__(P PASS_REGS)
92#define UNMARKED_CELL(P) MARKED_PTR__(P PASS_REGS)
93#define UNMARKED_MARK(P, BP) UNMARKED_MARK__(P, BP PASS_REGS)
94#define MARK(P) MARK__(P PASS_REGS)
95#define UNMARK(P) UNMARK__(P PASS_REGS)
96#define RMARK(P) RMARK__(P PASS_REGS)
97#define RMARKED(P) RMARKED__(P PASS_REGS)
98#define UNRMARK(P) UNRMARK__(P PASS_REGS)
99
100static inline Int
101MARKED_PTR__(CELL* ptr USES_REGS)
102{
103 return (CELL)ptr & MARK_BIT;
104}
105
106static inline Int
107UNMARKED_MARK__(CELL* ptr, char *bp USES_REGS)
108{
109 CELL t = *ptr;
110 if (t & MARK_BIT) {
111 return true;
112 }
113 *ptr = t | MARK_BIT;
114 return false;
115}
116
117static inline void
118MARK__(CELL* ptr USES_REGS)
119{
120 CELL t = *ptr;
121 *ptr = t | MARK_BIT;
122}
123
124static inline void
125UNMARK__(CELL* ptr USES_REGS)
126{
127 *ptr &= ~MARK_BIT;
128}
129
130/* not really that useful */
131#define MAY_UNMARK(X)
132
133#define UNMARK_CELL(X) (X)
134
135static inline void
136RMARK__(CELL* ptr USES_REGS)
137{
138 *ptr |= RMARK_BIT;
139}
140
141static inline void
142UNRMARK__(CELL* ptr USES_REGS)
143{
144 *ptr &= ~RMARK_BIT;
145}
146
147static inline int
148RMARKED__(CELL* ptr USES_REGS)
149{
150 return *ptr & RMARK_BIT;
151}
152
153#else
154
155#define MARK_BIT ((char)1)
156#define RMARK_BIT ((char)2)
157#define XMARK_BIT ((char)4)
158
159#define mcell(X) LOCAL_bp[(X)-(CELL *)LOCAL_GlobalBase]
160
161#define MARKED_PTR(P) MARKED_PTR__(P PASS_REGS)
162#define UNMARKED_MARK(P, BP) UNMARKED_MARK__(P, BP PASS_REGS)
163#define MARK(P) MARK__(P PASS_REGS)
164#define UNMARK(P) UNMARK__(P PASS_REGS)
165#define RMARK(P) RMARK__(P PASS_REGS)
166#define RMARKED(P) RMARKED__(P PASS_REGS)
167#define UNRMARK(P) UNRMARK__(P PASS_REGS)
168#define XMARK(P) XMARK__(P PASS_REGS)
169#define XMARKED(P) XMARKED__(P PASS_REGS)
170#define UNXMARK(P) UNXMARK__(P PASS_REGS)
171
172static inline Int
173MARKED_PTR__(CELL* ptr USES_REGS)
174{
175 return mcell(ptr) & MARK_BIT;
176}
177
178static inline Int
179UNMARKED_MARK__(CELL* ptr, char *bp USES_REGS)
180{
181 Int pos = ptr - (CELL *)LOCAL_GlobalBase;
182 char t = bp[pos];
183 if (t & MARK_BIT) {
184 return TRUE;
185 }
186 bp[pos] = t | MARK_BIT;
187 return FALSE;
188}
189
190static inline void
191MARK__(CELL* ptr USES_REGS)
192{
193 Int pos = ptr - (CELL *)LOCAL_GlobalBase;
194 char t = LOCAL_bp[pos];
195 LOCAL_bp[pos] = t | MARK_BIT;
196}
197
198static inline void
199UNMARK__(CELL* ptr USES_REGS)
200{
201 mcell(ptr) = mcell(ptr) & ~MARK_BIT;
202}
203
204/* not really that useful */
205#define MAY_UNMARK(X)
206
207#define UNMARK_CELL(X) (X)
208
209static inline void
210RMARK__(CELL* ptr USES_REGS)
211{
212 mcell(ptr) = mcell(ptr) | RMARK_BIT;
213}
214
215static inline void
216UNRMARK__(CELL* ptr USES_REGS)
217{
218 mcell(ptr) = mcell(ptr) & ~RMARK_BIT;
219}
220
221static inline int
222RMARKED__(CELL* ptr USES_REGS)
223{
224 return mcell(ptr) & RMARK_BIT;
225}
226
227
228static inline void
229XMARK__(CELL* ptr USES_REGS)
230{
231 mcell(ptr) = mcell(ptr) | XMARK_BIT;
232}
233
234static inline void
235UNXMARK__(CELL* ptr USES_REGS)
236{
237 mcell(ptr) = mcell(ptr) & ~XMARK_BIT;
238}
239
240static inline int
241XMARKED__(CELL* ptr USES_REGS)
242{
243 return mcell(ptr) & XMARK_BIT;
244}
245
246#endif
247
248#if LONG_ADDRESSES
249#ifdef TAG_LOW_BITS_32
250#define TAG(X) ((X) & LowTagBits)
251#else
252#ifdef TAG_64BITS
253#define TAG(X) ((X) & MKTAG(0x0,0x7))
254#else
255#define TAG(X) ((X) & 0x80000003L)
256#endif
257#endif
258#else
259#define TAG(X) ((X) & 0x98000000L)
260#endif
261
262#define ENVSIZE(E) EnvSize(((CELL *)E)[E_CP])
263
264
265typedef CELL *CELL_PTR;
266
267
268extern void Yap_mark_variable(CELL *);
269extern void Yap_mark_external_reference(CELL *);
270extern void Yap_inc_mark_variable(void);
271
272typedef struct gc_entry_info {
273 CELL *env;
274 yamop *p, *p_env;
275 OPCODE op;
276 arity_t a;
277 bool at_yaam;
278 size_t env_size, gc_min;
279 struct pred_entry *callee;
281
282extern void PUSH_POINTER(CELL *v USES_REGS);
283#endif
Main definitions.
Definition: heapgc.h:272
Definition: Yatom.h:544
Definition: amidefs.h:264