summaryrefslogtreecommitdiffstats
path: root/tests/gpgscm
diff options
context:
space:
mode:
authorJustus Winter <justus@g10code.com>2017-04-20 15:04:52 +0200
committerJustus Winter <justus@g10code.com>2017-04-24 14:14:01 +0200
commit245860ecaf8b9e82ca577385abd453ac92ffcd26 (patch)
tree2d3f978209d91a9999cb37ba2134c3c0ea4e537f /tests/gpgscm
parentg13: Fix for Solaris. (diff)
downloadgnupg2-245860ecaf8b9e82ca577385abd453ac92ffcd26.tar.xz
gnupg2-245860ecaf8b9e82ca577385abd453ac92ffcd26.zip
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>
Diffstat (limited to 'tests/gpgscm')
-rw-r--r--tests/gpgscm/scheme-private.h7
-rw-r--r--tests/gpgscm/scheme.c16
2 files changed, 15 insertions, 8 deletions
diff --git a/tests/gpgscm/scheme-private.h b/tests/gpgscm/scheme-private.h
index 075dc70e9..bc0269ad2 100644
--- a/tests/gpgscm/scheme-private.h
+++ b/tests/gpgscm/scheme-private.h
@@ -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. */
diff --git a/tests/gpgscm/scheme.c b/tests/gpgscm/scheme.c
index 933dc4552..11f6fcb0c 100644
--- a/tests/gpgscm/scheme.c
+++ b/tests/gpgscm/scheme.c
@@ -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) {