]> git.kaiwu.me - njs.git/commitdiff
Added njs.memoryStats object.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 22 Oct 2022 01:48:39 +0000 (18:48 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 22 Oct 2022 01:48:39 +0000 (18:48 -0700)
njs.memoryStats.size is a number of bytes a VM claimed from the OS.

src/njs_builtin.c
src/njs_mp.c
src/njs_mp.h
src/test/njs_unit_test.c

index 65350e5b91451689bd88438ebc0eac4bde10eef6..4821174e4e82ef5a90a5cdb574f9fce53007eaf4 100644 (file)
@@ -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),
+    },
+
 };
 
 
index 86b44d96c68de6acc560a101e45ef31cbe30cfea..5be4b7e71ac9591933371ce449eff6a272b59044 100644 (file)
@@ -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)
 {
index 3dbf989d6c73ecfa6914b422ed262743016c7e38..43d3272f93387909581b33d56e5e7a2c3de95192 100644 (file)
@@ -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;
index 1e1e453249cb33c67eaf9b2239607e2723bc329b..b8818b4400d2ec1acb3a79a7799729f7bb44bf22 100644 (file)
@@ -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(