From 842aef9052278610048e2d22103f80eb0e77a860 Mon Sep 17 00:00:00 2001 From: Aleksei Efimov Date: Thu, 31 Oct 2024 14:29:14 +0000 Subject: [PATCH] Restructure binding packages and move common components to platform-specific BindingUtils classes. Remove VH usages - replaced with jextract generated code modification. --- .../socket/generated/socket_address_h.java | 116 --- .../internal/ffi/generated/BindingUtils.java | 49 + .../generated/socket}/in6_addr.java | 14 +- .../generated/socket}/in_addr.java | 10 +- .../ffi/generated/socket}/package-info.java | 10 +- .../generated/socket}/sockaddr.java | 18 +- .../generated/socket}/sockaddr_in.java | 20 +- .../generated/socket}/sockaddr_in6.java | 23 +- .../generated/socket/socket_address_h.java} | 31 +- .../socket/generated/socket_address_h.java | 116 --- .../internal/ffi/generated/BindingUtils.java | 52 ++ .../generated/socket}/in6_addr.java | 10 +- .../generated/socket}/in_addr.java | 6 +- .../ffi/generated/socket}/package-info.java | 10 +- .../generated/socket}/sockaddr.java | 17 +- .../generated/socket}/sockaddr_in.java | 19 +- .../generated/socket}/sockaddr_in6.java | 21 +- .../generated/socket/socket_address_h.java} | 45 +- .../jdk/internal/ffi/util/FFMUtils.java | 127 +++ .../sun/nio/ch/DatagramChannelImpl.java | 20 +- .../sun/nio/ch/NativeSocketAddress.java | 92 +- .../net/socket/generated/in_addr.java | 868 ------------------ .../socket/generated/socket_address_h.java | 117 --- .../internal/ffi/generated/BindingUtils.java | 53 ++ .../generated/socket}/SCOPE_ID.java | 6 +- .../generated/socket}/in6_addr.java | 8 +- .../ffi/generated/socket/in_addr.java | 157 ++++ .../generated/socket}/package-info.java | 10 +- .../generated/socket}/sockaddr.java | 15 +- .../generated/socket}/sockaddr_in.java | 17 +- .../generated/socket}/sockaddr_in6.java | 19 +- .../generated/socket/socket_address_h.java} | 46 +- 32 files changed, 716 insertions(+), 1426 deletions(-) delete mode 100644 src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java create mode 100644 src/java.base/linux/classes/jdk/internal/ffi/generated/BindingUtils.java rename src/java.base/linux/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/in6_addr.java (97%) rename src/java.base/linux/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/in_addr.java (95%) rename src/java.base/{macosx/classes/jdk/internal/bindings/net/socket/generated => linux/classes/jdk/internal/ffi/generated/socket}/package-info.java (77%) rename src/java.base/linux/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr.java (92%) rename src/java.base/linux/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr_in.java (93%) rename src/java.base/linux/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr_in6.java (93%) rename src/java.base/{aix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java => linux/classes/jdk/internal/ffi/generated/socket/socket_address_h.java} (67%) delete mode 100644 src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java create mode 100644 src/java.base/macosx/classes/jdk/internal/ffi/generated/BindingUtils.java rename src/java.base/macosx/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/in6_addr.java (97%) rename src/java.base/macosx/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/in_addr.java (97%) rename src/java.base/{linux/classes/jdk/internal/bindings/net/socket/generated => macosx/classes/jdk/internal/ffi/generated/socket}/package-info.java (77%) rename src/java.base/macosx/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr.java (92%) rename src/java.base/macosx/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr_in.java (93%) rename src/java.base/macosx/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr_in6.java (93%) rename src/java.base/{unix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java => macosx/classes/jdk/internal/ffi/generated/socket/socket_address_h.java} (58%) create mode 100644 src/java.base/share/classes/jdk/internal/ffi/util/FFMUtils.java delete mode 100644 src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in_addr.java delete mode 100644 src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java create mode 100644 src/java.base/windows/classes/jdk/internal/ffi/generated/BindingUtils.java rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/SCOPE_ID.java (97%) rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/in6_addr.java (97%) create mode 100644 src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in_addr.java rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/package-info.java (78%) rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr.java (92%) rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr_in.java (93%) rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/generated => ffi/generated/socket}/sockaddr_in6.java (94%) rename src/java.base/windows/classes/jdk/internal/{bindings/net/socket/PlatformAdapter.java => ffi/generated/socket/socket_address_h.java} (58%) diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java b/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java deleted file mode 100644 index 3a9c7009c3b04..0000000000000 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -// Generated by jextract - -package jdk.internal.bindings.net.socket.generated; - -import java.lang.invoke.*; -import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import static java.lang.foreign.ValueLayout.*; -import static java.lang.foreign.MemoryLayout.PathElement.*; - -@SuppressWarnings("restricted") -public class socket_address_h { - - socket_address_h() { - // Should not be called directly - } - - static final Arena LIBRARY_ARENA = Arena.ofAuto(); - static final boolean TRACE_DOWNCALLS = Boolean.getBoolean("jextract.trace.downcalls"); - - static void traceDowncall(String name, Object... args) { - String traceArgs = Arrays.stream(args) - .map(Object::toString) - .collect(Collectors.joining(", ")); - System.out.printf("%s(%s)\n", name, traceArgs); - } - - static MemorySegment findOrThrow(String symbol) { - return SYMBOL_LOOKUP.find(symbol) - .orElseThrow(() -> new UnsatisfiedLinkError("unresolved symbol: " + symbol)); - } - - static MethodHandle upcallHandle(Class fi, String name, FunctionDescriptor fdesc) { - try { - return MethodHandles.lookup().findVirtual(fi, name, fdesc.toMethodType()); - } catch (ReflectiveOperationException ex) { - throw new AssertionError(ex); - } - } - - static MemoryLayout align(MemoryLayout layout, long align) { - return switch (layout) { - case PaddingLayout p -> p; - case ValueLayout v -> v.withByteAlignment(align); - case GroupLayout g -> { - MemoryLayout[] alignedMembers = g.memberLayouts().stream() - .map(m -> align(m, align)).toArray(MemoryLayout[]::new); - yield g instanceof StructLayout ? - MemoryLayout.structLayout(alignedMembers) : MemoryLayout.unionLayout(alignedMembers); - } - case SequenceLayout s -> MemoryLayout.sequenceLayout(s.elementCount(), align(s.elementLayout(), align)); - }; - } - - static final SymbolLookup SYMBOL_LOOKUP = SymbolLookup.loaderLookup() - .or(Linker.nativeLinker().defaultLookup()); - - public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; - public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; - public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; - public static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT; - public static final ValueLayout.OfLong C_LONG_LONG = ValueLayout.JAVA_LONG; - public static final ValueLayout.OfFloat C_FLOAT = ValueLayout.JAVA_FLOAT; - public static final ValueLayout.OfDouble C_DOUBLE = ValueLayout.JAVA_DOUBLE; - public static final AddressLayout C_POINTER = ValueLayout.ADDRESS - .withTargetLayout(MemoryLayout.sequenceLayout(java.lang.Long.MAX_VALUE, JAVA_BYTE)); - public static final ValueLayout.OfLong C_LONG = ValueLayout.JAVA_LONG; - private static final int AF_INET = (int)2L; - /** - * {@snippet lang=c : - * #define AF_INET 2 - * } - */ - public static int AF_INET() { - return AF_INET; - } - private static final int AF_INET6 = (int)10L; - /** - * {@snippet lang=c : - * #define AF_INET6 10 - * } - */ - public static int AF_INET6() { - return AF_INET6; - } -} - diff --git a/src/java.base/linux/classes/jdk/internal/ffi/generated/BindingUtils.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/BindingUtils.java new file mode 100644 index 0000000000000..175cde852dce6 --- /dev/null +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/BindingUtils.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.ffi.generated; + +import java.lang.invoke.*; +import java.lang.foreign.*; +import java.util.*; +import java.util.stream.*; + +import static java.lang.foreign.ValueLayout.*; + +@SuppressWarnings("restricted") +public final class BindingUtils { + private BindingUtils() { + } + public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; + public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; + public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; + public static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT; + public static final ValueLayout.OfLong C_LONG_LONG = ValueLayout.JAVA_LONG; + public static final ValueLayout.OfFloat C_FLOAT = ValueLayout.JAVA_FLOAT; + public static final ValueLayout.OfDouble C_DOUBLE = ValueLayout.JAVA_DOUBLE; + public static final AddressLayout C_POINTER = ValueLayout.ADDRESS + .withTargetLayout(MemoryLayout.sequenceLayout(java.lang.Long.MAX_VALUE, JAVA_BYTE)); + public static final ValueLayout.OfLong C_LONG = ValueLayout.JAVA_LONG; +} \ No newline at end of file diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/in6_addr.java similarity index 97% rename from src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/in6_addr.java index 8575ea1b5b687..05e30cde408f8 100644 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/in6_addr.java @@ -25,16 +25,14 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; import java.util.function.*; -import java.util.stream.*; -import static java.lang.foreign.ValueLayout.*; import static java.lang.foreign.MemoryLayout.PathElement.*; /** @@ -83,9 +81,9 @@ public static class __in6_u { } private static final GroupLayout $LAYOUT = MemoryLayout.unionLayout( - MemoryLayout.sequenceLayout(16, socket_address_h.C_CHAR).withName("__u6_addr8"), - MemoryLayout.sequenceLayout(8, socket_address_h.C_SHORT).withName("__u6_addr16"), - MemoryLayout.sequenceLayout(4, socket_address_h.C_INT).withName("__u6_addr32") + MemoryLayout.sequenceLayout(16, BindingUtils.C_CHAR).withName("__u6_addr8"), + MemoryLayout.sequenceLayout(8, BindingUtils.C_SHORT).withName("__u6_addr16"), + MemoryLayout.sequenceLayout(4, BindingUtils.C_INT).withName("__u6_addr32") ).withName("$anon$221:5"); /** diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/in_addr.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/in_addr.java similarity index 95% rename from src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/in_addr.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/in_addr.java index 1bb957898d941..8fe6d6748a0cf 100644 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/in_addr.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/in_addr.java @@ -25,14 +25,12 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; -import java.lang.invoke.*; import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; import java.util.function.*; -import java.util.stream.*; import static java.lang.foreign.ValueLayout.*; import static java.lang.foreign.MemoryLayout.PathElement.*; @@ -52,7 +50,7 @@ public class in_addr { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_INT.withName("s_addr") + BindingUtils.C_INT.withName("s_addr") ).withName("in_addr"); /** diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/package-info.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/package-info.java similarity index 77% rename from src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/package-info.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/package-info.java index cbab59ad00cad..c5c2387abad21 100644 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/package-info.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/package-info.java @@ -32,7 +32,7 @@ * echo "#include " > $HEADER_NAME * echo "#include " >> $HEADER_NAME * - * jextract --target-package jdk.internal.bindings.net.socket.generated \ + * jextract --target-package jdk.internal.ffi.generated.socket \ * --include-struct sockaddr \ * --include-constant AF_INET \ * --include-constant AF_INET6 \ @@ -43,6 +43,12 @@ * $HEADER_NAME * } * + * After generation of native bindings, the layouts for the C builtin layouts and other + * variables/methods not specific to a component area are moved to the {@code BindingUtils} class + * for future reusability. + * If the {@code BindingUtils} class already exists, any usage of the components mentioned above is + * replaced with matching replacement from the {@code BindingUtils} where possible. + * */ -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr.java similarity index 92% rename from src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr.java index e852e9c0545ad..c998a82d23021 100644 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr.java @@ -25,14 +25,13 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; import java.util.function.*; -import java.util.stream.*; import static java.lang.foreign.ValueLayout.*; import static java.lang.foreign.MemoryLayout.PathElement.*; @@ -53,8 +52,8 @@ public class sockaddr { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("sa_family"), - MemoryLayout.sequenceLayout(14, socket_address_h.C_CHAR).withName("sa_data") + BindingUtils.C_SHORT.withName("sa_family"), + MemoryLayout.sequenceLayout(14, BindingUtils.C_CHAR).withName("sa_data") ).withName("sockaddr"); /** @@ -104,8 +103,11 @@ public static short sa_family(MemorySegment struct) { * sa_family_t sa_family * } */ - public static void sa_family(MemorySegment struct, short fieldValue) { - struct.set(sa_family$LAYOUT, sa_family$OFFSET, fieldValue); + public static void sa_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sa_family$LAYOUT, sa_family$OFFSET, (short) fieldValue); } private static final SequenceLayout sa_data$LAYOUT = (SequenceLayout)$LAYOUT.select(groupElement("sa_data")); diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java similarity index 93% rename from src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java index 8602183a5979c..64a4cc48a87f3 100644 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java @@ -25,14 +25,13 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; import java.util.function.*; -import java.util.stream.*; import static java.lang.foreign.ValueLayout.*; import static java.lang.foreign.MemoryLayout.PathElement.*; @@ -55,10 +54,10 @@ public class sockaddr_in { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("sin_family"), - socket_address_h.C_SHORT.withName("sin_port"), + BindingUtils.C_SHORT.withName("sin_family"), + BindingUtils.C_SHORT.withName("sin_port"), in_addr.layout().withName("sin_addr"), - MemoryLayout.sequenceLayout(8, socket_address_h.C_CHAR).withName("sin_zero") + MemoryLayout.sequenceLayout(8, BindingUtils.C_CHAR).withName("sin_zero") ).withName("sockaddr_in"); /** @@ -108,8 +107,11 @@ public static short sin_family(MemorySegment struct) { * sa_family_t sin_family * } */ - public static void sin_family(MemorySegment struct, short fieldValue) { - struct.set(sin_family$LAYOUT, sin_family$OFFSET, fieldValue); + public static void sin_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sin_family$LAYOUT, sin_family$OFFSET, (short) fieldValue); } private static final OfShort sin_port$LAYOUT = (OfShort)$LAYOUT.select(groupElement("sin_port")); diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java similarity index 93% rename from src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java index 1ff1c48b134ee..8f8ca14b3f7af 100644 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java @@ -25,14 +25,12 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; -import java.lang.invoke.*; import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; import java.util.function.*; -import java.util.stream.*; import static java.lang.foreign.ValueLayout.*; import static java.lang.foreign.MemoryLayout.PathElement.*; @@ -56,11 +54,11 @@ public class sockaddr_in6 { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("sin6_family"), - socket_address_h.C_SHORT.withName("sin6_port"), - socket_address_h.C_INT.withName("sin6_flowinfo"), + BindingUtils.C_SHORT.withName("sin6_family"), + BindingUtils.C_SHORT.withName("sin6_port"), + BindingUtils.C_INT.withName("sin6_flowinfo"), in6_addr.layout().withName("sin6_addr"), - socket_address_h.C_INT.withName("sin6_scope_id") + BindingUtils.C_INT.withName("sin6_scope_id") ).withName("sockaddr_in6"); /** @@ -110,8 +108,11 @@ public static short sin6_family(MemorySegment struct) { * sa_family_t sin6_family * } */ - public static void sin6_family(MemorySegment struct, short fieldValue) { - struct.set(sin6_family$LAYOUT, sin6_family$OFFSET, fieldValue); + public static void sin6_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sin6_family$LAYOUT, sin6_family$OFFSET, (short) fieldValue); } private static final OfShort sin6_port$LAYOUT = (OfShort)$LAYOUT.select(groupElement("sin6_port")); diff --git a/src/java.base/aix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/socket_address_h.java similarity index 67% rename from src/java.base/aix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java rename to src/java.base/linux/classes/jdk/internal/ffi/generated/socket/socket_address_h.java index 61e37aac0d7c6..994140e1612f1 100644 --- a/src/java.base/aix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java +++ b/src/java.base/linux/classes/jdk/internal/ffi/generated/socket/socket_address_h.java @@ -23,15 +23,34 @@ * questions. */ -package jdk.internal.bindings.net.socket; +// Generated by jextract -import java.lang.foreign.MemoryLayout.PathElement; -import static java.lang.foreign.MemoryLayout.PathElement.groupElement; +package jdk.internal.ffi.generated.socket; -public class PlatformAdapter { +@SuppressWarnings("restricted") +public class socket_address_h { - public static PathElement[] ipv4AddressBytesPath() { - throw new RuntimeException("AIX not supported"); + socket_address_h() { + // Should not be called directly } + private static final int AF_INET = (int)2L; + /** + * {@snippet lang=c : + * #define AF_INET 2 + * } + */ + public static int AF_INET() { + return AF_INET; + } + private static final int AF_INET6 = (int)10L; + /** + * {@snippet lang=c : + * #define AF_INET6 10 + * } + */ + public static int AF_INET6() { + return AF_INET6; + } } + diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java b/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java deleted file mode 100644 index 8e89c2faed0d6..0000000000000 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -// Generated by jextract - -package jdk.internal.bindings.net.socket.generated; - -import java.lang.invoke.*; -import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import static java.lang.foreign.ValueLayout.*; -import static java.lang.foreign.MemoryLayout.PathElement.*; - -@SuppressWarnings("restricted") -public class socket_address_h { - - socket_address_h() { - // Should not be called directly - } - - static final Arena LIBRARY_ARENA = Arena.ofAuto(); - static final boolean TRACE_DOWNCALLS = Boolean.getBoolean("jextract.trace.downcalls"); - - static void traceDowncall(String name, Object... args) { - String traceArgs = Arrays.stream(args) - .map(Object::toString) - .collect(Collectors.joining(", ")); - System.out.printf("%s(%s)\n", name, traceArgs); - } - - static MemorySegment findOrThrow(String symbol) { - return SYMBOL_LOOKUP.find(symbol) - .orElseThrow(() -> new UnsatisfiedLinkError("unresolved symbol: " + symbol)); - } - - static MethodHandle upcallHandle(Class fi, String name, FunctionDescriptor fdesc) { - try { - return MethodHandles.lookup().findVirtual(fi, name, fdesc.toMethodType()); - } catch (ReflectiveOperationException ex) { - throw new AssertionError(ex); - } - } - - static MemoryLayout align(MemoryLayout layout, long align) { - return switch (layout) { - case PaddingLayout p -> p; - case ValueLayout v -> v.withByteAlignment(align); - case GroupLayout g -> { - MemoryLayout[] alignedMembers = g.memberLayouts().stream() - .map(m -> align(m, align)).toArray(MemoryLayout[]::new); - yield g instanceof StructLayout ? - MemoryLayout.structLayout(alignedMembers) : MemoryLayout.unionLayout(alignedMembers); - } - case SequenceLayout s -> MemoryLayout.sequenceLayout(s.elementCount(), align(s.elementLayout(), align)); - }; - } - - static final SymbolLookup SYMBOL_LOOKUP = SymbolLookup.loaderLookup() - .or(Linker.nativeLinker().defaultLookup()); - - public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; - public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; - public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; - public static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT; - public static final ValueLayout.OfLong C_LONG_LONG = ValueLayout.JAVA_LONG; - public static final ValueLayout.OfFloat C_FLOAT = ValueLayout.JAVA_FLOAT; - public static final ValueLayout.OfDouble C_DOUBLE = ValueLayout.JAVA_DOUBLE; - public static final AddressLayout C_POINTER = ValueLayout.ADDRESS - .withTargetLayout(MemoryLayout.sequenceLayout(java.lang.Long.MAX_VALUE, JAVA_BYTE)); - public static final ValueLayout.OfLong C_LONG = ValueLayout.JAVA_LONG; - private static final int AF_INET = (int)2L; - /** - * {@snippet lang=c : - * #define AF_INET 2 - * } - */ - public static int AF_INET() { - return AF_INET; - } - private static final int AF_INET6 = (int)30L; - /** - * {@snippet lang=c : - * #define AF_INET6 30 - * } - */ - public static int AF_INET6() { - return AF_INET6; - } -} - diff --git a/src/java.base/macosx/classes/jdk/internal/ffi/generated/BindingUtils.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/BindingUtils.java new file mode 100644 index 0000000000000..ad3345543261a --- /dev/null +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/BindingUtils.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.ffi.generated; + +import java.lang.invoke.*; +import java.lang.foreign.*; +import java.nio.ByteOrder; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +import static java.lang.foreign.ValueLayout.*; +import static java.lang.foreign.MemoryLayout.PathElement.*; + +@SuppressWarnings("restricted") +public final class BindingUtils { + private BindingUtils() { + } + public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; + public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; + public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; + public static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT; + public static final ValueLayout.OfLong C_LONG_LONG = ValueLayout.JAVA_LONG; + public static final ValueLayout.OfFloat C_FLOAT = ValueLayout.JAVA_FLOAT; + public static final ValueLayout.OfDouble C_DOUBLE = ValueLayout.JAVA_DOUBLE; + public static final AddressLayout C_POINTER = ValueLayout.ADDRESS + .withTargetLayout(MemoryLayout.sequenceLayout(java.lang.Long.MAX_VALUE, JAVA_BYTE)); + public static final ValueLayout.OfLong C_LONG = ValueLayout.JAVA_LONG; +} \ No newline at end of file diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/in6_addr.java similarity index 97% rename from src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/in6_addr.java index b1295e3bbe04f..a0e97b663de4f 100644 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/in6_addr.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -83,9 +85,9 @@ public static class __u6_addr { } private static final GroupLayout $LAYOUT = MemoryLayout.unionLayout( - MemoryLayout.sequenceLayout(16, socket_address_h.C_CHAR).withName("__u6_addr8"), - MemoryLayout.sequenceLayout(8, socket_address_h.C_SHORT).withName("__u6_addr16"), - MemoryLayout.sequenceLayout(4, socket_address_h.C_INT).withName("__u6_addr32") + MemoryLayout.sequenceLayout(16, BindingUtils.C_CHAR).withName("__u6_addr8"), + MemoryLayout.sequenceLayout(8, BindingUtils.C_SHORT).withName("__u6_addr16"), + MemoryLayout.sequenceLayout(4, BindingUtils.C_INT).withName("__u6_addr32") ).withName("$anon$153:2"); /** diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/in_addr.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/in_addr.java similarity index 97% rename from src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/in_addr.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/in_addr.java index a7b07e9f55e53..d752b762682ab 100644 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/in_addr.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/in_addr.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -53,7 +55,7 @@ public class in_addr { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_INT.withName("s_addr") + BindingUtils.C_INT.withName("s_addr") ).withName("in_addr"); /** diff --git a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/package-info.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/package-info.java similarity index 77% rename from src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/package-info.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/package-info.java index cbab59ad00cad..c5c2387abad21 100644 --- a/src/java.base/linux/classes/jdk/internal/bindings/net/socket/generated/package-info.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/package-info.java @@ -32,7 +32,7 @@ * echo "#include " > $HEADER_NAME * echo "#include " >> $HEADER_NAME * - * jextract --target-package jdk.internal.bindings.net.socket.generated \ + * jextract --target-package jdk.internal.ffi.generated.socket \ * --include-struct sockaddr \ * --include-constant AF_INET \ * --include-constant AF_INET6 \ @@ -43,6 +43,12 @@ * $HEADER_NAME * } * + * After generation of native bindings, the layouts for the C builtin layouts and other + * variables/methods not specific to a component area are moved to the {@code BindingUtils} class + * for future reusability. + * If the {@code BindingUtils} class already exists, any usage of the components mentioned above is + * replaced with matching replacement from the {@code BindingUtils} where possible. + * */ -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr.java similarity index 92% rename from src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr.java index 7123353bab563..1247cffaeb345 100644 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -54,9 +56,9 @@ public class sockaddr { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_CHAR.withName("sa_len"), - socket_address_h.C_CHAR.withName("sa_family"), - MemoryLayout.sequenceLayout(14, socket_address_h.C_CHAR).withName("sa_data") + BindingUtils.C_CHAR.withName("sa_len"), + BindingUtils.C_CHAR.withName("sa_family"), + MemoryLayout.sequenceLayout(14, BindingUtils.C_CHAR).withName("sa_data") ).withName("sockaddr"); /** @@ -150,8 +152,11 @@ public static byte sa_family(MemorySegment struct) { * sa_family_t sa_family * } */ - public static void sa_family(MemorySegment struct, byte fieldValue) { - struct.set(sa_family$LAYOUT, sa_family$OFFSET, fieldValue); + public static void sa_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sa_family$LAYOUT, sa_family$OFFSET, (byte) fieldValue); } private static final SequenceLayout sa_data$LAYOUT = (SequenceLayout)$LAYOUT.select(groupElement("sa_data")); diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java similarity index 93% rename from src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java index 6ce96f4da76ed..ca85137adf1a1 100644 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -56,11 +58,11 @@ public class sockaddr_in { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_CHAR.withName("sin_len"), - socket_address_h.C_CHAR.withName("sin_family"), - socket_address_h.C_SHORT.withName("sin_port"), + BindingUtils.C_CHAR.withName("sin_len"), + BindingUtils.C_CHAR.withName("sin_family"), + BindingUtils.C_SHORT.withName("sin_port"), in_addr.layout().withName("sin_addr"), - MemoryLayout.sequenceLayout(8, socket_address_h.C_CHAR).withName("sin_zero") + MemoryLayout.sequenceLayout(8, BindingUtils.C_CHAR).withName("sin_zero") ).withName("sockaddr_in"); /** @@ -154,8 +156,11 @@ public static byte sin_family(MemorySegment struct) { * sa_family_t sin_family * } */ - public static void sin_family(MemorySegment struct, byte fieldValue) { - struct.set(sin_family$LAYOUT, sin_family$OFFSET, fieldValue); + public static void sin_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sin_family$LAYOUT, sin_family$OFFSET, (byte) fieldValue); } private static final OfShort sin_port$LAYOUT = (OfShort)$LAYOUT.select(groupElement("sin_port")); diff --git a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java similarity index 93% rename from src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java index 65ba89325392d..920bbf90e0d38 100644 --- a/src/java.base/macosx/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -57,12 +59,12 @@ public class sockaddr_in6 { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_CHAR.withName("sin6_len"), - socket_address_h.C_CHAR.withName("sin6_family"), - socket_address_h.C_SHORT.withName("sin6_port"), - socket_address_h.C_INT.withName("sin6_flowinfo"), + BindingUtils.C_CHAR.withName("sin6_len"), + BindingUtils.C_CHAR.withName("sin6_family"), + BindingUtils.C_SHORT.withName("sin6_port"), + BindingUtils.C_INT.withName("sin6_flowinfo"), in6_addr.layout().withName("sin6_addr"), - socket_address_h.C_INT.withName("sin6_scope_id") + BindingUtils.C_INT.withName("sin6_scope_id") ).withName("sockaddr_in6"); /** @@ -156,8 +158,11 @@ public static byte sin6_family(MemorySegment struct) { * sa_family_t sin6_family * } */ - public static void sin6_family(MemorySegment struct, byte fieldValue) { - struct.set(sin6_family$LAYOUT, sin6_family$OFFSET, fieldValue); + public static void sin6_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sin6_family$LAYOUT, sin6_family$OFFSET, (byte) fieldValue); } private static final OfShort sin6_port$LAYOUT = (OfShort)$LAYOUT.select(groupElement("sin6_port")); diff --git a/src/java.base/unix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/socket_address_h.java similarity index 58% rename from src/java.base/unix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java rename to src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/socket_address_h.java index 35bad6e521406..6f69aa4d5e892 100644 --- a/src/java.base/unix/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java +++ b/src/java.base/macosx/classes/jdk/internal/ffi/generated/socket/socket_address_h.java @@ -23,19 +23,44 @@ * questions. */ -package jdk.internal.bindings.net.socket; +// Generated by jextract -import java.lang.foreign.MemoryLayout.PathElement; -import static java.lang.foreign.MemoryLayout.PathElement.groupElement; +package jdk.internal.ffi.generated.socket; -public class PlatformAdapter { +import java.lang.invoke.*; +import java.lang.foreign.*; +import java.nio.ByteOrder; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; - public static PathElement[] ipv4AddressBytesPath() { - return IPV4_ADDRESS_BYTES_PATH; +import static java.lang.foreign.ValueLayout.*; +import static java.lang.foreign.MemoryLayout.PathElement.*; + +@SuppressWarnings("restricted") +public class socket_address_h { + + socket_address_h() { + // Should not be called directly } - private static final PathElement[] IPV4_ADDRESS_BYTES_PATH = new PathElement[]{ - // Native structure path: sin_addr.s_addr - groupElement("sin_addr"), - groupElement("s_addr")}; + private static final int AF_INET = (int)2L; + /** + * {@snippet lang=c : + * #define AF_INET 2 + * } + */ + public static int AF_INET() { + return AF_INET; + } + private static final int AF_INET6 = (int)30L; + /** + * {@snippet lang=c : + * #define AF_INET6 30 + * } + */ + public static int AF_INET6() { + return AF_INET6; + } } + diff --git a/src/java.base/share/classes/jdk/internal/ffi/util/FFMUtils.java b/src/java.base/share/classes/jdk/internal/ffi/util/FFMUtils.java new file mode 100644 index 0000000000000..f695a710e57a8 --- /dev/null +++ b/src/java.base/share/classes/jdk/internal/ffi/util/FFMUtils.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.ffi.util; + +import jdk.internal.misc.Unsafe; + +import java.lang.foreign.FunctionDescriptor; +import java.lang.foreign.GroupLayout; +import java.lang.foreign.Linker; +import java.lang.foreign.MemoryLayout; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.PaddingLayout; +import java.lang.foreign.SegmentAllocator; +import java.lang.foreign.SequenceLayout; +import java.lang.foreign.StructLayout; +import java.lang.foreign.SymbolLookup; +import java.lang.foreign.ValueLayout; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.util.Arrays; +import java.util.stream.Collectors; + +@SuppressWarnings("restricted") +public final class FFMUtils { + + private FFMUtils() { + } + + /** + * + * @param byteSize + * @param byteAlignment + * @return + */ + public static MemorySegment malloc(long byteSize, long byteAlignment) { + long allocatedMemory = UNSAFE.allocateMemory(byteSize); + MemorySegment result = MemorySegment.ofAddress(allocatedMemory).reinterpret(byteSize); + if (result.maxByteAlignment() < byteAlignment) { + throw new IllegalArgumentException(); + } + return result; + } + + /** + * + * @param memorySegment + */ + public static void free(MemorySegment memorySegment) { + UNSAFE.freeMemory(memorySegment.address()); + } + + // SegmentAllocator that delegates to Unsafe for memory allocation + // TODO: Anonymous class is used instead of lambda since the class can + // possibly be used early in the boot sequence. + public static final SegmentAllocator SEGMENTS_ALLOCATOR = new SegmentAllocator() { + @Override + public MemorySegment allocate(long byteSize, long byteAlignment) { + return malloc(byteSize, byteAlignment); + } + }; + + private static final Unsafe UNSAFE = Unsafe.getUnsafe(); + + // Variables and methods below are extracted from jextract generated + // code and used by native bindings on all platforms + // TODO: Un-stream the code below since it could be used early in the boot sequence + public static final boolean TRACE_DOWNCALLS = false; + static final SymbolLookup SYMBOL_LOOKUP = SymbolLookup.loaderLookup() + .or(Linker.nativeLinker().defaultLookup()); + + public static void traceDowncall(String name, Object... args) { + String traceArgs = Arrays.stream(args) + .map(Object::toString) + .collect(Collectors.joining(", ")); + System.out.printf("%s(%s)\n", name, traceArgs); + } + + public static MemorySegment findOrThrow(String symbol) { + return SYMBOL_LOOKUP.findOrThrow(symbol); + } + + public static MethodHandle upcallHandle(Class fi, String name, FunctionDescriptor fdesc) { + try { + return MethodHandles.lookup().findVirtual(fi, name, fdesc.toMethodType()); + } catch (ReflectiveOperationException ex) { + throw new AssertionError(ex); + } + } + + // TODO: The same concern with switch pattern matching as with streams above + public static MemoryLayout align(MemoryLayout layout, long align) { + return switch (layout) { + case PaddingLayout p -> p; + case ValueLayout v -> v.withByteAlignment(align); + case GroupLayout g -> { + MemoryLayout[] alignedMembers = g.memberLayouts().stream() + .map(m -> align(m, align)).toArray(MemoryLayout[]::new); + yield g instanceof StructLayout ? + MemoryLayout.structLayout(alignedMembers) : MemoryLayout.unionLayout(alignedMembers); + } + case SequenceLayout s -> MemoryLayout.sequenceLayout(s.elementCount(), align(s.elementLayout(), align)); + }; + } +} diff --git a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java index cb0002a7166a6..0430b88bc45bf 100644 --- a/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.io.UncheckedIOException; -import java.lang.foreign.Arena; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; import java.lang.ref.Cleaner.Cleanable; @@ -116,9 +115,6 @@ class DatagramChannelImpl private InetSocketAddress previousTarget; private int previousSockAddrLength; - // Shared arena that is used to allocate native memory - private final Arena arena = Arena.ofShared(); - // Cleaner to close file descriptor and free native socket address private final Cleanable cleaner; @@ -207,7 +203,7 @@ class DatagramChannelImpl this.family = family; this.fd = fd = Net.socket(family, false); this.fdVal = IOUtil.fdVal(fd); - sockAddrs = NativeSocketAddress.allocate(3, arena); + sockAddrs = NativeSocketAddress.allocate(3); readLock.lock(); try { this.sourceSockAddr = sockAddrs[0]; @@ -220,13 +216,13 @@ class DatagramChannelImpl initialized = true; } finally { if (!initialized) { - if (sockAddrs != null) NativeSocketAddress.freeAll(arena); + if (sockAddrs != null) NativeSocketAddress.freeAll(sockAddrs); if (fd != null) nd.close(fd); ResourceManager.afterUdpClose(); } } - Runnable releaser = releaserFor(fd, arena); + Runnable releaser = releaserFor(fd, sockAddrs); this.cleaner = CleanerFactory.cleaner().register(this, releaser); } @@ -247,7 +243,7 @@ class DatagramChannelImpl this.fd = fd; this.fdVal = IOUtil.fdVal(fd); - sockAddrs = NativeSocketAddress.allocate(3, arena); + sockAddrs = NativeSocketAddress.allocate(3); readLock.lock(); try { this.sourceSockAddr = sockAddrs[0]; @@ -260,13 +256,13 @@ class DatagramChannelImpl initialized = true; } finally { if (!initialized) { - if (sockAddrs != null) NativeSocketAddress.freeAll(arena); + if (sockAddrs != null) NativeSocketAddress.freeAll(sockAddrs); nd.close(fd); ResourceManager.afterUdpClose(); } } - Runnable releaser = releaserFor(fd, arena); + Runnable releaser = releaserFor(fd, sockAddrs); this.cleaner = CleanerFactory.cleaner().register(this, releaser); synchronized (stateLock) { @@ -2031,7 +2027,7 @@ public int getFDVal() { /** * Returns an action to release the given file descriptor and socket addresses. */ - private static Runnable releaserFor(FileDescriptor fd, Arena addrsArena) { + private static Runnable releaserFor(FileDescriptor fd, NativeSocketAddress... sockAddrs) { return () -> { try { nd.close(fd); @@ -2040,7 +2036,7 @@ private static Runnable releaserFor(FileDescriptor fd, Arena addrsArena) { } finally { // decrement socket count and release memory ResourceManager.afterUdpClose(); - NativeSocketAddress.freeAll(addrsArena); + NativeSocketAddress.freeAll(sockAddrs); } }; } diff --git a/src/java.base/share/classes/sun/nio/ch/NativeSocketAddress.java b/src/java.base/share/classes/sun/nio/ch/NativeSocketAddress.java index 816cb782880de..959a02883650c 100644 --- a/src/java.base/share/classes/sun/nio/ch/NativeSocketAddress.java +++ b/src/java.base/share/classes/sun/nio/ch/NativeSocketAddress.java @@ -25,10 +25,7 @@ package sun.nio.ch; -import java.lang.foreign.Arena; import java.lang.foreign.MemorySegment; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.VarHandle; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -38,18 +35,16 @@ import java.net.StandardProtocolFamily; import java.net.UnknownHostException; import java.nio.channels.UnsupportedAddressTypeException; -import java.security.AccessController; -import java.security.PrivilegedAction; import jdk.internal.access.JavaNetInetAddressAccess; import jdk.internal.access.SharedSecrets; -import jdk.internal.bindings.net.socket.PlatformAdapter; -import jdk.internal.bindings.net.socket.generated.sockaddr; -import jdk.internal.bindings.net.socket.generated.sockaddr_in; -import jdk.internal.bindings.net.socket.generated.sockaddr_in6; -import jdk.internal.bindings.net.socket.generated.socket_address_h; +import jdk.internal.ffi.generated.socket.in_addr; +import jdk.internal.ffi.util.FFMUtils; +import jdk.internal.ffi.generated.socket.sockaddr; +import jdk.internal.ffi.generated.socket.sockaddr_in; +import jdk.internal.ffi.generated.socket.sockaddr_in6; +import jdk.internal.ffi.generated.socket.socket_address_h; -import static java.lang.foreign.MemoryLayout.PathElement.groupElement; import static java.lang.foreign.ValueLayout.JAVA_BYTE; /** @@ -60,42 +55,9 @@ */ class NativeSocketAddress { - static { - // Initialize jextract generated socket_address_h class - // in doPrivileged to allow reading the generated - // 'jextract.trace.downcalls' system property. - @SuppressWarnings("removal") - var _unused = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public Void run() { - try { - Class.forName( - "jdk.internal.bindings.net.socket.generated.socket_address_h", - true, null); - } catch (ClassNotFoundException e) { - // ignore - } - return null; - } - } - ); - } - private static final JavaNetInetAddressAccess JNINA = SharedSecrets.getJavaNetInetAddressAccess(); private static final int AF_INET = socket_address_h.AF_INET(); private static final int AF_INET6 = socket_address_h.AF_INET6(); - private static final long SIZEOF_SOCKETADDRESS = Math.max(sockaddr_in.sizeof(), - sockaddr_in6.sizeof()); - private static final VarHandle SA_FAMILY_VH; - private static final VarHandle INET4_S_ADDR_VH; - - static { - var familyVH = sockaddr.layout().varHandle(groupElement("sa_family")); - SA_FAMILY_VH = MethodHandles.insertCoordinates(familyVH, 1, 0L); - var saddrVH = sockaddr_in.layout().varHandle(PlatformAdapter.ipv4AddressBytesPath()); - // pos=0 is MemorySegment; pos=1 is the offset - INET4_S_ADDR_VH = MethodHandles.insertCoordinates(saddrVH, 1, 0L); - } private final MemorySegment memory; @@ -104,7 +66,7 @@ long address() { } private NativeSocketAddress(MemorySegment memory) { - if (memory.byteSize() != SIZEOF_SOCKETADDRESS) { + if (memory.byteSize() != sockaddr_in6.layout().byteSize()) { throw new IllegalArgumentException(); } this.memory = memory; @@ -113,17 +75,15 @@ private NativeSocketAddress(MemorySegment memory) { /** * Allocate an array of native socket addresses. */ - static NativeSocketAddress[] allocate(int count, Arena arena) { - MemorySegment addressesMemory = arena.allocate(SIZEOF_SOCKETADDRESS * count); - + static NativeSocketAddress[] allocate(int count) { NativeSocketAddress[] array = new NativeSocketAddress[count]; for (int i = 0; i < count; i++) { try { - MemorySegment addressMemory = addressesMemory.asSlice( - i * SIZEOF_SOCKETADDRESS, SIZEOF_SOCKETADDRESS); + MemorySegment addressMemory = sockaddr_in6.allocate(FFMUtils.SEGMENTS_ALLOCATOR); + addressMemory.fill((byte)0); array[i] = new NativeSocketAddress(addressMemory); } catch (OutOfMemoryError e) { - freeAll(arena); + freeAll(array); throw e; } } @@ -131,12 +91,11 @@ static NativeSocketAddress[] allocate(int count, Arena arena) { } /** - * Close the provided arena. Any off-heap region of memory backing - * the native socket addresses are also released. + * Free all non-null native socket addresses in the given array. */ - static void freeAll(Arena arena) { - if (arena.scope().isAlive()) { - arena.close(); + static void freeAll(NativeSocketAddress[] array) { + for (int i = 0; i < array.length; i++) { + FFMUtils.free(array[i].memory); } } @@ -187,11 +146,7 @@ public boolean equals(Object other) { @Override public int hashCode() { - int h = 0; - for (int offset = 0; offset < SIZEOF_SOCKETADDRESS; offset++) { - h = 31 * h + memory.get(JAVA_BYTE, offset); - } - return h; + return memory.hashCode(); } @Override @@ -209,22 +164,14 @@ public String toString() { * Return the value of the sa_family field. */ private int family() { - return (int) SA_FAMILY_VH.get(memory); + return sockaddr.sa_family(memory); } /** * Stores the given family in the sa_family field. */ private void putFamily(int family) { - // sa_family type and offset differs between platforms - Class familyType = SA_FAMILY_VH.varType(); - if (familyType == short.class) { - SA_FAMILY_VH.set(memory, (short) family); - } else if (familyType == byte.class) { - SA_FAMILY_VH.set(memory, (byte) family); - } else { - throw new InternalError(); - } + sockaddr_in.sin_family(memory, family); } /** @@ -313,7 +260,8 @@ private void putAddress(int family, InetAddress ia) { private static void putAddress(MemorySegment sockaddr, Inet4Address ia) { int ipAddress = JNINA.addressValue(ia); int saddr = Integer.reverseBytes(ipAddress); - INET4_S_ADDR_VH.set(sockaddr, saddr); + var sin_addrMemory = sockaddr_in.sin_addr(sockaddr); + in_addr.s_addr(sin_addrMemory, saddr); } private static void putAddress(MemorySegment address, Inet6Address ia) { diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in_addr.java b/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in_addr.java deleted file mode 100644 index 83114b543a086..0000000000000 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in_addr.java +++ /dev/null @@ -1,868 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -// Generated by jextract - -package jdk.internal.bindings.net.socket.generated; - -import java.lang.invoke.*; -import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import static java.lang.foreign.ValueLayout.*; -import static java.lang.foreign.MemoryLayout.PathElement.*; - -/** - * {@snippet lang=c : - * struct in_addr { - * union { - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b; - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w; - * ULONG S_addr; - * } S_un; - * } - * } - */ -@SuppressWarnings("restricted") -public class in_addr { - - in_addr() { - // Should not be called directly - } - - private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - in_addr.S_un.layout().withName("S_un") - ).withName("in_addr"); - - /** - * The layout of this struct - */ - public static final GroupLayout layout() { - return $LAYOUT; - } - - /** - * {@snippet lang=c : - * union { - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b; - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w; - * ULONG S_addr; - * } - * } - */ - public static class S_un { - - S_un() { - // Should not be called directly - } - - private static final GroupLayout $LAYOUT = MemoryLayout.unionLayout( - in_addr.S_un.S_un_b.layout().withName("S_un_b"), - in_addr.S_un.S_un_w.layout().withName("S_un_w"), - socket_address_h.C_LONG.withName("S_addr") - ).withName("$anon$26:9"); - - /** - * The layout of this union - */ - public static final GroupLayout layout() { - return $LAYOUT; - } - - /** - * {@snippet lang=c : - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } - * } - */ - public static class S_un_b { - - S_un_b() { - // Should not be called directly - } - - private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_CHAR.withName("s_b1"), - socket_address_h.C_CHAR.withName("s_b2"), - socket_address_h.C_CHAR.withName("s_b3"), - socket_address_h.C_CHAR.withName("s_b4") - ).withName("$anon$27:17"); - - /** - * The layout of this struct - */ - public static final GroupLayout layout() { - return $LAYOUT; - } - - private static final OfByte s_b1$LAYOUT = (OfByte)$LAYOUT.select(groupElement("s_b1")); - - /** - * Layout for field: - * {@snippet lang=c : - * UCHAR s_b1 - * } - */ - public static final OfByte s_b1$layout() { - return s_b1$LAYOUT; - } - - private static final long s_b1$OFFSET = 0; - - /** - * Offset for field: - * {@snippet lang=c : - * UCHAR s_b1 - * } - */ - public static final long s_b1$offset() { - return s_b1$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * UCHAR s_b1 - * } - */ - public static byte s_b1(MemorySegment struct) { - return struct.get(s_b1$LAYOUT, s_b1$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * UCHAR s_b1 - * } - */ - public static void s_b1(MemorySegment struct, byte fieldValue) { - struct.set(s_b1$LAYOUT, s_b1$OFFSET, fieldValue); - } - - private static final OfByte s_b2$LAYOUT = (OfByte)$LAYOUT.select(groupElement("s_b2")); - - /** - * Layout for field: - * {@snippet lang=c : - * UCHAR s_b2 - * } - */ - public static final OfByte s_b2$layout() { - return s_b2$LAYOUT; - } - - private static final long s_b2$OFFSET = 1; - - /** - * Offset for field: - * {@snippet lang=c : - * UCHAR s_b2 - * } - */ - public static final long s_b2$offset() { - return s_b2$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * UCHAR s_b2 - * } - */ - public static byte s_b2(MemorySegment struct) { - return struct.get(s_b2$LAYOUT, s_b2$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * UCHAR s_b2 - * } - */ - public static void s_b2(MemorySegment struct, byte fieldValue) { - struct.set(s_b2$LAYOUT, s_b2$OFFSET, fieldValue); - } - - private static final OfByte s_b3$LAYOUT = (OfByte)$LAYOUT.select(groupElement("s_b3")); - - /** - * Layout for field: - * {@snippet lang=c : - * UCHAR s_b3 - * } - */ - public static final OfByte s_b3$layout() { - return s_b3$LAYOUT; - } - - private static final long s_b3$OFFSET = 2; - - /** - * Offset for field: - * {@snippet lang=c : - * UCHAR s_b3 - * } - */ - public static final long s_b3$offset() { - return s_b3$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * UCHAR s_b3 - * } - */ - public static byte s_b3(MemorySegment struct) { - return struct.get(s_b3$LAYOUT, s_b3$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * UCHAR s_b3 - * } - */ - public static void s_b3(MemorySegment struct, byte fieldValue) { - struct.set(s_b3$LAYOUT, s_b3$OFFSET, fieldValue); - } - - private static final OfByte s_b4$LAYOUT = (OfByte)$LAYOUT.select(groupElement("s_b4")); - - /** - * Layout for field: - * {@snippet lang=c : - * UCHAR s_b4 - * } - */ - public static final OfByte s_b4$layout() { - return s_b4$LAYOUT; - } - - private static final long s_b4$OFFSET = 3; - - /** - * Offset for field: - * {@snippet lang=c : - * UCHAR s_b4 - * } - */ - public static final long s_b4$offset() { - return s_b4$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * UCHAR s_b4 - * } - */ - public static byte s_b4(MemorySegment struct) { - return struct.get(s_b4$LAYOUT, s_b4$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * UCHAR s_b4 - * } - */ - public static void s_b4(MemorySegment struct, byte fieldValue) { - struct.set(s_b4$LAYOUT, s_b4$OFFSET, fieldValue); - } - - /** - * Obtains a slice of {@code arrayParam} which selects the array element at {@code index}. - * The returned segment has address {@code arrayParam.address() + index * layout().byteSize()} - */ - public static MemorySegment asSlice(MemorySegment array, long index) { - return array.asSlice(layout().byteSize() * index); - } - - /** - * The size (in bytes) of this struct - */ - public static long sizeof() { return layout().byteSize(); } - - /** - * Allocate a segment of size {@code layout().byteSize()} using {@code allocator} - */ - public static MemorySegment allocate(SegmentAllocator allocator) { - return allocator.allocate(layout()); - } - - /** - * Allocate an array of size {@code elementCount} using {@code allocator}. - * The returned segment has size {@code elementCount * layout().byteSize()}. - */ - public static MemorySegment allocateArray(long elementCount, SegmentAllocator allocator) { - return allocator.allocate(MemoryLayout.sequenceLayout(elementCount, layout())); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer cleanup) { - return reinterpret(addr, 1, arena, cleanup); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code elementCount * layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer cleanup) { - return addr.reinterpret(layout().byteSize() * elementCount, arena, cleanup); - } - } - - private static final GroupLayout S_un_b$LAYOUT = (GroupLayout)$LAYOUT.select(groupElement("S_un_b")); - - /** - * Layout for field: - * {@snippet lang=c : - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b - * } - */ - public static final GroupLayout S_un_b$layout() { - return S_un_b$LAYOUT; - } - - private static final long S_un_b$OFFSET = 0; - - /** - * Offset for field: - * {@snippet lang=c : - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b - * } - */ - public static final long S_un_b$offset() { - return S_un_b$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b - * } - */ - public static MemorySegment S_un_b(MemorySegment union) { - return union.asSlice(S_un_b$OFFSET, S_un_b$LAYOUT.byteSize()); - } - - /** - * Setter for field: - * {@snippet lang=c : - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b - * } - */ - public static void S_un_b(MemorySegment union, MemorySegment fieldValue) { - MemorySegment.copy(fieldValue, 0L, union, S_un_b$OFFSET, S_un_b$LAYOUT.byteSize()); - } - - /** - * {@snippet lang=c : - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } - * } - */ - public static class S_un_w { - - S_un_w() { - // Should not be called directly - } - - private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("s_w1"), - socket_address_h.C_SHORT.withName("s_w2") - ).withName("$anon$28:17"); - - /** - * The layout of this struct - */ - public static final GroupLayout layout() { - return $LAYOUT; - } - - private static final OfShort s_w1$LAYOUT = (OfShort)$LAYOUT.select(groupElement("s_w1")); - - /** - * Layout for field: - * {@snippet lang=c : - * USHORT s_w1 - * } - */ - public static final OfShort s_w1$layout() { - return s_w1$LAYOUT; - } - - private static final long s_w1$OFFSET = 0; - - /** - * Offset for field: - * {@snippet lang=c : - * USHORT s_w1 - * } - */ - public static final long s_w1$offset() { - return s_w1$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * USHORT s_w1 - * } - */ - public static short s_w1(MemorySegment struct) { - return struct.get(s_w1$LAYOUT, s_w1$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * USHORT s_w1 - * } - */ - public static void s_w1(MemorySegment struct, short fieldValue) { - struct.set(s_w1$LAYOUT, s_w1$OFFSET, fieldValue); - } - - private static final OfShort s_w2$LAYOUT = (OfShort)$LAYOUT.select(groupElement("s_w2")); - - /** - * Layout for field: - * {@snippet lang=c : - * USHORT s_w2 - * } - */ - public static final OfShort s_w2$layout() { - return s_w2$LAYOUT; - } - - private static final long s_w2$OFFSET = 2; - - /** - * Offset for field: - * {@snippet lang=c : - * USHORT s_w2 - * } - */ - public static final long s_w2$offset() { - return s_w2$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * USHORT s_w2 - * } - */ - public static short s_w2(MemorySegment struct) { - return struct.get(s_w2$LAYOUT, s_w2$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * USHORT s_w2 - * } - */ - public static void s_w2(MemorySegment struct, short fieldValue) { - struct.set(s_w2$LAYOUT, s_w2$OFFSET, fieldValue); - } - - /** - * Obtains a slice of {@code arrayParam} which selects the array element at {@code index}. - * The returned segment has address {@code arrayParam.address() + index * layout().byteSize()} - */ - public static MemorySegment asSlice(MemorySegment array, long index) { - return array.asSlice(layout().byteSize() * index); - } - - /** - * The size (in bytes) of this struct - */ - public static long sizeof() { return layout().byteSize(); } - - /** - * Allocate a segment of size {@code layout().byteSize()} using {@code allocator} - */ - public static MemorySegment allocate(SegmentAllocator allocator) { - return allocator.allocate(layout()); - } - - /** - * Allocate an array of size {@code elementCount} using {@code allocator}. - * The returned segment has size {@code elementCount * layout().byteSize()}. - */ - public static MemorySegment allocateArray(long elementCount, SegmentAllocator allocator) { - return allocator.allocate(MemoryLayout.sequenceLayout(elementCount, layout())); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer cleanup) { - return reinterpret(addr, 1, arena, cleanup); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code elementCount * layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer cleanup) { - return addr.reinterpret(layout().byteSize() * elementCount, arena, cleanup); - } - } - - private static final GroupLayout S_un_w$LAYOUT = (GroupLayout)$LAYOUT.select(groupElement("S_un_w")); - - /** - * Layout for field: - * {@snippet lang=c : - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w - * } - */ - public static final GroupLayout S_un_w$layout() { - return S_un_w$LAYOUT; - } - - private static final long S_un_w$OFFSET = 0; - - /** - * Offset for field: - * {@snippet lang=c : - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w - * } - */ - public static final long S_un_w$offset() { - return S_un_w$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w - * } - */ - public static MemorySegment S_un_w(MemorySegment union) { - return union.asSlice(S_un_w$OFFSET, S_un_w$LAYOUT.byteSize()); - } - - /** - * Setter for field: - * {@snippet lang=c : - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w - * } - */ - public static void S_un_w(MemorySegment union, MemorySegment fieldValue) { - MemorySegment.copy(fieldValue, 0L, union, S_un_w$OFFSET, S_un_w$LAYOUT.byteSize()); - } - - private static final OfInt S_addr$LAYOUT = (OfInt)$LAYOUT.select(groupElement("S_addr")); - - /** - * Layout for field: - * {@snippet lang=c : - * ULONG S_addr - * } - */ - public static final OfInt S_addr$layout() { - return S_addr$LAYOUT; - } - - private static final long S_addr$OFFSET = 0; - - /** - * Offset for field: - * {@snippet lang=c : - * ULONG S_addr - * } - */ - public static final long S_addr$offset() { - return S_addr$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * ULONG S_addr - * } - */ - public static int S_addr(MemorySegment union) { - return union.get(S_addr$LAYOUT, S_addr$OFFSET); - } - - /** - * Setter for field: - * {@snippet lang=c : - * ULONG S_addr - * } - */ - public static void S_addr(MemorySegment union, int fieldValue) { - union.set(S_addr$LAYOUT, S_addr$OFFSET, fieldValue); - } - - /** - * Obtains a slice of {@code arrayParam} which selects the array element at {@code index}. - * The returned segment has address {@code arrayParam.address() + index * layout().byteSize()} - */ - public static MemorySegment asSlice(MemorySegment array, long index) { - return array.asSlice(layout().byteSize() * index); - } - - /** - * The size (in bytes) of this union - */ - public static long sizeof() { return layout().byteSize(); } - - /** - * Allocate a segment of size {@code layout().byteSize()} using {@code allocator} - */ - public static MemorySegment allocate(SegmentAllocator allocator) { - return allocator.allocate(layout()); - } - - /** - * Allocate an array of size {@code elementCount} using {@code allocator}. - * The returned segment has size {@code elementCount * layout().byteSize()}. - */ - public static MemorySegment allocateArray(long elementCount, SegmentAllocator allocator) { - return allocator.allocate(MemoryLayout.sequenceLayout(elementCount, layout())); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer cleanup) { - return reinterpret(addr, 1, arena, cleanup); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code elementCount * layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer cleanup) { - return addr.reinterpret(layout().byteSize() * elementCount, arena, cleanup); - } - } - - private static final GroupLayout S_un$LAYOUT = (GroupLayout)$LAYOUT.select(groupElement("S_un")); - - /** - * Layout for field: - * {@snippet lang=c : - * union { - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b; - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w; - * ULONG S_addr; - * } S_un - * } - */ - public static final GroupLayout S_un$layout() { - return S_un$LAYOUT; - } - - private static final long S_un$OFFSET = 0; - - /** - * Offset for field: - * {@snippet lang=c : - * union { - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b; - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w; - * ULONG S_addr; - * } S_un - * } - */ - public static final long S_un$offset() { - return S_un$OFFSET; - } - - /** - * Getter for field: - * {@snippet lang=c : - * union { - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b; - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w; - * ULONG S_addr; - * } S_un - * } - */ - public static MemorySegment S_un(MemorySegment struct) { - return struct.asSlice(S_un$OFFSET, S_un$LAYOUT.byteSize()); - } - - /** - * Setter for field: - * {@snippet lang=c : - * union { - * struct { - * UCHAR s_b1; - * UCHAR s_b2; - * UCHAR s_b3; - * UCHAR s_b4; - * } S_un_b; - * struct { - * USHORT s_w1; - * USHORT s_w2; - * } S_un_w; - * ULONG S_addr; - * } S_un - * } - */ - public static void S_un(MemorySegment struct, MemorySegment fieldValue) { - MemorySegment.copy(fieldValue, 0L, struct, S_un$OFFSET, S_un$LAYOUT.byteSize()); - } - - /** - * Obtains a slice of {@code arrayParam} which selects the array element at {@code index}. - * The returned segment has address {@code arrayParam.address() + index * layout().byteSize()} - */ - public static MemorySegment asSlice(MemorySegment array, long index) { - return array.asSlice(layout().byteSize() * index); - } - - /** - * The size (in bytes) of this struct - */ - public static long sizeof() { return layout().byteSize(); } - - /** - * Allocate a segment of size {@code layout().byteSize()} using {@code allocator} - */ - public static MemorySegment allocate(SegmentAllocator allocator) { - return allocator.allocate(layout()); - } - - /** - * Allocate an array of size {@code elementCount} using {@code allocator}. - * The returned segment has size {@code elementCount * layout().byteSize()}. - */ - public static MemorySegment allocateArray(long elementCount, SegmentAllocator allocator) { - return allocator.allocate(MemoryLayout.sequenceLayout(elementCount, layout())); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer cleanup) { - return reinterpret(addr, 1, arena, cleanup); - } - - /** - * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). - * The returned segment has size {@code elementCount * layout().byteSize()} - */ - public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer cleanup) { - return addr.reinterpret(layout().byteSize() * elementCount, arena, cleanup); - } -} - diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java b/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java deleted file mode 100644 index cfb1a3a62c18a..0000000000000 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/socket_address_h.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -// Generated by jextract - -package jdk.internal.bindings.net.socket.generated; - -import java.lang.invoke.*; -import java.lang.foreign.*; -import java.nio.ByteOrder; -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import static java.lang.foreign.ValueLayout.*; -import static java.lang.foreign.MemoryLayout.PathElement.*; - -@SuppressWarnings("restricted") -public class socket_address_h { - - socket_address_h() { - // Should not be called directly - } - - static final Arena LIBRARY_ARENA = Arena.ofAuto(); - static final boolean TRACE_DOWNCALLS = Boolean.getBoolean("jextract.trace.downcalls"); - - static void traceDowncall(String name, Object... args) { - String traceArgs = Arrays.stream(args) - .map(Object::toString) - .collect(Collectors.joining(", ")); - System.out.printf("%s(%s)\n", name, traceArgs); - } - - static MemorySegment findOrThrow(String symbol) { - return SYMBOL_LOOKUP.find(symbol) - .orElseThrow(() -> new UnsatisfiedLinkError("unresolved symbol: " + symbol)); - } - - static MethodHandle upcallHandle(Class fi, String name, FunctionDescriptor fdesc) { - try { - return MethodHandles.lookup().findVirtual(fi, name, fdesc.toMethodType()); - } catch (ReflectiveOperationException ex) { - throw new AssertionError(ex); - } - } - - static MemoryLayout align(MemoryLayout layout, long align) { - return switch (layout) { - case PaddingLayout p -> p; - case ValueLayout v -> v.withByteAlignment(align); - case GroupLayout g -> { - MemoryLayout[] alignedMembers = g.memberLayouts().stream() - .map(m -> align(m, align)).toArray(MemoryLayout[]::new); - yield g instanceof StructLayout ? - MemoryLayout.structLayout(alignedMembers) : MemoryLayout.unionLayout(alignedMembers); - } - case SequenceLayout s -> MemoryLayout.sequenceLayout(s.elementCount(), align(s.elementLayout(), align)); - }; - } - - static final SymbolLookup SYMBOL_LOOKUP = SymbolLookup.loaderLookup() - .or(Linker.nativeLinker().defaultLookup()); - - public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; - public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; - public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; - public static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT; - public static final ValueLayout.OfLong C_LONG_LONG = ValueLayout.JAVA_LONG; - public static final ValueLayout.OfFloat C_FLOAT = ValueLayout.JAVA_FLOAT; - public static final ValueLayout.OfDouble C_DOUBLE = ValueLayout.JAVA_DOUBLE; - public static final AddressLayout C_POINTER = ValueLayout.ADDRESS - .withTargetLayout(MemoryLayout.sequenceLayout(java.lang.Long.MAX_VALUE, JAVA_BYTE)); - public static final ValueLayout.OfInt C_LONG = ValueLayout.JAVA_INT; - public static final ValueLayout.OfDouble C_LONG_DOUBLE = ValueLayout.JAVA_DOUBLE; - private static final int AF_INET = (int)2L; - /** - * {@snippet lang=c : - * #define AF_INET 2 - * } - */ - public static int AF_INET() { - return AF_INET; - } - private static final int AF_INET6 = (int)23L; - /** - * {@snippet lang=c : - * #define AF_INET6 23 - * } - */ - public static int AF_INET6() { - return AF_INET6; - } -} - diff --git a/src/java.base/windows/classes/jdk/internal/ffi/generated/BindingUtils.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/BindingUtils.java new file mode 100644 index 0000000000000..9d6fe79489623 --- /dev/null +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/BindingUtils.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.ffi.generated; + +import java.lang.invoke.*; +import java.lang.foreign.*; +import java.nio.ByteOrder; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +import static java.lang.foreign.ValueLayout.*; +import static java.lang.foreign.MemoryLayout.PathElement.*; + +@SuppressWarnings("restricted") +public final class BindingUtils { + private BindingUtils() { + } + public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; + public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; + public static final ValueLayout.OfShort C_SHORT = ValueLayout.JAVA_SHORT; + public static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT; + public static final ValueLayout.OfLong C_LONG_LONG = ValueLayout.JAVA_LONG; + public static final ValueLayout.OfFloat C_FLOAT = ValueLayout.JAVA_FLOAT; + public static final ValueLayout.OfDouble C_DOUBLE = ValueLayout.JAVA_DOUBLE; + public static final AddressLayout C_POINTER = ValueLayout.ADDRESS + .withTargetLayout(MemoryLayout.sequenceLayout(Long.MAX_VALUE, JAVA_BYTE)); + public static final ValueLayout.OfInt C_LONG = ValueLayout.JAVA_INT; + public static final ValueLayout.OfDouble C_LONG_DOUBLE = ValueLayout.JAVA_DOUBLE; +} diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/SCOPE_ID.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/SCOPE_ID.java similarity index 97% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/SCOPE_ID.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/SCOPE_ID.java index 3d924f9b8fda2..1a7b0f3b82773 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/SCOPE_ID.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/SCOPE_ID.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -62,7 +64,7 @@ public class SCOPE_ID { MemoryLayout.structLayout( MemoryLayout.paddingLayout(4) ).withName("$anon$624:9"), - socket_address_h.C_LONG.withName("Value") + BindingUtils.C_LONG.withName("Value") ).withName("$anon$623:5") ).withName("$anon$622:9"); diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in6_addr.java similarity index 97% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in6_addr.java index ade3269085765..59fb40064d94b 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/in6_addr.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in6_addr.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -81,8 +83,8 @@ public static class u { } private static final GroupLayout $LAYOUT = MemoryLayout.unionLayout( - MemoryLayout.sequenceLayout(16, socket_address_h.C_CHAR).withName("Byte"), - MemoryLayout.sequenceLayout(8, socket_address_h.C_SHORT).withName("Word") + MemoryLayout.sequenceLayout(16, BindingUtils.C_CHAR).withName("Byte"), + MemoryLayout.sequenceLayout(8, BindingUtils.C_SHORT).withName("Word") ).withName("$anon$26:5"); /** diff --git a/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in_addr.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in_addr.java new file mode 100644 index 0000000000000..26882f49bf4a6 --- /dev/null +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/in_addr.java @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// Generated by jextract from modified structure definition +// to match other platforms. Binary form is kept the same, +// only union views are removed. + +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; + +import java.lang.invoke.*; +import java.lang.foreign.*; +import java.nio.ByteOrder; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; + +import static java.lang.foreign.ValueLayout.*; +import static java.lang.foreign.MemoryLayout.PathElement.*; + +/** + * {@snippet lang=c : + * struct in_addr { + * unsigned long s_addr; + * } + * } + */ +@SuppressWarnings("restricted") +public class in_addr { + + in_addr() { + // Should not be called directly + } + + private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( + BindingUtils.C_LONG.withName("s_addr") + ).withName("in_addr"); + + /** + * The layout of this struct + */ + public static final GroupLayout layout() { + return $LAYOUT; + } + + private static final OfInt s_addr$LAYOUT = (OfInt)$LAYOUT.select(groupElement("s_addr")); + + /** + * Layout for field: + * {@snippet lang=c : + * unsigned long s_addr + * } + */ + public static final OfInt s_addr$layout() { + return s_addr$LAYOUT; + } + + private static final long s_addr$OFFSET = 0; + + /** + * Offset for field: + * {@snippet lang=c : + * unsigned long s_addr + * } + */ + public static final long s_addr$offset() { + return s_addr$OFFSET; + } + + /** + * Getter for field: + * {@snippet lang=c : + * unsigned long s_addr + * } + */ + public static int s_addr(MemorySegment struct) { + return struct.get(s_addr$LAYOUT, s_addr$OFFSET); + } + + /** + * Setter for field: + * {@snippet lang=c : + * unsigned long s_addr + * } + */ + public static void s_addr(MemorySegment struct, int fieldValue) { + struct.set(s_addr$LAYOUT, s_addr$OFFSET, fieldValue); + } + + /** + * Obtains a slice of {@code arrayParam} which selects the array element at {@code index}. + * The returned segment has address {@code arrayParam.address() + index * layout().byteSize()} + */ + public static MemorySegment asSlice(MemorySegment array, long index) { + return array.asSlice(layout().byteSize() * index); + } + + /** + * The size (in bytes) of this struct + */ + public static long sizeof() { return layout().byteSize(); } + + /** + * Allocate a segment of size {@code layout().byteSize()} using {@code allocator} + */ + public static MemorySegment allocate(SegmentAllocator allocator) { + return allocator.allocate(layout()); + } + + /** + * Allocate an array of size {@code elementCount} using {@code allocator}. + * The returned segment has size {@code elementCount * layout().byteSize()}. + */ + public static MemorySegment allocateArray(long elementCount, SegmentAllocator allocator) { + return allocator.allocate(MemoryLayout.sequenceLayout(elementCount, layout())); + } + + /** + * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). + * The returned segment has size {@code layout().byteSize()} + */ + public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer cleanup) { + return reinterpret(addr, 1, arena, cleanup); + } + + /** + * Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any). + * The returned segment has size {@code elementCount * layout().byteSize()} + */ + public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer cleanup) { + return addr.reinterpret(layout().byteSize() * elementCount, arena, cleanup); + } +} + diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/package-info.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/package-info.java similarity index 78% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/package-info.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/package-info.java index 3a7d021621131..f64dcb7ef869f 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/package-info.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/package-info.java @@ -34,7 +34,7 @@ * echo "#include " >> $HEADER_NAME * * - * $jextract --target-package jdk.internal.bindings.net.socket \ + * $jextract --target-package jdk.internal.ffi.generated.socket \ * --include-struct sockaddr \ * --include-constant AF_INET \ * --include-constant AF_INET6 \ @@ -46,6 +46,12 @@ * $HEADER_NAME * } * + * + * After generation of native bindings, the layouts for the C builtin layouts and other + * variables/methods not specific to a component area are moved to the {@code BindingUtils} class + * for future reusability. + * If the {@code BindingUtils} class already exists, any usage of the components mentioned above is + * replaced with matching replacement from the {@code BindingUtils} where possible. */ -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr.java similarity index 92% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr.java index e76a52e744965..ec4d3e3abefcb 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -53,8 +55,8 @@ public class sockaddr { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("sa_family"), - MemoryLayout.sequenceLayout(14, socket_address_h.C_CHAR).withName("sa_data") + BindingUtils.C_SHORT.withName("sa_family"), + MemoryLayout.sequenceLayout(14, BindingUtils.C_CHAR).withName("sa_data") ).withName("sockaddr"); /** @@ -104,8 +106,11 @@ public static short sa_family(MemorySegment struct) { * ADDRESS_FAMILY sa_family * } */ - public static void sa_family(MemorySegment struct, short fieldValue) { - struct.set(sa_family$LAYOUT, sa_family$OFFSET, fieldValue); + public static void sa_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sa_family$LAYOUT, sa_family$OFFSET, (short) fieldValue); } private static final SequenceLayout sa_data$LAYOUT = (SequenceLayout)$LAYOUT.select(groupElement("sa_data")); diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java similarity index 93% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java index 8edbd418a4c48..466c25786776f 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr_in.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -55,10 +57,10 @@ public class sockaddr_in { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("sin_family"), - socket_address_h.C_SHORT.withName("sin_port"), + BindingUtils.C_SHORT.withName("sin_family"), + BindingUtils.C_SHORT.withName("sin_port"), in_addr.layout().withName("sin_addr"), - MemoryLayout.sequenceLayout(8, socket_address_h.C_CHAR).withName("sin_zero") + MemoryLayout.sequenceLayout(8, BindingUtils.C_CHAR).withName("sin_zero") ).withName("sockaddr_in"); /** @@ -108,8 +110,11 @@ public static short sin_family(MemorySegment struct) { * ADDRESS_FAMILY sin_family * } */ - public static void sin_family(MemorySegment struct, short fieldValue) { - struct.set(sin_family$LAYOUT, sin_family$OFFSET, fieldValue); + public static void sin_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sin_family$LAYOUT, sin_family$OFFSET, (short) fieldValue); } private static final OfShort sin_port$LAYOUT = (OfShort)$LAYOUT.select(groupElement("sin_port")); diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java similarity index 94% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java index 4deba30ba755e..2ff49243ebf5f 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/generated/sockaddr_in6.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/sockaddr_in6.java @@ -25,7 +25,9 @@ // Generated by jextract -package jdk.internal.bindings.net.socket.generated; +package jdk.internal.ffi.generated.socket; + +import jdk.internal.ffi.generated.BindingUtils; import java.lang.invoke.*; import java.lang.foreign.*; @@ -59,12 +61,12 @@ public class sockaddr_in6 { } private static final GroupLayout $LAYOUT = MemoryLayout.structLayout( - socket_address_h.C_SHORT.withName("sin6_family"), - socket_address_h.C_SHORT.withName("sin6_port"), - socket_address_h.C_LONG.withName("sin6_flowinfo"), + BindingUtils.C_SHORT.withName("sin6_family"), + BindingUtils.C_SHORT.withName("sin6_port"), + BindingUtils.C_LONG.withName("sin6_flowinfo"), in6_addr.layout().withName("sin6_addr"), MemoryLayout.unionLayout( - socket_address_h.C_LONG.withName("sin6_scope_id"), + BindingUtils.C_LONG.withName("sin6_scope_id"), SCOPE_ID.layout().withName("sin6_scope_struct") ).withName("$anon$196:5") ).withName("sockaddr_in6"); @@ -116,8 +118,11 @@ public static short sin6_family(MemorySegment struct) { * ADDRESS_FAMILY sin6_family * } */ - public static void sin6_family(MemorySegment struct, short fieldValue) { - struct.set(sin6_family$LAYOUT, sin6_family$OFFSET, fieldValue); + public static void sin6_family(MemorySegment struct, int fieldValue) { + // jextract generated code was modified to take family as int + // on all platforms, and added the cast to - short or byte, + // depending on a platform native structure. + struct.set(sin6_family$LAYOUT, sin6_family$OFFSET, (short) fieldValue); } private static final OfShort sin6_port$LAYOUT = (OfShort)$LAYOUT.select(groupElement("sin6_port")); diff --git a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/socket_address_h.java similarity index 58% rename from src/java.base/windows/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java rename to src/java.base/windows/classes/jdk/internal/ffi/generated/socket/socket_address_h.java index 356355d2e5ef9..06f2e7941738f 100644 --- a/src/java.base/windows/classes/jdk/internal/bindings/net/socket/PlatformAdapter.java +++ b/src/java.base/windows/classes/jdk/internal/ffi/generated/socket/socket_address_h.java @@ -23,20 +23,44 @@ * questions. */ -package jdk.internal.bindings.net.socket; +// Generated by jextract -import java.lang.foreign.MemoryLayout.PathElement; -import static java.lang.foreign.MemoryLayout.PathElement.groupElement; +package jdk.internal.ffi.generated.socket; -public class PlatformAdapter { +import java.lang.invoke.*; +import java.lang.foreign.*; +import java.nio.ByteOrder; +import java.util.*; +import java.util.function.*; +import java.util.stream.*; - public static PathElement[] ipv4AddressBytesPath() { - return IPV4_ADDRESS_BYTES_PATH; +import static java.lang.foreign.ValueLayout.*; +import static java.lang.foreign.MemoryLayout.PathElement.*; + +@SuppressWarnings("restricted") +public class socket_address_h { + + socket_address_h() { + // Should not be called directly } - private static final PathElement[] IPV4_ADDRESS_BYTES_PATH = new PathElement[]{ - // Native structure path: sin_addr.S_un.S_addr - groupElement("sin_addr"), - groupElement("S_un"), - groupElement("S_addr")}; + private static final int AF_INET = (int)2L; + /** + * {@snippet lang=c : + * #define AF_INET 2 + * } + */ + public static int AF_INET() { + return AF_INET; + } + private static final int AF_INET6 = (int)23L; + /** + * {@snippet lang=c : + * #define AF_INET6 23 + * } + */ + public static int AF_INET6() { + return AF_INET6; + } } +