diff options
| author | 2026-09-05 21:15:31 +0200 | |
|---|---|---|
| committer | 2026-09-05 21:15:31 +0200 | |
| commit | 96441d80a6b51d89a5278d81c0fb1e20753dcb5d (patch) | |
| tree | 86fb2316b406acc6dd2597adf617521ad91be9b1 /src/main/java | |
| parent | 1bda29ee82642c39febec9a9a61100377d250278 (diff) | |
Improved performance of PortScanRateLimiter by sleeping outside of synchronized block.
Potential carrier thread pinning through sleeping inside sync block is now being prevented
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/com/it_jaros/jns/scan/engine/PortScanRateLimiter.java | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/main/java/com/it_jaros/jns/scan/engine/PortScanRateLimiter.java b/src/main/java/com/it_jaros/jns/scan/engine/PortScanRateLimiter.java index aa897a4..3411367 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/PortScanRateLimiter.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/PortScanRateLimiter.java @@ -23,16 +23,29 @@ public class PortScanRateLimiter { if (delayInNanos <= 0) { return; } + + long deadlineNanos; synchronized (lock) { if (cancelledToken.isCancelled()) { return; } long now = System.nanoTime(); - if (nextAllowedTime > now) { - LockSupport.parkNanos(nextAllowedTime - now); - now = System.nanoTime(); // re-read after waking + if (nextAllowedTime <= now) { + // a slot is free: claim it and proceed immediately + nextAllowedTime = now + delayInNanos; + return; } - nextAllowedTime = now + delayInNanos; + // claim my slot now, wait for it later + deadlineNanos = nextAllowedTime; + nextAllowedTime += delayInNanos; + } + + // wait outside the lock so the thread is not blocked + // while holding the monitor (which would pin virtual threads) + LockSupport.parkNanos(Math.max(0, deadlineNanos - System.nanoTime())); + + if (cancelledToken.isCancelled()) { + return; } } } |
