details: https://hg.nginx.org/njs/rev/ebc48ac9f656 branches: changeset: 1980:ebc48ac9f656 user: Dmitry Volyntsev <xei...@nginx.com> date: Fri Oct 21 18:48:39 2022 -0700 description: Added njs.memoryStats object.
njs.memoryStats.size is a number of bytes a VM claimed from the OS. diffstat: src/njs_builtin.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ src/njs_mp.c | 24 ++++++++++++++++ src/njs_mp.h | 9 ++++++ src/test/njs_unit_test.c | 16 ++++++++++ 4 files changed, 119 insertions(+), 0 deletions(-) diffs (173 lines): diff -r c42cdba1626d -r ebc48ac9f656 src/njs_builtin.c --- a/src/njs_builtin.c Fri Oct 21 18:48:39 2022 -0700 +++ b/src/njs_builtin.c Fri Oct 21 18:48:39 2022 -0700 @@ -912,6 +912,69 @@ njs_ext_on(njs_vm_t *vm, njs_value_t *ar static njs_int_t +njs_ext_memory_stats(njs_vm_t *vm, njs_object_prop_t *prop, + njs_value_t *unused, njs_value_t *unused2, njs_value_t *retval) +{ + njs_int_t ret; + njs_value_t object, value; + njs_object_t *stat; + njs_mp_stat_t mp_stat; + + static const njs_value_t size_string = njs_string("size"); + static const njs_value_t nblocks_string = njs_string("nblocks"); + static const njs_value_t page_string = njs_string("page_size"); + static const njs_value_t cluster_string = njs_string("cluster_size"); + + stat = njs_object_alloc(vm); + if (njs_slow_path(stat == NULL)) { + return NJS_ERROR; + } + + njs_set_object(&object, stat); + + njs_mp_stat(vm->mem_pool, &mp_stat); + + njs_set_number(&value, mp_stat.size); + + ret = njs_value_property_set(vm, &object, njs_value_arg(&size_string), + &value); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + + njs_set_number(&value, mp_stat.nblocks); + + ret = njs_value_property_set(vm, &object, njs_value_arg(&nblocks_string), + &value); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + + njs_set_number(&value, mp_stat.cluster_size); + + ret = njs_value_property_set(vm, &object, njs_value_arg(&cluster_string), + &value); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + + njs_set_number(&value, mp_stat.page_size); + + ret = njs_value_property_set(vm, &object, njs_value_arg(&page_string), + &value); + if (njs_slow_path(ret != NJS_OK)) { + return NJS_ERROR; + } + + njs_set_object(retval, stat); + + return NJS_OK; +} + + + + +static njs_int_t njs_global_this_prop_handler(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *global, njs_value_t *setval, njs_value_t *retval) { @@ -1725,6 +1788,13 @@ static const njs_object_prop_t njs_njs_ .value = njs_native_function(njs_ext_on, 0), .configurable = 1, }, + + { + .type = NJS_PROPERTY_HANDLER, + .name = njs_string("memoryStats"), + .value = njs_prop_handler(njs_ext_memory_stats), + }, + }; diff -r c42cdba1626d -r ebc48ac9f656 src/njs_mp.c --- a/src/njs_mp.c Fri Oct 21 18:48:39 2022 -0700 +++ b/src/njs_mp.c Fri Oct 21 18:48:39 2022 -0700 @@ -285,6 +285,30 @@ njs_mp_destroy(njs_mp_t *mp) } +void +njs_mp_stat(njs_mp_t *mp, njs_mp_stat_t *stat) +{ + njs_mp_block_t *block; + njs_rbtree_node_t *node; + + stat->size = 0; + stat->nblocks = 0; + stat->cluster_size = mp->cluster_size; + stat->page_size = mp->page_size; + + node = njs_rbtree_min(&mp->blocks); + + while (njs_rbtree_is_there_successor(&mp->blocks, node)) { + block = (njs_mp_block_t *) node; + + stat->nblocks++; + stat->size += block->size; + + node = njs_rbtree_node_successor(&mp->blocks, node); + } +} + + void * njs_mp_alloc(njs_mp_t *mp, size_t size) { diff -r c42cdba1626d -r ebc48ac9f656 src/njs_mp.h --- a/src/njs_mp.h Fri Oct 21 18:48:39 2022 -0700 +++ b/src/njs_mp.h Fri Oct 21 18:48:39 2022 -0700 @@ -20,6 +20,14 @@ struct njs_mp_cleanup_s { }; +typedef struct { + size_t size; + size_t nblocks; + size_t page_size; + size_t cluster_size; +} njs_mp_stat_t; + + NJS_EXPORT njs_mp_t *njs_mp_create(size_t cluster_size, size_t page_alignment, size_t page_size, size_t min_chunk_size) NJS_MALLOC_LIKE; NJS_EXPORT njs_mp_t * njs_mp_fast_create(size_t cluster_size, @@ -27,6 +35,7 @@ NJS_EXPORT njs_mp_t * njs_mp_fast_create NJS_MALLOC_LIKE; NJS_EXPORT njs_bool_t njs_mp_is_empty(njs_mp_t *mp); NJS_EXPORT void njs_mp_destroy(njs_mp_t *mp); +NJS_EXPORT void njs_mp_stat(njs_mp_t *mp, njs_mp_stat_t *stat); NJS_EXPORT void *njs_mp_alloc(njs_mp_t *mp, size_t size) NJS_MALLOC_LIKE; diff -r c42cdba1626d -r ebc48ac9f656 src/test/njs_unit_test.c --- a/src/test/njs_unit_test.c Fri Oct 21 18:48:39 2022 -0700 +++ b/src/test/njs_unit_test.c Fri Oct 21 18:48:39 2022 -0700 @@ -18239,6 +18239,22 @@ static njs_unit_test_t njs_test[] = { njs_str("njs.on('exit', ()=>{}); 1"), njs_str("1") }, + /* njs.memoryStats. */ + + { njs_str("Object.keys(njs.memoryStats).sort()"), + njs_str("cluster_size,nblocks,page_size,size") }, + + { njs_str("typeof njs.memoryStats.size"), + njs_str("number") }, + + { njs_str("njs.memoryStats.size > 4096"), + njs_str("true") }, + + { njs_str("var size = njs.memoryStats.size;" + "new Array(2**15);" + "njs.memoryStats.size > size"), + njs_str("true") }, + /* Built-in methods name. */ { njs_str( _______________________________________________ nginx-devel mailing list -- nginx-devel@nginx.org To unsubscribe send an email to nginx-devel-le...@nginx.org