YAP 7.1.0
trim_trail.h
1
2#ifdef FROZEN_STACKS
3{
4 tr_fr_ptr pt0, pt1, pbase, ptop;
5 pbase = B->cp_tr, ptop = TR;
6 pt0 = pt1 = TR - 1;
7 while (pt1 >= pbase) {
8 BEGD(d1);
9 d1 = TrailTerm(pt1);
10 if (IsVarTerm(d1)) {
11 if (d1 < (CELL)HBREG || d1 > Unsigned(B->cp_b)) {
12 TrailTerm(pt0) = d1;
13 TrailVal(pt0) = TrailVal(pt1);
14 pt0--;
15 }
16 pt1--;
17 } else if (IsPairTerm(d1)) {
18 CELL *pt = RepPair(d1);
19#ifdef LIMIT_TABLING
20 if ((ADDR)pt == LOCAL_TrailBase) {
21 sg_fr_ptr sg_fr = (sg_fr_ptr)TrailVal(pt1);
22 SgFr_state(sg_fr)--; /* complete_in_use --> complete : compiled_in_use
23 --> compiled */
24 insert_into_global_sg_fr_list(sg_fr);
25 } else
26#endif /* LIMIT_TABLING */
27 if (IN_BETWEEN(LOCAL_TrailBase, pt, LOCAL_TrailTop)) {
28 /* skip, this is a problem because we lose information,
29 namely active references */
30 pt1 = (tr_fr_ptr)pt;
31 } else if (IN_BETWEEN(H0, pt, HR) && IsApplTerm(HeadOfTerm(d1))) {
32 RESET_VARIABLE(&TrailTerm(pt1));
33 Term t = HeadOfTerm(d1);
34 Functor f = FunctorOfTerm(t);
35 RESET_VARIABLE(pt0);
36 if (f == FunctorBigInt) {
37 Int tag = Yap_blob_tag(t);
38 GLOBAL_OpaqueHandlers[tag].cut_handler(d1);
39
40 } else {
41 pt0--;
42 }
43 pt1--;
44 continue;
45 } else if ((*pt & (LogUpdMask | IndexMask)) == (LogUpdMask | IndexMask)) {
46 LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt);
47 int erase;
48#if defined(THREADS) || defined(YAPOR)
49 PredEntry *ap = cl->ClPred;
50#endif
51
52 LOCK(ap->PELock);
53 DEC_CLREF_COUNT(cl);
54 cl->ClFlags &= ~InUseMask;
55 erase = (cl->ClFlags & (ErasedMask | DirtyMask)) && !(cl->ClRefCount);
56 if (erase) {
57 /* at this point, we are the only ones accessing the clause,
58 hence we don't need to have a lock it */
59 if (cl->ClFlags & ErasedMask)
60 Yap_ErLogUpdIndex(cl);
61 else
62 Yap_CleanUpIndex(cl);
63 }
64 UNLOCK(ap->PELock);
65 RESET_VARIABLE(&TrailTerm(pt0));
66 RESET_VARIABLE(&TrailVal(pt0));
67 pt0--;
68 } else {
69 TrailTerm(pt0) = d1;
70 TrailVal(pt0) = TrailVal(pt1);
71 pt0--;
72 }
73 pt1--;
74 } else if (IsApplTerm(d1)) {
75 if (IN_BETWEEN(HBREG, RepAppl(d1), B->cp_b)) {
76 /* deterministic binding to multi-assignment variable */
77 RESET_VARIABLE(&TrailTerm(pt0));
78 RESET_VARIABLE(&TrailVal(pt0));
79 pt0--;
80 RESET_VARIABLE(&TrailVal(pt0));
81 RESET_VARIABLE(&TrailTerm(pt0));
82 pt0--;
83 pt1 -= 2;
84 } else {
85 TrailVal(pt0) = TrailVal(pt1);
86 TrailTerm(pt0) = d1;
87 TrailVal(pt0 - 1) = TrailVal(pt1 - 1);
88 TrailTerm(pt0 - 1) = TrailTerm(pt1 - 1);
89 pt0 -= 2;
90 pt1 -= 2;
91 }
92 } else {
93 TrailTerm(pt0) = d1;
94 TrailVal(pt0) = TrailVal(pt1);
95 pt0--;
96 pt1--;
97 }
98 ENDD(d1);
99 }
100 if (pt0 != pt1) {
101 int size;
102 pt0++;
103 size = ptop - pt0;
104 memmove(pbase, pt0, size * sizeof(struct trail_frame));
105 if (ptop != TR) {
106 memmove(pbase + size, ptop, (TR - ptop) * sizeof(struct trail_frame));
107 size += (TR - ptop);
108 }
109 TR = pbase + size;
110 }
111}
112#else
113{
114 tr_fr_ptr pt1, pt0;
115 pt1 = pt0 = B->cp_tr;
116 while (pt1 != TR) {
117 BEGD(d1);
118 d1 = TrailTerm(pt1);
119 if (IsVarTerm(d1)) {
120 if (d1 < (CELL)HBREG || d1 > Unsigned(B->cp_b)) {
121#ifdef FROZEN_STACKS
122 TrailVal(pt0) = TrailVal(pt1);
123#endif /* FROZEN_STACKS */
124 TrailTerm(pt0) = d1;
125 pt0++;
126 } else {
127 RESET_VARIABLE(&TrailTerm(pt0));
128 RESET_VARIABLE(&TrailVal(pt0));
129 pt0++;
130 }
131 pt1++;
132 } else if (IsApplTerm(d1)) {
133 if (IN_BETWEEN(HBREG, RepAppl(d1), B->cp_b)) {
134#ifdef FROZEN_STACKS
135 RESET_VARIABLE(&TrailTerm(pt0));
136 RESET_VARIABLE(&TrailVal(pt0));
137 pt0++;
138 RESET_VARIABLE(&TrailTerm(pt0));
139 RESET_VARIABLE(&TrailVal(pt0));
140 pt0++;
141 pt1 += 2;
142#else
143 RESET_VARIABLE(&TrailTerm(pt0));
144 RESET_VARIABLE(&TrailVal(pt0));
145 pt0++;
146 RESET_VARIABLE(&TrailTerm(pt0));
147 RESET_VARIABLE(&TrailVal(pt0));
148 pt0++;
149 RESET_VARIABLE(&TrailTerm(pt0));
150 RESET_VARIABLE(&TrailVal(pt0));
151 pt0++;
152 pt1 += 3;
153#endif
154 } else {
155#ifdef FROZEN_STACKS
156 TrailVal(pt0) = TrailVal(pt1);
157 TrailTerm(pt0) = d1;
158 TrailVal(pt0 + 1) = TrailVal(pt1 + 1);
159 TrailTerm(pt0 + 1) = TrailTerm(pt1 + 1);
160 pt0 += 2;
161 pt1 += 2;
162#else
163 TrailTerm(pt0 + 1) = TrailTerm(pt1 + 1);
164 TrailTerm(pt0) = TrailTerm(pt0 + 2) = d1;
165 RESET_VARIABLE(&TrailTerm(pt0+2));
166 pt0 += 3;
167 pt1 += 3;
168#endif /* FROZEN_STACKS */
169 }
170 } else if (IsPairTerm(d1)) {
171 CELL *pt = RepPair(d1);
172
173 else if (IN_BETWEEN(H0, pt, HR) && IsApplTerm(HeadOfTerm(d1))) {
174 Term t = HeadOfTerm(d1);
175 Functor f = FunctorOfTerm(t);
176 if (f == FunctorBigInt) {
177 RESET_VARIABLE(&TrailTerm(pt1));
178 Int tag = Yap_blob_tag(t);
179 GLOBAL_OpaqueHandlers[tag].cut_handler(d1);
180 } else if ((*pt & (LogUpdMask | IndexMask)) ==
181 (LogUpdMask | IndexMask)) {
182 LogUpdIndex *cl = ClauseFlagsToLogUpdIndex(pt);
183#if defined(YAPOR) || defined(THREADS)
184 PredEntry *ap = cl->ClPred;
185#endif
186 int erase;
187
188 LOCK(ap->PELock);
189 DEC_CLREF_COUNT(cl);
190 cl->ClFlags &= ~InUseMask;
191 erase = (cl->ClFlags & (DirtyMask | ErasedMask)) && !(cl->ClRefCount);
192 if (erase) {
193 /* at this point, we are the only ones accessing the clause,
194 hence we don't need to have a lock it */
195 if (cl->ClFlags & ErasedMask)
196 Yap_ErLogUpdIndex(cl);
197 else
198 Yap_CleanUpIndex(cl);
199 }
200 UNLOCK(ap->PELock);
201 RESET_VARIABLE(&TrailTerm(pt0));
202 pt0++;
203 } else {
204 TrailTerm(pt0) = d1;
205 pt0++;
206 }
207 pt1++;
208 }
209 else {
210 TrailTerm(pt0) = d1;
211 pt0++;
212 pt1++;
213 }
214 ENDD(d1);
215 }
216 TR = pt0;
217 }
218#endif /* FROZEN_STACKS */
Definition: Yatom.h:544