}
+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)
.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),
+ },
+
};
}
+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)
{
};
+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,
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;
{ 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(