stand: lua: enhance lfs.dir() to speed up kernels_autodetect
This eliminates a lot of stat() calls that happen when lualoader renders the menu with the default settings, and greatly speeds up rendering on my laptop. ftype is nil if loader/loader.efi hasn't been updated yet, falling back to lfs.attributes() to test. This is technically incompatible with lfs, but not in a particularly terrible way. Reviewed-by: cem MFC-after: 4 days Differential Revision: https://reviews.freebsd.org/D27542
This commit is contained in:
parent
80a840b8ba
commit
e25ee296c9
@ -122,6 +122,27 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#define DIR_METATABLE "directory iterator metatable"
|
#define DIR_METATABLE "directory iterator metatable"
|
||||||
|
|
||||||
|
static int
|
||||||
|
lua_dir_iter_pushtype(lua_State *L __unused, const struct dirent *ent __unused)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a non-standard extension to luafilesystem for loader's
|
||||||
|
* benefit. The extra stat() calls to determine the entry type can
|
||||||
|
* be quite expensive on some systems, so this speeds up enumeration of
|
||||||
|
* /boot greatly by providing the type up front.
|
||||||
|
*
|
||||||
|
* This extension is compatible enough with luafilesystem, in that we're
|
||||||
|
* just using an extra return value for the iterator.
|
||||||
|
*/
|
||||||
|
#ifdef _STANDALONE
|
||||||
|
lua_pushinteger(L, ent->d_type);
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lua_dir_iter_next(lua_State *L)
|
lua_dir_iter_next(lua_State *L)
|
||||||
{
|
{
|
||||||
@ -144,7 +165,7 @@ lua_dir_iter_next(lua_State *L)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lua_pushstring(L, entry->d_name);
|
lua_pushstring(L, entry->d_name);
|
||||||
return 1;
|
return 1 + lua_dir_iter_pushtype(L, entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -420,5 +441,10 @@ luaopen_lfs(lua_State *L)
|
|||||||
{
|
{
|
||||||
register_metatable(L);
|
register_metatable(L);
|
||||||
luaL_newlib(L, fslib);
|
luaL_newlib(L, fslib);
|
||||||
|
#ifdef _STANDALONE
|
||||||
|
/* Non-standard extension for loader, used with lfs.dir(). */
|
||||||
|
lua_pushinteger(L, DT_DIR);
|
||||||
|
lua_setfield(L, -2, "DT_DIR");
|
||||||
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -240,14 +240,18 @@ function core.kernelList()
|
|||||||
-- Automatically detect other bootable kernel directories using a
|
-- Automatically detect other bootable kernel directories using a
|
||||||
-- heuristic. Any directory in /boot that contains an ordinary file
|
-- heuristic. Any directory in /boot that contains an ordinary file
|
||||||
-- named "kernel" is considered eligible.
|
-- named "kernel" is considered eligible.
|
||||||
for file in lfs.dir("/boot") do
|
for file, ftype in lfs.dir("/boot") do
|
||||||
local fname = "/boot/" .. file
|
local fname = "/boot/" .. file
|
||||||
|
|
||||||
if file == "." or file == ".." then
|
if file == "." or file == ".." then
|
||||||
goto continue
|
goto continue
|
||||||
end
|
end
|
||||||
|
|
||||||
if lfs.attributes(fname, "mode") ~= "directory" then
|
if ftype then
|
||||||
|
if ftype ~= lfs.DT_DIR then
|
||||||
|
goto continue
|
||||||
|
end
|
||||||
|
elseif lfs.attributes(fname, "mode") ~= "directory" then
|
||||||
goto continue
|
goto continue
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user