summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-11-04 00:58:06 +0800
committerruki <[email protected]>2025-11-07 15:01:56 +0800
commitdc864780af47a0a3fcf4097123e92b304793fce4 (patch)
tree78a954913b008244e25aeeb423cfc8810ce65c0f
parent145cea7f10f9242893bae60f7060dee67386e63d (diff)
add async to os.match
-rw-r--r--xmake/core/base/os.lua22
-rw-r--r--xmake/core/base/private/async_task.lua48
-rw-r--r--xmake/core/sandbox/modules/os.lua16
3 files changed, 67 insertions, 19 deletions
diff --git a/xmake/core/base/os.lua b/xmake/core/base/os.lua
index eb9ab6d31..27d352056 100644
--- a/xmake/core/base/os.lua
+++ b/xmake/core/base/os.lua
@@ -400,7 +400,15 @@ end
-- end)
-- @endcode
--
-function os.match(pattern, mode, callback)
+function os.match(pattern, mode, opt)
+
+ -- do it in the asynchronous task
+ if type(opt) == "table" and opt.async and xmake.in_main_thread() then
+ return os._async_task().match(pattern, mode)
+ end
+
+ -- extract callback
+ local callback = type(opt) == "function" and opt or (type(opt) == "table" and opt.callback or nil)
-- support path instance
pattern = tostring(pattern)
@@ -493,18 +501,18 @@ end
--
-- @note only return {} without count to simplify code, e.g. table.unpack(os.dirs(""))
--
-function os.dirs(pattern, callback)
- return (os.match(pattern, 'd', callback))
+function os.dirs(pattern, opt)
+ return (os.match(pattern, 'd', opt))
end
-- match files
-function os.files(pattern, callback)
- return (os.match(pattern, 'f', callback))
+function os.files(pattern, opt)
+ return (os.match(pattern, 'f', opt))
end
-- match files and directories
-function os.filedirs(pattern, callback)
- return (os.match(pattern, 'a', callback))
+function os.filedirs(pattern, opt)
+ return (os.match(pattern, 'a', opt))
end
-- copy files or directories and we can reserve the source directory structure
diff --git a/xmake/core/base/private/async_task.lua b/xmake/core/base/private/async_task.lua
index 6b3aee64b..73785f09c 100644
--- a/xmake/core/base/private/async_task.lua
+++ b/xmake/core/base/private/async_task.lua
@@ -66,24 +66,31 @@ function async_task._loop(event, queue, mutex, is_stopped, is_diagnosis)
local function _runcmd_rmdir(cmd)
os.rmdir(cmd.dir)
end
+ local function _runcmd_match(cmd)
+ return os.match(cmd.pattern, cmd.mode)
+ end
local runops = {
cp = _runcmd_cp,
rm = _runcmd_rm,
- rmdir = _runcmd_rmdir
+ rmdir = _runcmd_rmdir,
+ match = _runcmd_match
}
local function _runcmd(cmd)
- -- restore thread objects if needed
_restore_thread_objects(cmd)
local ok = true
local errors
+ local result_data
local runop = runops[cmd.kind]
if runop then
try
{
function ()
- runop(cmd)
+ local ret = runop(cmd)
+ if ret then
+ result_data = ret
+ end
end,
catch
{
@@ -97,7 +104,7 @@ function async_task._loop(event, queue, mutex, is_stopped, is_diagnosis)
-- notify completion if event is provided
if cmd.event and cmd.result then
- cmd.result:set({ok = ok, errors = errors})
+ cmd.result:set({ok = ok, errors = errors, data = result_data})
cmd.event:post()
end
end
@@ -325,6 +332,39 @@ function async_task.rmdir(dir, opt)
end
end
+-- match files or directories
+function async_task.match(pattern, mode)
+ local ok, errors = async_task._ensure_started()
+ if not ok then
+ return nil, errors
+ end
+
+ -- post task
+ pattern = path.absolute(tostring(pattern))
+
+ local cmd = {kind = "match", pattern = pattern, mode = mode}
+ local cmd_event = thread.event()
+ local cmd_result = thread.sharedata()
+
+ -- serialize thread objects for passing to worker thread
+ cmd.event_data = thread._serialize_object(cmd_event)
+ cmd.result_data = thread._serialize_object(cmd_result)
+
+ task_mutex:lock()
+ task_queue:push(cmd)
+ task_mutex:unlock()
+
+ -- wait for completion
+ task_event:post()
+ cmd_event:wait(-1)
+ local result = cmd_result:get()
+ if result and result.ok then
+ return result.data
+ else
+ return nil, result and result.errors or "unknown error"
+ end
+end
+
-- return module: async_task
return async_task
diff --git a/xmake/core/sandbox/modules/os.lua b/xmake/core/sandbox/modules/os.lua
index 39784d80b..aebb3cfb0 100644
--- a/xmake/core/sandbox/modules/os.lua
+++ b/xmake/core/sandbox/modules/os.lua
@@ -411,23 +411,23 @@ function sandbox_os.vexecv(program, argv, opt)
end
-- match files or directories
-function sandbox_os.match(pattern, mode, callback)
- return os.match(vformat(tostring(pattern)), mode, callback)
+function sandbox_os.match(pattern, mode, opt)
+ return os.match(vformat(tostring(pattern)), mode, opt)
end
-- match directories
-function sandbox_os.dirs(pattern, callback)
- return (sandbox_os.match(pattern, 'd', callback))
+function sandbox_os.dirs(pattern, opt)
+ return os.dirs(vformat(tostring(pattern)), opt)
end
-- match files
-function sandbox_os.files(pattern, callback)
- return (sandbox_os.match(pattern, 'f', callback))
+function sandbox_os.files(pattern, opt)
+ return os.files(vformat(tostring(pattern)), opt)
end
-- match files and directories
-function sandbox_os.filedirs(pattern, callback)
- return (sandbox_os.match(pattern, 'a', callback))
+function sandbox_os.filedirs(pattern, opt)
+ return os.filedirs(vformat(tostring(pattern)), opt)
end
-- is directory?