From 136b604b15fbd85d6491b0bccab81cdbb483c92f Mon Sep 17 00:00:00 2001 From: Xiaomin Date: Mon, 16 Oct 2023 11:13:59 +0800 Subject: [PATCH] [Wisp] Fix wisp poller dead lock in PUSH scheduling policy. Summary: Assume a coroutine that is waiting a synchronize monitor was scheduled to a carrier thread, and the carrier thread is doing as a poller. If the poller is trying to get this synchronize monitor at this moment, and then the poller will park because can not acquire the monitor. This case will cause a deadlock. Test Plan: test/jdk/com/alibaba/wisp Reviewed-by: yulei Issue: https://github.com/dragonwell-project/dragonwell17/issues/165 --- .../classes/com/alibaba/wisp/engine/WispEventPump.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/java.base/linux/classes/com/alibaba/wisp/engine/WispEventPump.java b/src/java.base/linux/classes/com/alibaba/wisp/engine/WispEventPump.java index 080c6780d8d..9fe726d4764 100644 --- a/src/java.base/linux/classes/com/alibaba/wisp/engine/WispEventPump.java +++ b/src/java.base/linux/classes/com/alibaba/wisp/engine/WispEventPump.java @@ -181,7 +181,11 @@ private void recordTaskByFD(int fd, WispTask task, int events) { if (fd < LOW_FD_BOUND) { getFd2TaskLow(events)[fd] = task; } else { + WispCarrier carrier = WispCarrier.current(); + final boolean isInCritical0 = carrier.isInCritical; + carrier.isInCritical = true; getFd2TaskHigh(events).put(fd, task); + carrier.isInCritical = isInCritical0; } } @@ -192,7 +196,11 @@ private WispTask removeTaskByFD(int fd, int events) { task = fd2TaskLow[fd]; fd2TaskLow[fd] = null; } else { + WispCarrier carrier = WispCarrier.current(); + final boolean isInCritical0 = carrier.isInCritical; + carrier.isInCritical = true; task = getFd2TaskHigh(events).remove(fd); + carrier.isInCritical = isInCritical0; } return task; }