aboutsummaryrefslogtreecommitdiff
Commit message (Expand)AuthorAge
...
* Log server shutdown using actionstream (#7589)ClobberXD2018-07-28
* Fix build on gcc 5.0 (#7586)zeuner2018-07-26
* Lua_api.txt: Various improvements (#7582)pauloue2018-07-26
* Replace apt-get with apt (#7583)niansa2018-07-25
* Settings: Fix indents, chat_message_*. Update translations (#7580)SmallJoker2018-07-25
* Allow an optional readonly base database (#7544)lhofhansl2018-07-25
* Add a MSVC / Windows compatible snprintf function (#7353)nOOb31672018-07-22
* Update gradle android tool to 3.1.3Loic Blot2018-07-22
* Update Android defaults for modern H/W. (#7572)lhofhansl2018-07-22
* Optimize ABM checks.Lars Hofhansl2018-07-21
* Disable shaders GUI on unsupported drivers (#7563)Vitaliy2018-07-21
* Update mip mapping and textarea documentation (#7315)HybridDog2018-07-19
* CSM: Disallow exploitable clientside mod functions by default (#7547)Paramat2018-07-19
* Mgvalleys: Make river depth variation and humidity drop optional (#7532)Paramat2018-07-18
* Builtin: Replace deprecated function calls (#7561)SmallJoker2018-07-17
* Check if player exists on use of /privs (#7554)ClobberXD2018-07-16
* Lua_api.txt: Various minor improvements (#7560)Paramat2018-07-16
* Remove legacy client handling code.Lars Hofhansl2018-07-14
* Make player liquid speed independent of FPS (#7543)Paramat2018-07-14
* Document config updates in minetest.conf.example.Lars Hofhansl2018-07-13
* Adjust some settings to modern environments and networks. (#7549)lhofhansl2018-07-13
* Fix bug setting channel window size.Lars Hofhansl2018-07-13
* Ensure that legacy mode is correctly disabled.Lars Hofhansl2018-07-13
* Reduce block load glitchesLars Hofhansl2018-07-12
* Android: Add 'aux' button (#7477)Muhammad Rifqi Priyo Susanto2018-07-10
* Formspecs: Remove accidental empty 'quit' fieldSmallJoker2018-07-10
* core.spawn_falling_node: Keep metadata (#7476)SmallJoker2018-07-09
* Builtin/../misc.lua: Replace minetest. with core., improve codestyle (#7540)ClobberXD2018-07-09
* Lua templating reading (part 4): s16, v2s16, v2f (#7512)Loïc Blot2018-07-08
* Revert 6587 - Optimize entity-entity collision (#7539)lhofhansl2018-07-08
* Lua_api.txt: Formatting and grammar fixes (#7534)pauloue2018-07-08
* Lua_api.txt: Improve section titles, clarify sections (#7533)Paramat2018-07-06
* Fix memory leak in guiConfirmRegistrationHybridDog2018-07-06
* Run code style linter first (#7213)rubenwardy2018-07-05
* Zoom: Correctly verify client passed zoom at the server (#7526)lhofhansl2018-07-03
* Drop ClientEvent CEE_PLAYER_BREATH: triggering function is not called.Loic Blot2018-07-01
* Log deprecated Lua function calls (#7491)SmallJoker2018-07-01
* Make the server status message customizable (#7357)SmallJoker2018-07-01
* Backport Android cleanup parts from #7123 (#7513)Loïc Blot2018-07-01
* Android: Resize jump and sneak buttons' touch target (#7498)Muhammad Rifqi Priyo Susanto2018-06-30
* Modernize lua read (part 2 & 3): C++ templating assurance (#7410)Loïc Blot2018-06-30
* Fix memory leaks in mod storage (#7500)red-0012018-06-30
* Fix world deletion (#7494)Vitaliy2018-06-30
* Log usage of /pulverize (#7503)Anand S2018-06-30
* Removed '$' symbols from the start of shell commands. (#7506)RustyRaptor2018-06-30
* Fix a memleak before assertion in l_get_mod_storageLoic Blot2018-06-30
* Bump android version to 20Loic Blot2018-06-28
* Update cURL (7.60.0) & SQLite3 (3.24.0)Loic Blot2018-06-28
* Mgvalleys: Fix 'mgvalleys_spflags' setting name (#7495)Paramat2018-06-28
* Fix mod channels crash (#7481)red-0012018-06-27
number then return "N/A" end return sprintf(fmt or "%d", number) end local Formatter = { new = function(self, object) object = object or {} object.out = {} -- output buffer self.__index = self return setmetatable(object, self) end, __tostring = function (self) return table.concat(self.out, LINE_DELIM) end, print = function(self, text, ...) if (...) then text = sprintf(text, ...) end if text then -- Avoid format unicode issues. text = text:gsub("Ms", "µs") end table.insert(self.out, text or LINE_DELIM) end, flush = function(self) table.insert(self.out, LINE_DELIM) local text = table.concat(self.out, LINE_DELIM) self.out = {} return text end } local widths = { 55, 9, 9, 9, 5, 5, 5 } local txt_row_format = sprintf(" %%-%ds | %%%ds | %%%ds | %%%ds | %%%ds | %%%ds | %%%ds", unpack(widths)) local HR = {} for i=1, #widths do HR[i]= rep("-", widths[i]) end -- ' | ' should break less with github than '-+-', when people are pasting there HR = sprintf("-%s-", table.concat(HR, " | ")) local TxtFormatter = Formatter:new { format_row = function(self, modname, instrument_name, statistics) local label if instrument_name then label = shorten(instrument_name, widths[1] - 5) label = sprintf(" - %s %s", label, rep(".", widths[1] - 5 - label:len())) else -- Print mod_stats label = shorten(modname, widths[1] - 2) .. ":" end self:print(txt_row_format, label, format_number(statistics.time_min), format_number(statistics.time_max), format_number(statistics:get_time_avg()), format_number(statistics.part_min, "%.1f"), format_number(statistics.part_max, "%.1f"), format_number(statistics:get_part_avg(), "%.1f") ) end, format = function(self, filter) local profile = self.profile self:print("Values below show absolute/relative times spend per server step by the instrumented function.") self:print("A total of %d samples were taken", profile.stats_total.samples) if filter then self:print("The output is limited to '%s'", filter) end self:print() self:print( txt_row_format, "instrumentation", "min Ms", "max Ms", "avg Ms", "min %", "max %", "avg %" ) self:print(HR) for modname,mod_stats in pairs(profile.stats) do if filter_matches(filter, modname) then self:format_row(modname, nil, mod_stats) if mod_stats.instruments ~= nil then for instrument_name, instrument_stats in pairs(mod_stats.instruments) do self:format_row(nil, instrument_name, instrument_stats) end end end end self:print(HR) if not filter then self:format_row("total", nil, profile.stats_total) end end } local CsvFormatter = Formatter:new { format_row = function(self, modname, instrument_name, statistics) self:print( "%q,%q,%d,%d,%d,%d,%d,%f,%f,%f", modname, instrument_name, statistics.samples, statistics.time_min, statistics.time_max, statistics:get_time_avg(), statistics.time_all, statistics.part_min, statistics.part_max, statistics:get_part_avg() ) end, format = function(self, filter) self:print( "%q,%q,%q,%q,%q,%q,%q,%q,%q,%q", "modname", "instrumentation", "samples", "time min µs", "time max µs", "time avg µs", "time all µs", "part min %", "part max %", "part avg %" ) for modname, mod_stats in pairs(self.profile.stats) do if filter_matches(filter, modname) then self:format_row(modname, "*", mod_stats) if mod_stats.instruments ~= nil then for instrument_name, instrument_stats in pairs(mod_stats.instruments) do self:format_row(modname, instrument_name, instrument_stats) end end end end end } local function format_statistics(profile, format, filter) local formatter if format == "csv" then formatter = CsvFormatter:new { profile = profile } else formatter = TxtFormatter:new { profile = profile } end formatter:format(filter) return formatter:flush() end --- -- Format the profile ready for display and -- @return string to be printed to the console -- function reporter.print(profile, filter) if filter == "" then filter = nil end return format_statistics(profile, "txt", filter) end --- -- Serialize the profile data and -- @return serialized data to be saved to a file -- local function serialize_profile(profile, format, filter) if format == "lua" or format == "json" or format == "json_pretty" then local stats = filter and {} or profile.stats if filter then for modname, mod_stats in pairs(profile.stats) do if filter_matches(filter, modname) then stats[modname] = mod_stats end end end if format == "lua" then return core.serialize(stats) elseif format == "json" then return core.write_json(stats) elseif format == "json_pretty" then return core.write_json(stats, true) end end -- Fall back to textual formats. return format_statistics(profile, format, filter) end local worldpath = core.get_worldpath() local function get_save_path(format, filter) local report_path = settings:get("profiler.report_path") or "" if report_path ~= "" then core.mkdir(sprintf("%s%s%s", worldpath, DIR_DELIM, report_path)) end return (sprintf( "%s/%s/profile-%s%s.%s", worldpath, report_path, os.date("%Y%m%dT%H%M%S"), filter and ("-" .. filter) or "", format ):gsub("[/\\]+", DIR_DELIM))-- Clean up delims end --- -- Save the profile to the world path. -- @return success, log message -- function reporter.save(profile, format, filter) if not format or format == "" then format = settings:get("profiler.default_report_format") or "txt" end if filter == "" then filter = nil end local path = get_save_path(format, filter) local output, io_err = io.open(path, "w") if not output then return false, "Saving of profile failed with: " .. io_err end local content, err = serialize_profile(profile, format, filter) if not content then output:close() return false, "Saving of profile failed with: " .. err end output:write(content) output:close() local logmessage = "Profile saved to " .. path core.log("action", logmessage) return true, logmessage end return reporter