diff options
-rw-r--r-- | DOCS/man/stats.rst | 4 | ||||
-rw-r--r-- | player/javascript.c | 38 |
2 files changed, 41 insertions, 1 deletions
diff --git a/DOCS/man/stats.rst b/DOCS/man/stats.rst index 4f9496f4de..2cf730f673 100644 --- a/DOCS/man/stats.rst +++ b/DOCS/man/stats.rst @@ -212,6 +212,10 @@ are missing. Memory usage is approximate and does not reflect internal fragmentation. +JS scripts memory reporting is disabled by default because collecting the data +at the JS side has an overhead. It can be enabled by exporting the env var +``MPV_LEAK_REPORT=1`` before starting mpv, and will increase JS memory usage. + If entries have ``/time`` and ``/cpu`` variants, the former gives the real time (monotonic clock), while the latter the thread CPU time (only if the corresponding pthread API works and is supported). diff --git a/player/javascript.c b/player/javascript.c index be28ef9e66..7cffcbe119 100644 --- a/player/javascript.c +++ b/player/javascript.c @@ -33,6 +33,7 @@ #include "options/m_property.h" #include "common/msg.h" #include "common/msg_control.h" +#include "common/stats.h" #include "options/m_option.h" #include "input/input.h" #include "options/path.h" @@ -64,6 +65,8 @@ struct script_ctx { struct MPContext *mpctx; struct mp_log *log; char *last_error_str; + size_t js_malloc_size; + struct stats_ctx *stats; }; static struct script_ctx *jctx(js_State *J) @@ -458,6 +461,25 @@ static int s_init_js(js_State *J, struct script_ctx *ctx) return 0; } +static void *mp_js_alloc(void *actx, void *ptr, int size_) +{ + if (size_ < 0) + return NULL; + + struct script_ctx* ctx = actx; + size_t size = size_, osize = 0; + if (ptr) // free/realloc + osize = ta_get_size(ptr); + + void *ret = talloc_realloc_size(actx, ptr, size); + + if (!size || ret) { // free / successful realloc/malloc + ctx->js_malloc_size = ctx->js_malloc_size - osize + size; + stats_size_value(ctx->stats, "mem", ctx->js_malloc_size); + } + return ret; +} + /********************************************************************** * Initialization - booting the script *********************************************************************/ @@ -479,10 +501,24 @@ static int s_load_javascript(struct mp_script_args *args) .last_error_str = talloc_strdup(ctx, "Cannot initialize JavaScript"), .filename = args->filename, .path = args->path, + .js_malloc_size = 0, + .stats = stats_ctx_create(ctx, args->mpctx->global, + mp_tprintf(80, "script/%s", mpv_client_name(args->client))), }; + stats_register_thread_cputime(ctx->stats, "cpu"); + + js_Alloc alloc_fn = NULL; + void *actx = NULL; + + char *mem_report = getenv("MPV_LEAK_REPORT"); + if (mem_report && strcmp(mem_report, "1") == 0) { + alloc_fn = mp_js_alloc; + actx = ctx; + } + int r = -1; - js_State *J = js_newstate(NULL, NULL, 0); + js_State *J = js_newstate(alloc_fn, actx, 0); if (!J || s_init_js(J, ctx)) goto error_out; |