File 2223-Filter-out-diff-from-cleared-oneshot-events.patch of Package erlang
From bdd43a0d335bf391e1133f140accb683fc68368d Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Wed, 23 Mar 2022 19:18:39 +0100
Subject: [PATCH 3/4] Filter out diff from cleared oneshot events
---
erts/emulator/sys/common/erl_check_io.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/erts/emulator/sys/common/erl_check_io.c b/erts/emulator/sys/common/erl_check_io.c
index bf18502887..28716b313e 100644
--- a/erts/emulator/sys/common/erl_check_io.c
+++ b/erts/emulator/sys/common/erl_check_io.c
@@ -2693,9 +2693,17 @@ static int erts_debug_print_checkio_state(erts_dsprintf_buf_t *dsbufp,
err = 1;
}
else {
- ErtsPollEvents ev = cio_events;
- if (ev != ep_events && ep_events != ERTS_POLL_EV_NONE)
- err = 1;
+ if (ep_events != ERTS_POLL_EV_NONE) {
+ if (!ERTS_POLL_USE_KERNEL_POLL
+ || (!(state->flags & (ERTS_EV_FLAG_SCHEDULER|ERTS_EV_FLAG_FALLBACK))
+ && ((cio_events ^ ep_events) & ep_events) != 0)) {
+ err = 1;
+ }
+ /* else: Kernel poll with oneshot (used by poller threads)
+ * may cause a race where an event just triggered and
+ * thereby was cleared in the pollset (ep_events).
+ */
+ }
erts_dsprintf(dsbufp, "cio_ev=");
print_events(dsbufp, cio_events);
erts_dsprintf(dsbufp, " ep_ev=");
--
2.34.1