diff options
| -rw-r--r-- | core/src/xmake/utf8/width.c | 6 | ||||
| -rw-r--r-- | tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua | 22 | ||||
| -rw-r--r-- | tests/projects/package/usage_requirements/src/main.cpp | 3 | ||||
| -rw-r--r-- | tests/projects/package/usage_requirements/src/usage.cpp | 7 | ||||
| -rw-r--r-- | tests/projects/package/usage_requirements/test.lua | 5 | ||||
| -rw-r--r-- | tests/projects/package/usage_requirements/xmake.lua | 35 | ||||
| -rw-r--r-- | xmake/core/base/poller.lua | 16 | ||||
| -rw-r--r-- | xmake/core/base/scheduler.lua | 14 |
8 files changed, 27 insertions, 81 deletions
diff --git a/core/src/xmake/utf8/width.c b/core/src/xmake/utf8/width.c index 615572462..fb79ee198 100644 --- a/core/src/xmake/utf8/width.c +++ b/core/src/xmake/utf8/width.c @@ -33,7 +33,11 @@ * utf8.width(codepoint) */ tb_int_t xm_utf8_width(lua_State* lua) { - if (lua_isnumber(lua, 1)) { + /* we must not use lua_isnumber() here: it also accepts a numeric string, + * so utf8.width("9") would return the width of the code point 9 (a tab) + * instead of the width of the string "9" + */ + if (lua_type(lua, 1) == LUA_TNUMBER) { xm_utf8_int_t val = (xm_utf8_int_t)lua_tointeger(lua, 1); lua_pushinteger(lua, xm_utf8_charwidth(val)); } else { diff --git a/tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua b/tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua deleted file mode 100644 index c62605e3c..000000000 --- a/tests/projects/package/usage_requirements/repo/packages/u/usage-requirements/xmake.lua +++ /dev/null @@ -1,22 +0,0 @@ -package("usage-requirements") - set_kind("library", {headeronly = true}) - set_sourcedir(path.join(os.scriptdir(), "src")) - - add_components("enabled") - add_components("disabled") - - on_load(function (package) - package:add("vectorexts", "avx") - end) - - on_component("enabled", function (package, component) - component:add("vectorexts", "avx2") - end) - - on_component("disabled", function (package, component) - component:add("vectorexts", "avx512") - end) - - on_install(function (package) - os.cp("README.md", package:installdir()) - end) diff --git a/tests/projects/package/usage_requirements/src/main.cpp b/tests/projects/package/usage_requirements/src/main.cpp deleted file mode 100644 index 33c14ce1d..000000000 --- a/tests/projects/package/usage_requirements/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -int main() { - return 0; -} diff --git a/tests/projects/package/usage_requirements/src/usage.cpp b/tests/projects/package/usage_requirements/src/usage.cpp deleted file mode 100644 index b1fbda2b3..000000000 --- a/tests/projects/package/usage_requirements/src/usage.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#if !defined(__AVX2__) && !defined(_M_AVX2) && !defined(__AVX2) -# error AVX2 is required by the package -#endif - -int usage() { - return 0; -} diff --git a/tests/projects/package/usage_requirements/test.lua b/tests/projects/package/usage_requirements/test.lua deleted file mode 100644 index ca225630a..000000000 --- a/tests/projects/package/usage_requirements/test.lua +++ /dev/null @@ -1,5 +0,0 @@ -function main(t) - if os.subarch():startswith("x") or os.subarch() == "i386" then - t:build() - end -end diff --git a/tests/projects/package/usage_requirements/xmake.lua b/tests/projects/package/usage_requirements/xmake.lua deleted file mode 100644 index 7f9eb9107..000000000 --- a/tests/projects/package/usage_requirements/xmake.lua +++ /dev/null @@ -1,35 +0,0 @@ -add_rules("mode.debug", "mode.release") - -add_repositories("usage-requirements-repo repo") -add_requires("usage-requirements", {system = false}) - -local function _has_value_from(target, name, source, expected) - local values = target:get_from(name, source, {interface = true}) - for _, source_values in ipairs(values or {}) do - if table.contains(table.wrap(source_values), expected) then - return true - end - end -end - -target("usage") - set_kind("static") - add_files("src/usage.cpp") - add_packages("usage-requirements", {components = "enabled", public = true}) - before_build(function (target) - local package = assert(target:pkg("usage-requirements")) - assert(table.contains(package:get("vectorexts"), "avx")) - assert(_has_value_from(target, "vectorexts", "package::*", "avx")) - assert(_has_value_from(target, "vectorexts", "package::*", "avx2")) - assert(not _has_value_from(target, "vectorexts", "package::*", "avx512")) - end) - -target("consumer") - set_kind("binary") - add_deps("usage") - add_files("src/main.cpp") - before_build(function (target) - assert(_has_value_from(target, "vectorexts", "dep::usage/package::*", "avx")) - assert(_has_value_from(target, "vectorexts", "dep::usage/package::*", "avx2")) - assert(not _has_value_from(target, "vectorexts", "dep::usage/package::*", "avx512")) - end) diff --git a/xmake/core/base/poller.lua b/xmake/core/base/poller.lua index bb18dfda4..43c3bea1a 100644 --- a/xmake/core/base/poller.lua +++ b/xmake/core/base/poller.lua @@ -124,7 +124,7 @@ function poller:remove(obj) end -- remove poller object data - self:_pollerdata_set(obj, nil) + self:_pollerdata_set(obj:cdata(), nil) return true end @@ -153,13 +153,15 @@ function poller:wait(timeout) local otype = v[1] local cdata = v[2] local events = v[3] - local pollerdata = self:_pollerdata(cdata) - if not pollerdata then - return -1, string.format("no object data for cdata(%s)!", cdata) + -- this object may have been removed from the poller while its event + -- was already collected, e.g. a pending overlapped io on windows, + -- we just drop it, it has no owner any more, @see poller:remove() + local pollerdata = self:_pollerdata(cdata) + if pollerdata then + local obj = pollerdata[1] + assert(obj and obj:otype() == otype and obj:cdata() == cdata) + table.insert(results, {obj, events, pollerdata[2]}) end - local obj = pollerdata[1] - assert(obj and obj:otype() == otype and obj:cdata() == cdata) - table.insert(results, {obj, events, pollerdata[2]}) end end return count, results diff --git a/xmake/core/base/scheduler.lua b/xmake/core/base/scheduler.lua index a59c38207..4ae8d74e0 100644 --- a/xmake/core/base/scheduler.lua +++ b/xmake/core/base/scheduler.lua @@ -304,9 +304,17 @@ end function scheduler:_poller_events_cb(obj, events) -- get poller object data + -- + -- the object may have been cancelled while its event was already queued, + -- e.g. a process which exits right after we stopped waiting for it, + -- @see scheduler:poller_cancel() + -- + -- such an event has no owner any more, we just drop it: it is not an + -- error of the scheduler and it must not abort the whole loop local pollerdata = self:_poller_data(obj) if not pollerdata then - return false, string.format("%s: cannot get poller data!", obj) + utils.dprint("%s: drop the event(%d), it has been cancelled!", obj, events) + return true end -- is process/fwatcher object? @@ -1068,6 +1076,10 @@ function scheduler:poller_waitproc(obj, timeout) running:waitobj_set(obj) -- wait + -- + -- @note we keep this process in the poller if it is timeout, so its exit status + -- is still saved as a pending status when it exits later, and the next wait + -- returns it immediately, @see scheduler:_poller_events_cb() local ok = self:co_suspend() return ok, pollerdata.object_event end |
