From bd43bd6f1ae1b1ec7ee6873d9fd6766b049802e9 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 8 Apr 2023 20:24:44 +0000 Subject: libc: Add poolreset() function This is intended for the secrmem pool in the kernel, but could also be used for temporary pools to recover the memory used by the arenas. --- sys/src/libc/port/mkfile | 2 ++ sys/src/libc/port/pool.c | 37 +++++++++++++++++++++++++++++++++++++ sys/src/libmemdraw/mkfile | 2 ++ 3 files changed, 41 insertions(+) (limited to 'sys/src') diff --git a/sys/src/libc/port/mkfile b/sys/src/libc/port/mkfile index 557f1d7fa..683e6c583 100644 --- a/sys/src/libc/port/mkfile +++ b/sys/src/libc/port/mkfile @@ -131,6 +131,8 @@ UPDATE=mkfile\ profile.$O: /sys/include/tos.h +malloc.$O pool.$O: /sys/include/pool.h + runenorm.$O: runenormdata runenorm.c runetotype.$O: runetotypedata runetotype.c runeistype.$O: runeistypedata runeistype.c diff --git a/sys/src/libc/port/pool.c b/sys/src/libc/port/pool.c index 546d5776a..34254f7f5 100644 --- a/sys/src/libc/port/pool.c +++ b/sys/src/libc/port/pool.c @@ -1345,6 +1345,43 @@ poolisoverlap(Pool *p, void *v, ulong n) return a != nil; } +void +poolreset(Pool *p) +{ + Arena *a; + + if(p == nil) + return; + + p->lock(p); + paranoia { + poolcheckl(p); + } + verbosity { + pooldumpl(p); + } + p->cursize = 0; + p->curfree = 0; + p->curalloc = 0; + p->lastcompact = p->nfree = 0; + p->freeroot = nil; + a = p->arenalist; + p->arenalist = nil; + LOG(p, "poolreset %p\n", p); + p->unlock(p); + + while(a != nil){ + Arena *next = a->down; + ulong asize = a->asize; + antagonism { + memmark(a, 0xFF, asize); + } + if(p->free) + p->free(a, asize); + a = next; + } +} + /* * Debugging */ diff --git a/sys/src/libmemdraw/mkfile b/sys/src/libmemdraw/mkfile index 584396a46..cf882b4b6 100644 --- a/sys/src/libmemdraw/mkfile +++ b/sys/src/libmemdraw/mkfile @@ -29,6 +29,8 @@ UPDATE=\