Hi, Sergey, thanks for review! On 19.02.2025 11:06, Sergey Kaplun via Tarantool-patches wrote: > Hi, Sergey! > Thanks for the patch! > LGTM, after fixing minor nits below. > > On 13.02.25, Sergey Bronnikov wrote: >> sysprof and memprof Lua API functions returns an error message > Typo: s/returns/return/ Fixed. > >> "profiler misuse", when appropriate profiler is disabled in build. > Typo: s/appropriate/the corresponding/ > Typo: s/build/the build/ Fixed. > >> It is not possible to easily distinquish whether it is really > Typo: s/distinquish/distinguish/ Fixed. > >> misuse or profiler was not enabled in build. The patch changes > Typo: s/profiler/or if the profiler/ > Typo: s/build/the build/ Fixed. > >> errors messages, so when profiler was not enabled in build message > Typo: s/errors/error/ > Typo: s/profiler/a profiler/ > Typo: s/was/is/ > Typo: s/in build message/in the build, the message/ Fixed. > >> is the following: "profiler misuse: profiler is disabled". >> --- >> src/lib_misc.c | 27 ++++++++++++++++- >> src/lj_errmsg.h | 1 + >> .../misclib-memprof-lapi-disabled.test.lua | 22 ++++++++++++++ >> .../misclib-sysprof-lapi-disabled.test.lua | 29 +++++++++++++++++++ >> 4 files changed, 78 insertions(+), 1 deletion(-) >> create mode 100644 test/tarantool-tests/profilers/misclib-memprof-lapi-disabled.test.lua >> create mode 100644 test/tarantool-tests/profilers/misclib-sysprof-lapi-disabled.test.lua >> >> diff --git a/src/lib_misc.c b/src/lib_misc.c >> index d71904e4..7666d85f 100644 >> --- a/src/lib_misc.c >> +++ b/src/lib_misc.c >> @@ -315,10 +315,15 @@ static int sysprof_error(lua_State *L, int status, const char *err_details) >> /* local res, err, errno = sysprof.start(options) */ >> LJLIB_CF(misc_sysprof_start) >> { >> + const char *err_details = NULL; >> +#if !LJ_HASSYSPROF > It's more LuaJIT-way to use something like the following: > | if (!LJ_HASSYSPROF) { > | /* ... */ > | } > > This helps to avoid strange early return. Fixed. > Also, please be avaired to declare all variables (stataus, opt, > err_details) in the beginning of the block.  It is a requirement for the code that strictly follows c89, when you must declare all of your variables at the beginning of a scope block. AFAIK, we have no such requirement, and also there is no option "-std=c89" in CI and no any mentions in the contribution guide. > > Here and below. > >> + err_details = err2msg(LJ_ERR_PROF_DETAILS_DISABLED); >> + return sysprof_error(L, PROFILE_ERRUSE, err_details); >> +#endif /* !LJ_HASSYSPROF */ >> + >> int status = PROFILE_SUCCESS; >> >> struct luam_Sysprof_Options opt = {}; >> - const char *err_details = NULL; >> >> status = parse_sysprof_opts(L, &opt, &err_details); >> if (LJ_UNLIKELY(status != PROFILE_SUCCESS)) >> @@ -336,6 +341,11 @@ LJLIB_CF(misc_sysprof_start) >> /* local res, err, errno = profile.sysprof_stop() */ >> LJLIB_CF(misc_sysprof_stop) >> { >> +#if !LJ_HASSYSPROF >> + const char *err_details = NULL; >> + err_details = err2msg(LJ_ERR_PROF_DETAILS_DISABLED); > Looks like we just can do the following for this block: > > | const char *err_details = err2msg(LJ_ERR_PROF_DETAILS_DISABLED); > > Here and below. Fixed. > >> + return sysprof_error(L, PROFILE_ERRUSE, err_details); >> +#endif /* !LJ_HASSYSPROF */ >> int status = luaM_sysprof_stop(L); >> if (LJ_UNLIKELY(status != PROFILE_SUCCESS)) >> return sysprof_error(L, status, NULL); >> @@ -347,6 +357,11 @@ LJLIB_CF(misc_sysprof_stop) >> /* local counters, err, errno = sysprof.report() */ >> LJLIB_CF(misc_sysprof_report) >> { >> +#if !LJ_HASSYSPROF >> + const char *err_details = NULL; >> + err_details = err2msg(LJ_ERR_PROF_DETAILS_DISABLED); >> + return sysprof_error(L, PROFILE_ERRUSE, err_details); >> +#endif /* !LJ_HASSYSPROF */ >> struct luam_Sysprof_Counters counters = {}; >> GCtab *data_tab = NULL; >> GCtab *count_tab = NULL; >> @@ -386,6 +401,11 @@ LJLIB_CF(misc_sysprof_report) >> /* local started, err, errno = misc.memprof.start(fname) */ >> LJLIB_CF(misc_memprof_start) >> { >> +#if !LJ_HASMEMPROF >> + const char *err_details = NULL; >> + err_details = err2msg(LJ_ERR_PROF_DETAILS_DISABLED); >> + return sysprof_error(L, PROFILE_ERRUSE, err_details); >> +#endif /* !LJ_HASMEMPROF */ >> struct lj_memprof_options opt = {0}; >> const char *fname = strdata(lj_lib_checkstr(L, 1)); >> struct profile_ctx *ctx; >> @@ -440,6 +460,11 @@ LJLIB_CF(misc_memprof_start) >> /* local stopped, err, errno = misc.memprof.stop() */ >> LJLIB_CF(misc_memprof_stop) >> { >> +#if !LJ_HASMEMPROF >> + const char *err_details = NULL; >> + err_details = err2msg(LJ_ERR_PROF_DETAILS_DISABLED); >> + return sysprof_error(L, PROFILE_ERRUSE, err_details); >> +#endif /* !LJ_HASMEMPROF */ >> int status = lj_memprof_stop(L); >> if (status != PROFILE_SUCCESS) { >> switch (status) { >> diff --git a/src/lj_errmsg.h b/src/lj_errmsg.h >> index b5c3a275..e26f5e38 100644 >> --- a/src/lj_errmsg.h >> +++ b/src/lj_errmsg.h >> @@ -193,6 +193,7 @@ ERRDEF(PROF_DETAILS_BADINTERVAL, "profiler interval must be greater than 1") >> ERRDEF(PROF_DETAILS_BADPATH, "profiler path does not exist") >> ERRDEF(PROF_DETAILS_BADTABLE, "profiler expects a table with parameters") >> >> +ERRDEF(PROF_DETAILS_DISABLED, "profiler is disabled") > I suppose this should be declared under `#else` directive (i.e. if we > have at least one profiler disabled). err message is required by code for checking disabled profilers (see above) > >> #undef ERRDEF >> >> /* Detecting unused error messages: >> diff --git a/test/tarantool-tests/profilers/misclib-memprof-lapi-disabled.test.lua b/test/tarantool-tests/profilers/misclib-memprof-lapi-disabled.test.lua >> new file mode 100644 >> index 00000000..a0669cc6 >> --- /dev/null >> +++ b/test/tarantool-tests/profilers/misclib-memprof-lapi-disabled.test.lua >> @@ -0,0 +1,22 @@ >> +local tap = require("tap") > Please use single quotes everywhere across this file for the > consistency. Fixed. >> +local test = tap.test("misclib-memprof-lapi-disabled"):skipcond({ >> + ["Memprof is enabled"] = not os.getenv('LUAJIT_DISABLE_MEMPROF'), >> +}) >> + >> +test:plan(6) >> + >> +-- Attempt to start memprof when memprof is disabled. > Minor: s/start memprof when memprof/start memprof when it/ > Fixed. >> +local res, err, errno = misc.memprof.start() >> +test:is(res, nil, "result status on start when memprof is disabled") >> +test:ok(err:match("profiler is disabled"), >> + "error on start when memprof is disabled") >> +test:ok(type(errno) == "number", "errno on start when memprof is disabled") >> + >> +-- Attempt to stop memprof when memprof is disabled. > Minor: s/stop memprof when memprof/stop memprof when it/ Fixed. > >> +res, err, errno = misc.memprof.stop() >> +test:is(res, nil, "result status on stop when memprof is disabled") >> +test:ok(err:match("profiler is disabled"), >> + "error on stop when memprof is disabled") >> +test:ok(type(errno) == "number", "errno on start when memprof is disabled") >> + >> +test:done(true) >> diff --git a/test/tarantool-tests/profilers/misclib-sysprof-lapi-disabled.test.lua b/test/tarantool-tests/profilers/misclib-sysprof-lapi-disabled.test.lua >> new file mode 100644 >> index 00000000..79707434 >> --- /dev/null >> +++ b/test/tarantool-tests/profilers/misclib-sysprof-lapi-disabled.test.lua >> @@ -0,0 +1,29 @@ >> +local tap = require("tap") > Please use single quotes everywhere across this file for the > consistency. Fixed. >> +local test = tap.test("misclib-sysprof-lapi-disabled"):skipcond({ >> + ["Sysprof is enabled"] = not os.getenv('LUAJIT_DISABLE_SYSPROF'), >> +}) >> + >> +test:plan(9) >> + >> +-- Attempt to start sysprof when sysprof is disabled. >> +local res, err, errno = misc.sysprof.start() >> +test:is(res, nil, "result status on start when sysprof is disabled") >> +test:ok(err:match("profiler is disabled"), >> + "error on start when sysprof is disabled") >> +test:ok(type(errno) == "number", "errno on start when sysprof is disabled") >> + >> +-- Attempt to stop sysprof when sysprof is disabled. >> +res, err, errno = misc.sysprof.stop() >> +test:is(res, nil, "result status on stop when sysprof is disabled") >> +test:ok(err:match("profiler is disabled"), >> + "error on stop when sysprof is disabled") >> +test:ok(type(errno) == "number", "errno on start when sysprof is disabled") >> + >> +-- Attempt to report when sysprof is disabled. >> +res, err, errno = misc.sysprof.report() >> +test:is(res, nil, "result status on report when sysprof is disabled") >> +test:ok(err:match("profiler is disabled"), >> + "error on stop when sysprof is disabled") >> +test:ok(type(errno) == "number", "errno on start when sysprof is disabled") >> + >> +test:done(true) >> -- >> 2.34.1 >>