details: https://hg.nginx.org/njs/rev/99afe1a7f71d branches: changeset: 1693:99afe1a7f71d user: Dmitry Volyntsev <xei...@nginx.com> date: Tue Aug 31 13:16:43 2021 +0000 description: Memory: added cleanup handlers support.
diffstat: src/njs_mp.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/njs_mp.h | 10 ++++++++++ 2 files changed, 51 insertions(+), 0 deletions(-) diffs (96 lines): diff -r 4c0b2392a5ef -r 99afe1a7f71d src/njs_mp.c --- a/src/njs_mp.c Tue Aug 31 13:16:42 2021 +0000 +++ b/src/njs_mp.c Tue Aug 31 13:16:43 2021 +0000 @@ -106,6 +106,8 @@ struct njs_mp_s { uint32_t page_alignment; uint32_t cluster_size; + njs_mp_cleanup_t *cleanup; + njs_mp_slot_t slots[]; }; @@ -251,10 +253,18 @@ njs_mp_destroy(njs_mp_t *mp) { void *p; njs_mp_block_t *block; + njs_mp_cleanup_t *c; njs_rbtree_node_t *node, *next; njs_debug_alloc("mp destroy\n"); + for (c = mp->cleanup; c != NULL; c = c->next) { + if (c->handler != NULL) { + njs_debug_alloc("mp run cleanup: @%p\n", c); + c->handler(c->data); + } + } + next = njs_rbtree_root(&mp->blocks); while (next != njs_rbtree_sentinel(&mp->blocks)) { @@ -606,6 +616,37 @@ njs_mp_rbtree_compare(njs_rbtree_node_t } +njs_mp_cleanup_t * +njs_mp_cleanup_add(njs_mp_t *mp, size_t size) +{ + njs_mp_cleanup_t *c; + + c = njs_mp_alloc(mp, sizeof(njs_mp_cleanup_t)); + if (njs_slow_path(c == NULL)) { + return NULL; + } + + if (size) { + c->data = njs_mp_alloc(mp, size); + if (njs_slow_path(c->data == NULL)) { + return NULL; + } + + } else { + c->data = NULL; + } + + c->handler = NULL; + c->next = mp->cleanup; + + mp->cleanup = c; + + njs_debug_alloc("mp add cleanup: @%p\n", c); + + return c; +} + + void njs_mp_free(njs_mp_t *mp, void *p) { diff -r 4c0b2392a5ef -r 99afe1a7f71d src/njs_mp.h --- a/src/njs_mp.h Tue Aug 31 13:16:42 2021 +0000 +++ b/src/njs_mp.h Tue Aug 31 13:16:43 2021 +0000 @@ -9,6 +9,15 @@ typedef struct njs_mp_s njs_mp_t; +typedef struct njs_mp_cleanup_s njs_mp_cleanup_t; + +typedef void (*njs_mp_cleanup_pt)(void *data); + +struct njs_mp_cleanup_s { + njs_mp_cleanup_pt handler; + void *data; + njs_mp_cleanup_t *next; +}; NJS_EXPORT njs_mp_t *njs_mp_create(size_t cluster_size, size_t page_alignment, @@ -28,6 +37,7 @@ NJS_EXPORT void *njs_mp_align(njs_mp_t * NJS_EXPORT void *njs_mp_zalign(njs_mp_t *mp, size_t alignment, size_t size) NJS_MALLOC_LIKE; +NJS_EXPORT njs_mp_cleanup_t *njs_mp_cleanup_add(njs_mp_t *mp, size_t size); NJS_EXPORT void njs_mp_free(njs_mp_t *mp, void *p); _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel