summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-11-24 00:49:35 +0800
committerruki <[email protected]>2022-11-24 00:49:35 +0800
commit782f3bcad9d24878e452a596d9c1c1cb2949819e (patch)
tree8bcfc5b62b755b2f3829482617001ea14c3263c2
parent663b606000f685e7700e7288b3a9a91690ace673 (diff)
improve find_programver
-rw-r--r--xmake/core/sandbox/modules/import/lib/detect/find_programver.lua14
1 files changed, 14 insertions, 0 deletions
diff --git a/xmake/core/sandbox/modules/import/lib/detect/find_programver.lua b/xmake/core/sandbox/modules/import/lib/detect/find_programver.lua
index daa6b3ea5..24e6b97e0 100644
--- a/xmake/core/sandbox/modules/import/lib/detect/find_programver.lua
+++ b/xmake/core/sandbox/modules/import/lib/detect/find_programver.lua
@@ -32,6 +32,10 @@ local project = require("project/project")
local detectcache = require("cache/detectcache")
local sandbox = require("sandbox/sandbox")
local raise = require("sandbox/modules/raise")
+local scheduler = require("sandbox/modules/import/core/base/scheduler")
+
+-- globals
+local checking = nil
-- find program version
--
@@ -55,6 +59,14 @@ function sandbox_lib_detect_find_programver.main(program, opt)
-- init options
opt = opt or {}
+ -- @note avoid detect the same program in the same time leading to deadlock if running in the coroutine (e.g. ccache)
+ local coroutine_running = scheduler.co_running()
+ if coroutine_running then
+ while checking ~= nil and checking == program do
+ scheduler.co_yield()
+ end
+ end
+
-- init cachekey
local cachekey = "find_programver"
if opt.cachekey then
@@ -68,6 +80,7 @@ function sandbox_lib_detect_find_programver.main(program, opt)
end
-- attempt to get version output info
+ checking = coroutine_running and program or nil
local ok = false
local outdata = nil
local command = opt.command
@@ -79,6 +92,7 @@ function sandbox_lib_detect_find_programver.main(program, opt)
else
ok, outdata = os.iorunv(program, {command or "--version"}, {envs = opt.envs})
end
+ checking = nil
-- find version info
if ok and outdata and #outdata > 0 then