diff options
| author | ruki <[email protected]> | 2020-02-07 00:07:52 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2020-02-07 22:45:57 +0800 |
| commit | 5cd2e08845765fb1e21b72f22e2707f7e8233b7b (patch) | |
| tree | db500c9cc555daa553baad32b04a5368a39bc799 | |
| parent | 7ba4dd03abc93f7faff3afa9968f8c8e7ce478c6 (diff) | |
kill all pending process after exiting
| -rw-r--r-- | xmake/core/base/process.lua | 21 | ||||
| -rw-r--r-- | xmake/core/main.lua | 5 | ||||
| -rw-r--r-- | xmake/core/sandbox/modules/import/core/base/process.lua | 5 |
3 files changed, 31 insertions, 0 deletions
diff --git a/xmake/core/base/process.lua b/xmake/core/base/process.lua index 20cfbe02c..51fe02ecd 100644 --- a/xmake/core/base/process.lua +++ b/xmake/core/base/process.lua @@ -47,6 +47,7 @@ function _subprocess.new(name, proc) subprocess._NAME = name subprocess._PROC = proc setmetatable(subprocess, _subprocess) + process._openlist()[subprocess:cdata()] = subprocess return subprocess end @@ -127,6 +128,7 @@ function _subprocess:close() -- close process ok = process._close(self:cdata()) if ok then + process._openlist()[self:cdata()] = nil self._PROC = nil end return ok @@ -152,6 +154,16 @@ function _subprocess:__gc() end end +-- get all opened processes list +function process._openlist() + local list = process._LIST + if not list then + list = {} + process._LIST = list + end + return list +end + -- open a subprocess -- -- @param command the process command @@ -239,5 +251,14 @@ function process.openv(shellname, argv, opt) end end +-- kill all pending process +function process.killall() + for _, proc in pairs(process._openlist()) do + if proc and proc:cdata() then + proc:kill() + end + end +end + -- return module: process return process diff --git a/xmake/core/main.lua b/xmake/core/main.lua index c4eb4aee5..8c2ceb664 100644 --- a/xmake/core/main.lua +++ b/xmake/core/main.lua @@ -33,6 +33,7 @@ local deprecated = require("base/deprecated") local privilege = require("base/privilege") local task = require("base/task") local colors = require("base/colors") +local process = require("base/process") local scheduler = require("base/scheduler") local theme = require("theme/theme") local project = require("project/project") @@ -262,9 +263,13 @@ Or you can add `--root` option or XMAKE_ROOT=y to allow run as root temporarily. end) ok, errors = scheduler:runloop() if not ok then + process.killall() utils.error(errors) return -1 end + + -- kill all pending processes + process.killall() -- dump deprecated entries deprecated.dump() diff --git a/xmake/core/sandbox/modules/import/core/base/process.lua b/xmake/core/sandbox/modules/import/core/base/process.lua index b73e19fb5..2e773a1e9 100644 --- a/xmake/core/sandbox/modules/import/core/base/process.lua +++ b/xmake/core/sandbox/modules/import/core/base/process.lua @@ -121,5 +121,10 @@ function sandbox_core_base_process.openv(filename, argv, opt) return proc end +-- kill all pending processes list +function sandbox_core_base_process.killall() + return process.killall() +end + -- return module return sandbox_core_base_process |
