From 5fb3b800f40e5cf49fe8723f6fcdfcae18f11a72 Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Tue, 6 Oct 2026 08:21:07 +0200 Subject: Remove redundant copies of PortRange BitSet. Instead use one copy with diffferent counters for each port scan --- src/main/java/com/it_jaros/jns/scan/Scanner.java | 4 +++- src/main/java/com/it_jaros/jns/scan/engine/PortRangeIterator.java | 5 ++--- src/main/java/com/it_jaros/jns/scan/engine/ScanExecutionContext.java | 4 +++- src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/main/java/com/it_jaros/jns/scan/Scanner.java b/src/main/java/com/it_jaros/jns/scan/Scanner.java index c388ef3..05231d2 100644 --- a/src/main/java/com/it_jaros/jns/scan/Scanner.java +++ b/src/main/java/com/it_jaros/jns/scan/Scanner.java @@ -1,5 +1,6 @@ package com.it_jaros.jns.scan; +import com.it_jaros.jns.scan.domain.PortRange; import com.it_jaros.jns.scan.domain.ScanResult; import com.it_jaros.jns.scan.engine.*; @@ -35,7 +36,8 @@ public class Scanner implements AutoCloseable { executor, socketLimit, cancelledToken, - scan + scan, + new PortRange(scan.getPorts()) // parsed once for the whole scan ); scan.start(); diff --git a/src/main/java/com/it_jaros/jns/scan/engine/PortRangeIterator.java b/src/main/java/com/it_jaros/jns/scan/engine/PortRangeIterator.java index e67b362..8996b34 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/PortRangeIterator.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/PortRangeIterator.java @@ -4,16 +4,15 @@ import java.util.BitSet; import java.util.Iterator; import java.util.NoSuchElementException; -import static com.it_jaros.jns.scan.domain.PortRange.MAX_PORT; import static com.it_jaros.jns.scan.domain.PortRange.MIN_PORT; public class PortRangeIterator implements Iterator { private int nextPort; // cached next-set-bit, only ever advances - private final BitSet availablePorts = new BitSet(MAX_PORT); + private final BitSet availablePorts; // shared from the scan, read-only via a monotonically advancing cursor public PortRangeIterator(BitSet specifiedPorts) { - availablePorts.or(specifiedPorts); + this.availablePorts = specifiedPorts; nextPort = availablePorts.nextSetBit(MIN_PORT); } diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanExecutionContext.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanExecutionContext.java index 96924c8..0c5f00b 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/ScanExecutionContext.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanExecutionContext.java @@ -2,6 +2,7 @@ package com.it_jaros.jns.scan.engine; import com.it_jaros.jns.scan.Scan; import com.it_jaros.jns.scan.ScanOptions; +import com.it_jaros.jns.scan.domain.PortRange; import java.util.concurrent.ExecutorService; import java.util.concurrent.Semaphore; @@ -11,5 +12,6 @@ public record ScanExecutionContext( ExecutorService executorService, Semaphore socketLimit, CancelledToken cancelledToken, - Scan scan + Scan scan, + PortRange portRange // parsed once per scan, shared read-only by all host tasks ) {} diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java index 9a4d6db..d2ce647 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java @@ -64,7 +64,7 @@ public class ScanHostTask implements Callable { } } - final PortRange portRange = new PortRange(scan.getPorts()); + final PortRange portRange = context.portRange(); // parsed once per scan, shared read-only Function> scanFactory = this.context.scanOptions().useUdp() ? port -> new ScanUdpPortTask(port, context, hostContext) : port -> new ScanPortTask(port, context, hostContext); -- cgit v1.3.1-4-g156e