diff options
| author | ruki <[email protected]> | 2026-08-21 21:08:36 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-08-21 21:08:36 +0800 |
| commit | deaabcd162bebe9312201bcaac48404fd8a1925a (patch) | |
| tree | 74af4b83080958ec5b78f47a860552fd32da11fb /xmake/core/base/scheduler.lua | |
| parent | 780159d6946115b89bb4657856fba361e79a1555 (diff) | |
| parent | 17af88ea7f1887219cca15a1fa7028e06196eccd (diff) | |
improve core
Diffstat (limited to 'xmake/core/base/scheduler.lua')
| -rw-r--r-- | xmake/core/base/scheduler.lua | 14 |
1 files changed, 13 insertions, 1 deletions
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 |
