summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-10-06 08:21:07 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-10-06 08:21:07 +0200
commit5fb3b800f40e5cf49fe8723f6fcdfcae18f11a72 (patch)
treede5b5617d4a03f48bfcee220ac0c0a0aadf87c69
parent4772393f49fd38ade6b32788ecfff33e9671a9db (diff)
Remove redundant copies of PortRange BitSet. Instead use one copy with
diffferent counters for each port scan
-rw-r--r--src/main/java/com/it_jaros/jns/scan/Scanner.java4
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/PortRangeIterator.java5
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/ScanExecutionContext.java4
-rw-r--r--src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java2
4 files changed, 9 insertions, 6 deletions
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<Integer> {
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<ScanResult> {
}
}
- final PortRange portRange = new PortRange(scan.getPorts());
+ final PortRange portRange = context.portRange(); // parsed once per scan, shared read-only
Function<Integer, Callable<PortResult>> scanFactory = this.context.scanOptions().useUdp()
? port -> new ScanUdpPortTask(port, context, hostContext)
: port -> new ScanPortTask(port, context, hostContext);