summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-09-05 21:15:31 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-09-05 21:15:31 +0200
commit96441d80a6b51d89a5278d81c0fb1e20753dcb5d (patch)
tree86fb2316b406acc6dd2597adf617521ad91be9b1 /src/main
parent1bda29ee82642c39febec9a9a61100377d250278 (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')
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/PortScanRateLimiter.java21
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;
}
}
}