fix memory expansion bugs.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1852 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
ce71569e66
commit
e27d2fa1f3
63
C/absmi.c
63
C/absmi.c
@ -10,8 +10,11 @@
|
|||||||
* *
|
* *
|
||||||
* File: absmi.c *
|
* File: absmi.c *
|
||||||
* comments: Portable abstract machine interpreter *
|
* comments: Portable abstract machine interpreter *
|
||||||
* Last rev: $Date: 2007-01-24 09:57:25 $,$Author: vsc $ *
|
* Last rev: $Date: 2007-03-21 18:32:49 $,$Author: vsc $ *
|
||||||
* $Log: not supported by cvs2svn $
|
* $Log: not supported by cvs2svn $
|
||||||
|
* Revision 1.219 2007/01/24 09:57:25 vsc
|
||||||
|
* fix glist_void_varx
|
||||||
|
*
|
||||||
* Revision 1.218 2006/12/31 01:50:34 vsc
|
* Revision 1.218 2006/12/31 01:50:34 vsc
|
||||||
* fix some bugs in call_cleanup: the result of action should not matter,
|
* fix some bugs in call_cleanup: the result of action should not matter,
|
||||||
* and !,fail would not wakeup the delayed goal.
|
* and !,fail would not wakeup the delayed goal.
|
||||||
@ -731,7 +734,7 @@ Yap_absmi(int inp)
|
|||||||
ASP = YREG+E_CB;
|
ASP = YREG+E_CB;
|
||||||
}
|
}
|
||||||
saveregs();
|
saveregs();
|
||||||
if(!Yap_growtrail (sizeof(CELL) * 16 * 1024L, FALSE)) {
|
if(!Yap_growtrail (0, FALSE)) {
|
||||||
Yap_Error(OUT_OF_TRAIL_ERROR,TermNil,"YAP failed to reserve %ld bytes in growtrail",sizeof(CELL) * 16 * 1024L);
|
Yap_Error(OUT_OF_TRAIL_ERROR,TermNil,"YAP failed to reserve %ld bytes in growtrail",sizeof(CELL) * 16 * 1024L);
|
||||||
setregs();
|
setregs();
|
||||||
FAIL();
|
FAIL();
|
||||||
@ -2747,32 +2750,38 @@ Yap_absmi(int inp)
|
|||||||
so I don't need to redo it.
|
so I don't need to redo it.
|
||||||
*/
|
*/
|
||||||
NoStackDeallocate:
|
NoStackDeallocate:
|
||||||
if (ActiveSignals & YAP_CREEP_SIGNAL) {
|
{
|
||||||
GONext();
|
CELL cut_b = LCL0-(CELL *)(SREG[E_CB]);
|
||||||
}
|
|
||||||
ASP = YREG;
|
if (ActiveSignals & YAP_CREEP_SIGNAL) {
|
||||||
/* cut_e */
|
GONext();
|
||||||
if (SREG <= ASP) {
|
|
||||||
ASP = SREG-EnvSizeInCells;
|
|
||||||
}
|
|
||||||
if (ActiveSignals & YAP_CDOVF_SIGNAL) {
|
|
||||||
goto noheapleft;
|
|
||||||
}
|
|
||||||
if (ActiveSignals) {
|
|
||||||
if (Yap_op_from_opcode(PREG->opc) == _cut_e) {
|
|
||||||
/* followed by a cut */
|
|
||||||
ARG1 = MkIntegerTerm(LCL0-(CELL *)SREG[E_CB]);
|
|
||||||
SREG = (CELL *)RepPredProp(Yap_GetPredPropByFunc(FunctorCutBy,1));
|
|
||||||
} else {
|
|
||||||
SREG = (CELL *)RepPredProp(Yap_GetPredPropByAtom(AtomTrue,0));
|
|
||||||
}
|
}
|
||||||
goto creep;
|
ASP = YREG;
|
||||||
|
/* cut_e */
|
||||||
|
if (SREG <= ASP) {
|
||||||
|
ASP = SREG-EnvSizeInCells;
|
||||||
|
}
|
||||||
|
if (ActiveSignals & YAP_CDOVF_SIGNAL) {
|
||||||
|
goto noheapleft;
|
||||||
|
}
|
||||||
|
if (ActiveSignals) {
|
||||||
|
if (Yap_op_from_opcode(PREG->opc) == _cut_e) {
|
||||||
|
/* followed by a cut */
|
||||||
|
ARG1 = MkIntegerTerm(LCL0-(CELL *)SREG[E_CB]);
|
||||||
|
SREG = (CELL *)RepPredProp(Yap_GetPredPropByFunc(FunctorCutBy,1));
|
||||||
|
} else {
|
||||||
|
SREG = (CELL *)RepPredProp(Yap_GetPredPropByAtom(AtomTrue,0));
|
||||||
|
}
|
||||||
|
goto creep;
|
||||||
|
}
|
||||||
|
saveregs();
|
||||||
|
if (!Yap_gc(0, ENV, CPREG)) {
|
||||||
|
Yap_Error(OUT_OF_STACK_ERROR,TermNil,Yap_ErrorMessage);
|
||||||
|
}
|
||||||
|
setregs();
|
||||||
|
SREG = ASP;
|
||||||
|
SREG[E_CB] = (CELL)(LCL0-cut_b);
|
||||||
}
|
}
|
||||||
saveregs();
|
|
||||||
if (!Yap_gc(0, ENV, CPREG)) {
|
|
||||||
Yap_Error(OUT_OF_STACK_ERROR,TermNil,Yap_ErrorMessage);
|
|
||||||
}
|
|
||||||
setregs();
|
|
||||||
JMPNext();
|
JMPNext();
|
||||||
|
|
||||||
#ifdef COROUTINING
|
#ifdef COROUTINING
|
||||||
@ -13537,7 +13546,7 @@ Yap_absmi(int inp)
|
|||||||
S = SREG;
|
S = SREG;
|
||||||
#endif
|
#endif
|
||||||
saveregs_and_ycache();
|
saveregs_and_ycache();
|
||||||
if(!Yap_growtrail (sizeof(CELL) * 16 * 1024L, FALSE)) {
|
if(!Yap_growtrail (0, FALSE)) {
|
||||||
Yap_Error(OUT_OF_TRAIL_ERROR,TermNil,"YAP failed to reserve %ld bytes in growtrail",sizeof(CELL) * 16 * 1024L);
|
Yap_Error(OUT_OF_TRAIL_ERROR,TermNil,"YAP failed to reserve %ld bytes in growtrail",sizeof(CELL) * 16 * 1024L);
|
||||||
setregs_and_ycache();
|
setregs_and_ycache();
|
||||||
FAIL();
|
FAIL();
|
||||||
|
1
C/agc.c
1
C/agc.c
@ -411,6 +411,7 @@ atom_gc(void)
|
|||||||
|
|
||||||
|
|
||||||
UInt time_start, agc_time;
|
UInt time_start, agc_time;
|
||||||
|
return;
|
||||||
if (Yap_GetValue(AtomGcTrace) != TermNil)
|
if (Yap_GetValue(AtomGcTrace) != TermNil)
|
||||||
gc_trace = 1;
|
gc_trace = 1;
|
||||||
agc_calls++;
|
agc_calls++;
|
||||||
|
5
C/grow.c
5
C/grow.c
@ -1399,8 +1399,13 @@ static int do_growtrail(long size, int contiguous_only, int in_parser, tr_fr_ptr
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
#endif
|
#endif
|
||||||
/* at least 64K for trail */
|
/* at least 64K for trail */
|
||||||
|
if (!size)
|
||||||
|
size = ((ADDR)TR-Yap_TrailBase);
|
||||||
|
size *= 2;
|
||||||
if (size < 64*1024)
|
if (size < 64*1024)
|
||||||
size = 64*1024;
|
size = 64*1024;
|
||||||
|
if (size > 2048*1024)
|
||||||
|
size = 2048*1024;
|
||||||
/* adjust to a multiple of 256) */
|
/* adjust to a multiple of 256) */
|
||||||
size = AdjustPageSize(size);
|
size = AdjustPageSize(size);
|
||||||
trail_overflows++;
|
trail_overflows++;
|
||||||
|
113
C/heapgc.c
113
C/heapgc.c
@ -139,10 +139,25 @@ static rb_red_blk_node *db_root, *db_nil;
|
|||||||
/* support for hybrid garbage collection scheme */
|
/* support for hybrid garbage collection scheme */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_growtrail(int committed)
|
gc_growtrail(int committed, tr_fr_ptr begsTR, cont *old_cont_top0)
|
||||||
{
|
{
|
||||||
if (!Yap_growtrail(64 * 1024L, TRUE)) {
|
UInt sz = Yap_TrailTop-(ADDR)OldTR;
|
||||||
TR = OldTR;
|
/* ask for double the size */
|
||||||
|
sz = 2*sz;
|
||||||
|
|
||||||
|
if (!Yap_growtrail(sz, TRUE)) {
|
||||||
|
#ifdef EASY_SHUNTING
|
||||||
|
if (begsTR) {
|
||||||
|
sTR = (tr_fr_ptr)old_cont_top0;
|
||||||
|
while (begsTR != NULL) {
|
||||||
|
tr_fr_ptr newsTR = (tr_fr_ptr)TrailTerm(begsTR);
|
||||||
|
TrailTerm(sTR) = TrailTerm(begsTR+1);
|
||||||
|
TrailTerm(sTR+1) = TrailTerm(begsTR+2);
|
||||||
|
begsTR = newsTR;
|
||||||
|
sTR += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/* could not find more trail */
|
/* could not find more trail */
|
||||||
save_machine_regs();
|
save_machine_regs();
|
||||||
longjmp(Yap_gc_restore, 2);
|
longjmp(Yap_gc_restore, 2);
|
||||||
@ -155,7 +170,7 @@ PUSH_CONTINUATION(CELL *v, int nof) {
|
|||||||
x = cont_top;
|
x = cont_top;
|
||||||
x++;
|
x++;
|
||||||
if ((ADDR)x > Yap_TrailTop-1024) {
|
if ((ADDR)x > Yap_TrailTop-1024) {
|
||||||
gc_growtrail(TRUE);
|
gc_growtrail(TRUE, NULL, NULL);
|
||||||
}
|
}
|
||||||
x->v = v;
|
x->v = v;
|
||||||
x->nof = nof;
|
x->nof = nof;
|
||||||
@ -318,7 +333,7 @@ GC_ALLOC_NEW_MASPACE(void)
|
|||||||
{
|
{
|
||||||
gc_ma_hash_entry *new = gc_ma_h_top;
|
gc_ma_hash_entry *new = gc_ma_h_top;
|
||||||
if ((char *)gc_ma_h_top > Yap_TrailTop-1024)
|
if ((char *)gc_ma_h_top > Yap_TrailTop-1024)
|
||||||
gc_growtrail(FALSE);
|
gc_growtrail(FALSE, NULL, NULL);
|
||||||
gc_ma_h_top++;
|
gc_ma_h_top++;
|
||||||
cont_top = (cont *)gc_ma_h_top;
|
cont_top = (cont *)gc_ma_h_top;
|
||||||
#ifdef EASY_SHUNTING
|
#ifdef EASY_SHUNTING
|
||||||
@ -563,7 +578,7 @@ RBMalloc(UInt size)
|
|||||||
|
|
||||||
db_vec += size;
|
db_vec += size;
|
||||||
if ((ADDR)db_vec > Yap_TrailTop-1024) {
|
if ((ADDR)db_vec > Yap_TrailTop-1024) {
|
||||||
gc_growtrail(FALSE);
|
gc_growtrail(FALSE, NULL, NULL);
|
||||||
}
|
}
|
||||||
return (rb_red_blk_node *)new;
|
return (rb_red_blk_node *)new;
|
||||||
}
|
}
|
||||||
@ -1618,7 +1633,7 @@ mark_trail(tr_fr_ptr trail_ptr, tr_fr_ptr trail_base, CELL *gc_H, choiceptr gc_B
|
|||||||
CELL *cptr = (CELL *)trail_cell;
|
CELL *cptr = (CELL *)trail_cell;
|
||||||
|
|
||||||
if ((ADDR)nsTR > Yap_TrailTop-1024) {
|
if ((ADDR)nsTR > Yap_TrailTop-1024) {
|
||||||
gc_growtrail(TRUE);
|
gc_growtrail(TRUE, begsTR, old_cont_top0);
|
||||||
}
|
}
|
||||||
TrailTerm(nsTR) = (CELL)NULL;
|
TrailTerm(nsTR) = (CELL)NULL;
|
||||||
TrailTerm(nsTR+1) = *hp;
|
TrailTerm(nsTR+1) = *hp;
|
||||||
@ -3508,23 +3523,12 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
|
|||||||
Int effectiveness, tot;
|
Int effectiveness, tot;
|
||||||
int gc_trace;
|
int gc_trace;
|
||||||
UInt gc_phase;
|
UInt gc_phase;
|
||||||
|
UInt alloc_sz;
|
||||||
|
|
||||||
heap_cells = H-H0;
|
heap_cells = H-H0;
|
||||||
gc_verbose = is_gc_verbose();
|
gc_verbose = is_gc_verbose();
|
||||||
effectiveness = 0;
|
effectiveness = 0;
|
||||||
gc_trace = FALSE;
|
gc_trace = FALSE;
|
||||||
#if COROUTINING
|
|
||||||
max = (CELL *)DelayTop();
|
|
||||||
while (max - (CELL*)Yap_GlobalBase < 1024+(2*NUM_OF_ATTS)) {
|
|
||||||
if (!Yap_growglobal(¤t_env)) {
|
|
||||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
max = (CELL *)DelayTop();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
max = NULL;
|
|
||||||
#endif
|
|
||||||
#ifdef INSTRUMENT_GC
|
#ifdef INSTRUMENT_GC
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -3574,36 +3578,35 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
time_start = Yap_cputime();
|
time_start = Yap_cputime();
|
||||||
total_marked = 0;
|
|
||||||
total_oldies = 0;
|
|
||||||
#ifdef COROUTING
|
|
||||||
total_smarked = 0;
|
|
||||||
#endif
|
|
||||||
discard_trail_entries = 0;
|
|
||||||
{
|
|
||||||
UInt alloc_sz = (CELL *)Yap_TrailTop-(CELL*)Yap_GlobalBase;
|
|
||||||
Yap_bp = Yap_PreAllocCodeSpace();
|
|
||||||
while (Yap_bp+alloc_sz > (char *)AuxSp) {
|
|
||||||
/* not enough space */
|
|
||||||
*--ASP = (CELL)current_env;
|
|
||||||
Yap_bp = (char *)Yap_ExpandPreAllocCodeSpace(alloc_sz, NULL);
|
|
||||||
if (!Yap_bp)
|
|
||||||
return -1;
|
|
||||||
current_env = (CELL *)*ASP;
|
|
||||||
ASP++;
|
|
||||||
#if COROUTINING
|
#if COROUTINING
|
||||||
max = (CELL *)DelayTop();
|
max = (CELL *)DelayTop();
|
||||||
#endif
|
while (max - (CELL*)Yap_GlobalBase < 1024+(2*NUM_OF_ATTS)) {
|
||||||
|
if (!Yap_growglobal(¤t_env)) {
|
||||||
|
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
memset((void *)Yap_bp, 0, alloc_sz);
|
max = (CELL *)DelayTop();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
max = NULL;
|
||||||
|
#endif
|
||||||
if (setjmp(Yap_gc_restore) == 2) {
|
if (setjmp(Yap_gc_restore) == 2) {
|
||||||
|
UInt sz;
|
||||||
|
|
||||||
/* we cannot recover, fail system */
|
/* we cannot recover, fail system */
|
||||||
restore_machine_regs();
|
restore_machine_regs();
|
||||||
*--ASP = (CELL)current_env;
|
sz = Yap_TrailTop-(ADDR)OldTR;
|
||||||
|
fprintf(stderr,"sz=%d\n",sz);
|
||||||
|
/* ask for double the size */
|
||||||
|
sz = 2*sz;
|
||||||
TR = OldTR;
|
TR = OldTR;
|
||||||
|
|
||||||
|
*--ASP = (CELL)current_env;
|
||||||
|
#ifdef EASY_SHUNTING
|
||||||
|
set_conditionals(sTR);
|
||||||
|
#endif
|
||||||
if (
|
if (
|
||||||
!Yap_growtrail(64 * 1024L, FALSE)
|
!Yap_growtrail(sz, FALSE)
|
||||||
) {
|
) {
|
||||||
Yap_Error(OUT_OF_TRAIL_ERROR,TermNil,"out of %lB during gc", 64*1024L);
|
Yap_Error(OUT_OF_TRAIL_ERROR,TermNil,"out of %lB during gc", 64*1024L);
|
||||||
return -1;
|
return -1;
|
||||||
@ -3617,15 +3620,37 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
|
|||||||
current_env = (CELL *)*ASP;
|
current_env = (CELL *)*ASP;
|
||||||
ASP++;
|
ASP++;
|
||||||
#if COROUTINING
|
#if COROUTINING
|
||||||
max = (CELL *)DelayTop();
|
max = (CELL *)DelayTop();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
total_marked = 0;
|
||||||
|
total_oldies = 0;
|
||||||
|
#ifdef COROUTING
|
||||||
|
total_smarked = 0;
|
||||||
|
#endif
|
||||||
|
discard_trail_entries = 0;
|
||||||
|
alloc_sz = (CELL *)Yap_TrailTop-(CELL*)Yap_GlobalBase;
|
||||||
|
Yap_bp = Yap_PreAllocCodeSpace();
|
||||||
|
while (Yap_bp+alloc_sz > (char *)AuxSp) {
|
||||||
|
/* not enough space */
|
||||||
|
*--ASP = (CELL)current_env;
|
||||||
|
Yap_bp = (char *)Yap_ExpandPreAllocCodeSpace(alloc_sz, NULL);
|
||||||
|
if (!Yap_bp)
|
||||||
|
return -1;
|
||||||
|
current_env = (CELL *)*ASP;
|
||||||
|
ASP++;
|
||||||
|
#if COROUTINING
|
||||||
|
max = (CELL *)DelayTop();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
memset((void *)Yap_bp, 0, alloc_sz);
|
||||||
#ifdef HYBRID_SCHEME
|
#ifdef HYBRID_SCHEME
|
||||||
iptop = (CELL_PTR *)H;
|
iptop = (CELL_PTR *)H;
|
||||||
#endif
|
#endif
|
||||||
/* get the number of active registers */
|
/* get the number of active registers */
|
||||||
HGEN = H0+IntegerOfTerm(Yap_ReadTimedVar(GcGeneration));
|
HGEN = H0+IntegerOfTerm(Yap_ReadTimedVar(GcGeneration));
|
||||||
|
|
||||||
gc_phase = (UInt)IntegerOfTerm(Yap_ReadTimedVar(GcPhase));
|
gc_phase = (UInt)IntegerOfTerm(Yap_ReadTimedVar(GcPhase));
|
||||||
/* old HGEN are not very reliable, but still may have data to recover */
|
/* old HGEN are not very reliable, but still may have data to recover */
|
||||||
if (gc_phase != GcCurrentPhase) {
|
if (gc_phase != GcCurrentPhase) {
|
||||||
@ -3634,6 +3659,7 @@ do_gc(Int predarity, CELL *current_env, yamop *nextop)
|
|||||||
/* fprintf(stderr,"HGEN is %ld, %p, %p/%p\n", IntegerOfTerm(Yap_ReadTimedVar(GcGeneration)), HGEN, H,H0);*/
|
/* fprintf(stderr,"HGEN is %ld, %p, %p/%p\n", IntegerOfTerm(Yap_ReadTimedVar(GcGeneration)), HGEN, H,H0);*/
|
||||||
OldTR = (tr_fr_ptr)(old_TR = TR);
|
OldTR = (tr_fr_ptr)(old_TR = TR);
|
||||||
push_registers(predarity, nextop);
|
push_registers(predarity, nextop);
|
||||||
|
/* make sure we clean bits after a reset */
|
||||||
marking_phase(old_TR, current_env, nextop, max);
|
marking_phase(old_TR, current_env, nextop, max);
|
||||||
if (total_oldies > ((HGEN-H0)*8)/10) {
|
if (total_oldies > ((HGEN-H0)*8)/10) {
|
||||||
total_marked -= total_oldies;
|
total_marked -= total_oldies;
|
||||||
@ -3767,10 +3793,11 @@ call_gc(UInt gc_lim, Int predarity, CELL *current_env, yamop *nextop)
|
|||||||
if (gc_margin < gc_lim)
|
if (gc_margin < gc_lim)
|
||||||
gc_margin = gc_lim;
|
gc_margin = gc_lim;
|
||||||
GcCalls++;
|
GcCalls++;
|
||||||
|
HGEN = H0+IntegerOfTerm(Yap_ReadTimedVar(GcGeneration));
|
||||||
if (gc_on && !(Yap_PrologMode & InErrorMode) &&
|
if (gc_on && !(Yap_PrologMode & InErrorMode) &&
|
||||||
/* make sure there is a point in collecting the heap */
|
/* make sure there is a point in collecting the heap */
|
||||||
(ASP-H0)*sizeof(CELL) > gc_lim &&
|
(ASP-H0)*sizeof(CELL) > gc_lim &&
|
||||||
H-H0 > (LCL0-ASP)/2) {
|
H-HGEN > (LCL0-ASP)/2) {
|
||||||
effectiveness = do_gc(predarity, current_env, nextop);
|
effectiveness = do_gc(predarity, current_env, nextop);
|
||||||
if (effectiveness < 0)
|
if (effectiveness < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -16,6 +16,9 @@
|
|||||||
|
|
||||||
<h2>Yap-5.1.2:</h2>
|
<h2>Yap-5.1.2:</h2>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li> FIXED: memory expansion in deallocate would lose cut pointer.</li>
|
||||||
|
<li> FIXED: make growtrail do more than grow chunks of 64KB.</li>
|
||||||
|
<li> FIXED: growtrail was broken if called while doing variable shunting.</li>
|
||||||
<li> FIXED: by default,allow defining infix+prefix/posfix instead of
|
<li> FIXED: by default,allow defining infix+prefix/posfix instead of
|
||||||
using standard ISO.</li>
|
using standard ISO.</li>
|
||||||
<li> FIXED: nb_current was unimplemented (obs from Pablo Beltran).</li>
|
<li> FIXED: nb_current was unimplemented (obs from Pablo Beltran).</li>
|
||||||
|
Reference in New Issue
Block a user