mirror of
git://git.gnupg.org/gnupg.git
synced 2025-01-30 16:17:02 +01:00
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:
parent
10519270d3
commit
245860ecaf
@ -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. */
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user