gpgscm: Avoid fruitless garbage collection cycles.

* tests/gpgscm/scheme-private.h (CELL_MINRECOVER): New macro.
* tests/gpgscm/scheme.c (_get_cell): Move the heuristic to get more
cells...
(gc): ... here where every caller benefits from the optimization.

Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
Justus Winter 2017-04-20 15:04:52 +02:00
parent 10519270d3
commit 245860ecaf
No known key found for this signature in database
GPG Key ID: DD1A52F9DA8C9020
2 changed files with 15 additions and 8 deletions

View File

@ -108,6 +108,13 @@ int tracing;
#ifndef CELL_SEGSIZE
#define CELL_SEGSIZE 5000 /* # of cells in one segment */
#endif
/* If less than # of cells are recovered in a garbage collector run,
* allocate a new cell segment to avoid fruitless collection cycles in
* the near future. */
#ifndef CELL_MINRECOVER
#define CELL_MINRECOVER (CELL_SEGSIZE >> 2)
#endif
struct cell_segment *cell_segments;
/* We use 4 registers. */

View File

@ -949,15 +949,10 @@ static pointer _get_cell(scheme *sc, pointer a, pointer b) {
assert (gc_enabled (sc));
if (sc->free_cell == sc->NIL) {
const int min_to_be_recovered = CELL_SEGSIZE / 4;
gc(sc,a, b);
if (sc->fcells < min_to_be_recovered
|| sc->free_cell == sc->NIL) {
/* if only a few recovered, get more to avoid fruitless gc's */
if (!alloc_cellseg(sc,1) && sc->free_cell == sc->NIL) {
sc->no_memory=1;
return sc->sink;
}
if (sc->free_cell == sc->NIL) {
sc->no_memory=1;
return sc->sink;
}
}
x = sc->free_cell;
@ -1746,6 +1741,11 @@ static void gc(scheme *sc, pointer a, pointer b) {
snprintf(msg,80,"done: %ld cells were recovered.\n", sc->fcells);
putstr(sc,msg);
}
/* if only a few recovered, get more to avoid fruitless gc's */
if (sc->fcells < CELL_MINRECOVER
&& alloc_cellseg(sc, 1) == 0)
sc->no_memory = 1;
}
static void finalize_cell(scheme *sc, pointer a) {