From: Dmitry Volyntsev Date: Sat, 22 Oct 2022 01:48:39 +0000 (-0700) Subject: Added njs.memoryStats object. X-Git-Tag: 0.7.8~2 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=bcdd02dd316099922c2553cd468d6c1991a2a916;p=njs.git Added njs.memoryStats object. njs.memoryStats.size is a number of bytes a VM claimed from the OS. --- diff --git a/src/njs_builtin.c b/src/njs_builtin.c index 65350e5b..4821174e 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -911,6 +911,69 @@ njs_ext_on(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, } +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_object_properties[] = .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 --git a/src/njs_mp.c b/src/njs_mp.c index 86b44d96..5be4b7e7 100644 --- a/src/njs_mp.c +++ b/src/njs_mp.c @@ -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 --git a/src/njs_mp.h b/src/njs_mp.h index 3dbf989d..43d3272f 100644 --- a/src/njs_mp.h +++ b/src/njs_mp.h @@ -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(size_t cluster_size, 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 --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 1e1e4532..b8818b44 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -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(