-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5353 from gwenneg/issue-4218-graalvm-19.3.0
Lazily recompute Inet4Address, Inet6Address and CidrAddress fields at runtime
- Loading branch information
Showing
7 changed files
with
198 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
core/runtime/src/main/java/io/quarkus/runtime/graal/CidrAddressSubstitutions.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
package io.quarkus.runtime.graal; | ||
|
||
import java.net.InetAddress; | ||
|
||
import org.wildfly.common.net.CidrAddress; | ||
import org.wildfly.common.net.Inet; | ||
|
||
import com.oracle.svm.core.SubstrateUtil; | ||
import com.oracle.svm.core.annotate.Alias; | ||
import com.oracle.svm.core.annotate.InjectAccessors; | ||
import com.oracle.svm.core.annotate.TargetClass; | ||
|
||
import io.quarkus.runtime.graal.Target_org_wildfly_common_net_CidrAddress.CidrAddressUtil; | ||
|
||
/* | ||
* The following substitutions are required because of a new restriction in GraalVM 19.3.0 that prohibits the presence of | ||
* java.net.Inet4Address and java.net.Inet6Address in the image heap. Each field annotated with @InjectAccessors is lazily | ||
* recomputed at runtime on first access while CidrAddress.class can still be initialized during the native image build. | ||
*/ | ||
@TargetClass(CidrAddress.class) | ||
final class Target_org_wildfly_common_net_CidrAddress { | ||
|
||
@Alias | ||
private Target_org_wildfly_common_net_CidrAddress(InetAddress networkAddress, int netmaskBits) { | ||
} | ||
|
||
@Alias | ||
@InjectAccessors(Inet4AnyCidrAccessor.class) | ||
public static CidrAddress INET4_ANY_CIDR; | ||
|
||
@Alias | ||
@InjectAccessors(Inet6AnyCidrAccessor.class) | ||
public static CidrAddress INET6_ANY_CIDR; | ||
|
||
static class CidrAddressUtil { | ||
static CidrAddress newInstance(InetAddress networkAddress, int netmaskBits) { | ||
return SubstrateUtil.cast(new Target_org_wildfly_common_net_CidrAddress(networkAddress, netmaskBits), | ||
CidrAddress.class); | ||
} | ||
} | ||
} | ||
|
||
class Inet4AnyCidrAccessor { | ||
|
||
private static volatile CidrAddress INET4_ANY_CIDR; | ||
|
||
static CidrAddress get() { | ||
CidrAddress result = INET4_ANY_CIDR; | ||
if (result == null) { | ||
// Lazy initialization on first access. | ||
result = initializeOnce(); | ||
} | ||
return result; | ||
} | ||
|
||
private static synchronized CidrAddress initializeOnce() { | ||
CidrAddress result = INET4_ANY_CIDR; | ||
if (result != null) { | ||
// Double-checked locking is OK because INSTANCE is volatile. | ||
return result; | ||
} | ||
result = CidrAddressUtil.newInstance(Inet.INET4_ANY, 0); | ||
INET4_ANY_CIDR = result; | ||
return result; | ||
} | ||
} | ||
|
||
class Inet6AnyCidrAccessor { | ||
|
||
private static volatile CidrAddress INET6_ANY_CIDR; | ||
|
||
static CidrAddress get() { | ||
CidrAddress result = INET6_ANY_CIDR; | ||
if (result == null) { | ||
// Lazy initialization on first access. | ||
result = initializeOnce(); | ||
} | ||
return result; | ||
} | ||
|
||
private static synchronized CidrAddress initializeOnce() { | ||
CidrAddress result = INET6_ANY_CIDR; | ||
if (result != null) { | ||
// Double-checked locking is OK because INSTANCE is volatile. | ||
return result; | ||
} | ||
result = CidrAddressUtil.newInstance(Inet.INET6_ANY, 0); | ||
INET6_ANY_CIDR = result; | ||
return result; | ||
} | ||
} |
14 changes: 14 additions & 0 deletions
14
core/runtime/src/main/java/io/quarkus/runtime/graal/InetRunTime.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package io.quarkus.runtime.graal; | ||
|
||
import java.net.Inet4Address; | ||
import java.net.Inet6Address; | ||
|
||
import org.wildfly.common.net.Inet; | ||
|
||
public class InetRunTime { | ||
public static final Inet4Address INET4_ANY = Inet.getInet4Address(0, 0, 0, 0); | ||
public static final Inet4Address INET4_LOOPBACK = Inet.getInet4Address(127, 0, 0, 1); | ||
public static final Inet4Address INET4_BROADCAST = Inet.getInet4Address(255, 255, 255, 255); | ||
public static final Inet6Address INET6_ANY = Inet.getInet6Address(0, 0, 0, 0, 0, 0, 0, 0); | ||
public static final Inet6Address INET6_LOOPBACK = Inet.getInet6Address(0, 0, 0, 0, 0, 0, 0, 1); | ||
} |
69 changes: 69 additions & 0 deletions
69
core/runtime/src/main/java/io/quarkus/runtime/graal/InetSubstitutions.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package io.quarkus.runtime.graal; | ||
|
||
import java.net.Inet4Address; | ||
import java.net.Inet6Address; | ||
|
||
import org.wildfly.common.net.Inet; | ||
|
||
import com.oracle.svm.core.annotate.Alias; | ||
import com.oracle.svm.core.annotate.InjectAccessors; | ||
import com.oracle.svm.core.annotate.TargetClass; | ||
|
||
/* | ||
* The following substitutions are required because of a new restriction in GraalVM 19.3.0 that prohibits the presence of | ||
* java.net.Inet4Address and java.net.Inet6Address in the image heap. Each field annotated with @InjectAccessors is lazily | ||
* recomputed at runtime on first access while Inet.class can still be initialized during the native image build. | ||
*/ | ||
@TargetClass(Inet.class) | ||
final class Target_org_wildfly_common_net_Inet { | ||
|
||
@Alias | ||
@InjectAccessors(Inet4AnyAccessor.class) | ||
public static Inet4Address INET4_ANY; | ||
|
||
@Alias | ||
@InjectAccessors(Inet4LoopbackAccessor.class) | ||
public static Inet4Address INET4_LOOPBACK; | ||
|
||
@Alias | ||
@InjectAccessors(Inet4BroadcastAccessor.class) | ||
public static Inet4Address INET4_BROADCAST; | ||
|
||
@Alias | ||
@InjectAccessors(Inet6AnyAccessor.class) | ||
public static Inet6Address INET6_ANY; | ||
|
||
@Alias | ||
@InjectAccessors(Inet6LoopbackAccessor.class) | ||
public static Inet6Address INET6_LOOPBACK; | ||
} | ||
|
||
final class Inet4AnyAccessor { | ||
static Inet4Address get() { | ||
return InetRunTime.INET4_ANY; | ||
} | ||
} | ||
|
||
final class Inet4LoopbackAccessor { | ||
static Inet4Address get() { | ||
return InetRunTime.INET4_LOOPBACK; | ||
} | ||
} | ||
|
||
final class Inet4BroadcastAccessor { | ||
static Inet4Address get() { | ||
return InetRunTime.INET4_BROADCAST; | ||
} | ||
} | ||
|
||
final class Inet6AnyAccessor { | ||
static Inet6Address get() { | ||
return InetRunTime.INET6_ANY; | ||
} | ||
} | ||
|
||
final class Inet6LoopbackAccessor { | ||
static Inet6Address get() { | ||
return InetRunTime.INET6_LOOPBACK; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters