mirror of
git://git.gnupg.org/gnupg.git
synced 2025-04-11 22:01:08 +02: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
|
#ifndef CELL_SEGSIZE
|
||||||
#define CELL_SEGSIZE 5000 /* # of cells in one segment */
|
#define CELL_SEGSIZE 5000 /* # of cells in one segment */
|
||||||
#endif
|
#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;
|
struct cell_segment *cell_segments;
|
||||||
|
|
||||||
/* We use 4 registers. */
|
/* We use 4 registers. */
|
||||||
|
@ -949,15 +949,10 @@ static pointer _get_cell(scheme *sc, pointer a, pointer b) {
|
|||||||
|
|
||||||
assert (gc_enabled (sc));
|
assert (gc_enabled (sc));
|
||||||
if (sc->free_cell == sc->NIL) {
|
if (sc->free_cell == sc->NIL) {
|
||||||
const int min_to_be_recovered = CELL_SEGSIZE / 4;
|
|
||||||
gc(sc,a, b);
|
gc(sc,a, b);
|
||||||
if (sc->fcells < min_to_be_recovered
|
if (sc->free_cell == sc->NIL) {
|
||||||
|| sc->free_cell == sc->NIL) {
|
sc->no_memory=1;
|
||||||
/* if only a few recovered, get more to avoid fruitless gc's */
|
return sc->sink;
|
||||||
if (!alloc_cellseg(sc,1) && sc->free_cell == sc->NIL) {
|
|
||||||
sc->no_memory=1;
|
|
||||||
return sc->sink;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
x = sc->free_cell;
|
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);
|
snprintf(msg,80,"done: %ld cells were recovered.\n", sc->fcells);
|
||||||
putstr(sc,msg);
|
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) {
|
static void finalize_cell(scheme *sc, pointer a) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user