From 7adb34810ee142a7f104584a83765fcb73ba4427 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Mon, 1 Jun 2015 18:42:21 -0700 Subject: [PATCH] use pools for dt_t and code allocation --- src/backend/code.c | 43 ++++++++++++++++++++++++------------ src/backend/dt.c | 54 +++++++++++++++++++++++++++++----------------- 2 files changed, 63 insertions(+), 34 deletions(-) diff --git a/src/backend/code.c b/src/backend/code.c index 46372f076d9c..1733099391e4 100644 --- a/src/backend/code.c +++ b/src/backend/code.c @@ -1,5 +1,5 @@ // Copyright (C) 1987-1998 by Symantec -// Copyright (C) 2000-2013 by Digital Mars +// Copyright (C) 2000-2015 by Digital Mars // All Rights Reserved // http://www.digitalmars.com // Written by Walter Bright @@ -30,11 +30,20 @@ code *code_calloc() { //printf("code %d\n", sizeof(code)); code *c = code_list; - if (c) - code_list = code_next(c); - else - c = (code *)mem_fmalloc(sizeof(*c)); + if (!c) + { + const size_t n = 4096 / sizeof(*c); + code *chunk = (code *)mem_fmalloc(n * sizeof(code)); + for (size_t i = 0; i < n - 1; ++i) + { + code_next(&chunk[i]) = &chunk[i + 1]; + } + code_next(&chunk[n - 1]) = NULL; + code_list = chunk; + c = chunk; + } + code_list = code_next(c); MEMCLEAR(c, sizeof(*c)); //dbg_printf("code_calloc: %p\n",c); @@ -47,18 +56,24 @@ code *code_calloc() */ void code_free(code *cstart) -{ code **pc; - code *c; - - for (pc = &cstart; (c = *pc) != NULL; pc = &code_next(c)) +{ + if (cstart) { - if (c->Iop == ASM) + code *c = cstart; + while (1) { - mem_free(c->IEV1.as.bytes); + if (c->Iop == ASM) + { + mem_free(c->IEV1.as.bytes); + } + code *cnext = code_next(c); + if (!cnext) + break; + c = cnext; } + code_next(c) = code_list; + code_list = cstart; } - *pc = code_list; - code_list = cstart; } /***************** @@ -73,7 +88,7 @@ void code_term() while (code_list) { cn = code_next(code_list); - mem_ffree(code_list); + //mem_ffree(code_list); code_list = cn; count++; } diff --git a/src/backend/dt.c b/src/backend/dt.c index d0f3973cc5b5..2a0d7d8ebc86 100644 --- a/src/backend/dt.c +++ b/src/backend/dt.c @@ -1,5 +1,5 @@ // Copyright (C) 1984-1998 by Symantec -// Copyright (C) 2000-2013 by Digital Mars +// Copyright (C) 2000-2015 by Digital Mars // All Rights Reserved // http://www.digitalmars.com // Written by Walter Bright @@ -33,17 +33,25 @@ static dt_t *dt_freelist; static dt_t *dt_calloc(int dtx) { - dt_t *dt; - static dt_t dtzero; - - if (dt_freelist) + dt_t *dt = dt_freelist; + if (!dt) { - dt = dt_freelist; - dt_freelist = dt->DTnext; - *dt = dtzero; + const size_t n = 4096 / sizeof(dt_t); + dt_t *chunk = (dt_t *)mem_fmalloc(n * sizeof(dt_t)); + for (size_t i = 0; i < n - 1; ++i) + { + chunk[i].DTnext = &chunk[i + 1]; + } + chunk[n - 1].DTnext = NULL; + dt_freelist = chunk; + dt = chunk; } - else - dt = (dt_t *) mem_fcalloc(sizeof(dt_t)); + + dt_freelist = dt->DTnext; +#ifdef DEBUG + memset(dt, 0xBE, sizeof(*dt)); +#endif + dt->DTnext = NULL; dt->dt = dtx; return dt; } @@ -53,19 +61,25 @@ static dt_t *dt_calloc(int dtx) */ void dt_free(dt_t *dt) -{ dt_t *dtn; - - for (; dt; dt = dtn) +{ + if (dt) { - switch (dt->dt) + dt_t *dtn = dt; + while (1) { - case DT_abytes: - case DT_nbytes: - mem_free(dt->DTpbytes); + switch (dtn->dt) + { + case DT_abytes: + case DT_nbytes: + mem_free(dtn->DTpbytes); + break; + } + dt_t *dtnext = dtn->DTnext; + if (!dtnext) break; + dtn = dtnext; } - dtn = dt->DTnext; - dt->DTnext = dt_freelist; + dtn->DTnext = dt_freelist; dt_freelist = dt; } } @@ -76,7 +90,7 @@ void dt_free(dt_t *dt) void dt_term() { -#if TERMCODE +#if 0 && TERMCODE dt_t *dtn; while (dt_freelist)