1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty5.resolver.dns;
18
19 import java.net.InetSocketAddress;
20 import java.util.List;
21 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
22
23 final class RotationalDnsServerAddresses extends DefaultDnsServerAddresses {
24
25 private static final AtomicIntegerFieldUpdater<RotationalDnsServerAddresses> startIdxUpdater =
26 AtomicIntegerFieldUpdater.newUpdater(RotationalDnsServerAddresses.class, "startIdx");
27
28 @SuppressWarnings("UnusedDeclaration")
29 private volatile int startIdx;
30
31 RotationalDnsServerAddresses(List<InetSocketAddress> addresses) {
32 super("rotational", addresses);
33 }
34
35 @Override
36 public DnsServerAddressStream stream() {
37 for (;;) {
38 int curStartIdx = startIdx;
39 int nextStartIdx = curStartIdx + 1;
40 if (nextStartIdx >= addresses.size()) {
41 nextStartIdx = 0;
42 }
43 if (startIdxUpdater.compareAndSet(this, curStartIdx, nextStartIdx)) {
44 return new SequentialDnsServerAddressStream(addresses, curStartIdx);
45 }
46 }
47 }
48 }