diff options
| author | ruki <[email protected]> | 2025-11-04 00:58:06 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-11-07 15:01:56 +0800 |
| commit | dc864780af47a0a3fcf4097123e92b304793fce4 (patch) | |
| tree | 78a954913b008244e25aeeb423cfc8810ce65c0f | |
| parent | 145cea7f10f9242893bae60f7060dee67386e63d (diff) | |
add async to os.match
| -rw-r--r-- | xmake/core/base/os.lua | 22 | ||||
| -rw-r--r-- | xmake/core/base/private/async_task.lua | 48 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/os.lua | 16 |
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? |
