Skip to content

Commit 074344f

Browse files
committed
Updated jextract generated code for macOS
1 parent 7ff270d commit 074344f

18 files changed

+1299
-676
lines changed

java-does-usb/pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
<maven.compiler.source>23</maven.compiler.source>
1313
<maven.compiler.target>23</maven.compiler.target>
1414
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15-
<sonar.exclusions>src/main/java/net/codecrete/usb/**/gen/**/*</sonar.exclusions>
1615
</properties>
1716

1817
<name>Java Does USB</name>

java-does-usb/src/main/java/net/codecrete/usb/macos/MacosAsyncTask.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package net.codecrete.usb.macos;
99

1010
import net.codecrete.usb.UsbException;
11+
import net.codecrete.usb.macos.gen.corefoundation.CFMessagePortCreateLocal$callout;
1112
import net.codecrete.usb.macos.gen.corefoundation.CoreFoundation;
1213
import net.codecrete.usb.macos.gen.iokit.IOKit;
1314

@@ -122,21 +123,14 @@ private void startAsyncIOThread() {
122123
var completionHandlerFuncDesc = FunctionDescriptor.ofVoid(ADDRESS, JAVA_INT, ADDRESS);
123124
var asyncIOCompletedMH = MethodHandles.lookup().findVirtual(MacosAsyncTask.class, "asyncIOCompleted",
124125
MethodType.methodType(void.class, MemorySegment.class, int.class, MemorySegment.class));
125-
126126
var methodHandle = asyncIOCompletedMH.bindTo(this);
127127
completionUpcallStub = Linker.nativeLinker().upcallStub(methodHandle, completionHandlerFuncDesc, Arena.global());
128128

129-
// create descriptor for message port callback function
130-
var messagePortCallbackFuncDec = FunctionDescriptor.of(ADDRESS, ADDRESS, JAVA_INT, ADDRESS, ADDRESS);
131-
var messagePortCallbackMH = MethodHandles.lookup().findVirtual(MacosAsyncTask.class, "messagePortCallback",
132-
MethodType.methodType(MemorySegment.class, MemorySegment.class, int.class, MemorySegment.class, MemorySegment.class));
133-
var messagePortCallbackHandle = messagePortCallbackMH.bindTo(this);
134-
var messagePortCallbackStub = Linker.nativeLinker().upcallStub(messagePortCallbackHandle, messagePortCallbackFuncDec, Arena.global());
135-
136129
// create local and remote message ports
137130
var pid = ProcessHandle.current().pid();
138131
var portName = CoreFoundationHelper.createCFStringRef("net.codecrete.usb.macos.eventsource." + pid, Arena.global());
139-
var localPort = CoreFoundation.CFMessagePortCreateLocal(NULL, portName, messagePortCallbackStub, NULL, NULL);
132+
var messagePortCallback = CFMessagePortCreateLocal$callout.allocate(this::messagePortCallback, Arena.global());
133+
var localPort = CoreFoundation.CFMessagePortCreateLocal(NULL, portName, messagePortCallback, NULL, NULL);
140134
messagePortSource = CoreFoundation.CFMessagePortCreateRunLoopSource(NULL, localPort, 0);
141135
messagePort = CoreFoundation.CFMessagePortCreateRemote(NULL, portName);
142136

java-does-usb/src/main/java/net/codecrete/usb/macos/gen/corefoundation/CFMessagePortCreateLocal$callout.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
* CFMessagePortCallBack callout
1818
* }
1919
*/
20-
public class CFMessagePortCreateLocal$callout {
20+
public final class CFMessagePortCreateLocal$callout {
2121

22-
CFMessagePortCreateLocal$callout() {
22+
private CFMessagePortCreateLocal$callout() {
2323
// Should not be called directly
2424
}
2525

@@ -60,9 +60,11 @@ public static MemorySegment allocate(CFMessagePortCreateLocal$callout.Function f
6060
/**
6161
* Invoke the upcall stub {@code funcPtr}, with given parameters
6262
*/
63-
public static MemorySegment invoke(MemorySegment funcPtr,MemorySegment _x0, int _x1, MemorySegment _x2, MemorySegment _x3) {
63+
public static MemorySegment invoke(MemorySegment funcPtr, MemorySegment _x0, int _x1, MemorySegment _x2, MemorySegment _x3) {
6464
try {
6565
return (MemorySegment) DOWN$MH.invokeExact(funcPtr, _x0, _x1, _x2, _x3);
66+
} catch (Error | RuntimeException ex) {
67+
throw ex;
6668
} catch (Throwable ex$) {
6769
throw new AssertionError("should not reach here", ex$);
6870
}

java-does-usb/src/main/java/net/codecrete/usb/macos/gen/corefoundation/CFRange.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static final GroupLayout layout() {
5050
return location$LAYOUT;
5151
}
5252

53-
private static final long location$OFFSET = 0;
53+
private static final long location$OFFSET = $LAYOUT.byteOffset(groupElement("location"));
5454

5555
/**
5656
* Offset for field:
@@ -94,7 +94,7 @@ public static void location(MemorySegment struct, long fieldValue) {
9494
return length$LAYOUT;
9595
}
9696

97-
private static final long length$OFFSET = 8;
97+
private static final long length$OFFSET = $LAYOUT.byteOffset(groupElement("length"));
9898

9999
/**
100100
* Offset for field:
@@ -155,15 +155,15 @@ public static MemorySegment allocateArray(long elementCount, SegmentAllocator al
155155
}
156156

157157
/**
158-
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any).
158+
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction} (if any).
159159
* The returned segment has size {@code layout().byteSize()}
160160
*/
161161
public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer<MemorySegment> cleanup) {
162162
return reinterpret(addr, 1, arena, cleanup);
163163
}
164164

165165
/**
166-
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any).
166+
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction} (if any).
167167
* The returned segment has size {@code elementCount * layout().byteSize()}
168168
*/
169169
public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer<MemorySegment> cleanup) {

java-does-usb/src/main/java/net/codecrete/usb/macos/gen/corefoundation/CFUUIDBytes.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public static final GroupLayout layout() {
7878
return byte0$LAYOUT;
7979
}
8080

81-
private static final long byte0$OFFSET = 0;
81+
private static final long byte0$OFFSET = $LAYOUT.byteOffset(groupElement("byte0"));
8282

8383
/**
8484
* Offset for field:
@@ -122,7 +122,7 @@ public static void byte0(MemorySegment struct, byte fieldValue) {
122122
return byte1$LAYOUT;
123123
}
124124

125-
private static final long byte1$OFFSET = 1;
125+
private static final long byte1$OFFSET = $LAYOUT.byteOffset(groupElement("byte1"));
126126

127127
/**
128128
* Offset for field:
@@ -166,7 +166,7 @@ public static void byte1(MemorySegment struct, byte fieldValue) {
166166
return byte2$LAYOUT;
167167
}
168168

169-
private static final long byte2$OFFSET = 2;
169+
private static final long byte2$OFFSET = $LAYOUT.byteOffset(groupElement("byte2"));
170170

171171
/**
172172
* Offset for field:
@@ -210,7 +210,7 @@ public static void byte2(MemorySegment struct, byte fieldValue) {
210210
return byte3$LAYOUT;
211211
}
212212

213-
private static final long byte3$OFFSET = 3;
213+
private static final long byte3$OFFSET = $LAYOUT.byteOffset(groupElement("byte3"));
214214

215215
/**
216216
* Offset for field:
@@ -254,7 +254,7 @@ public static void byte3(MemorySegment struct, byte fieldValue) {
254254
return byte4$LAYOUT;
255255
}
256256

257-
private static final long byte4$OFFSET = 4;
257+
private static final long byte4$OFFSET = $LAYOUT.byteOffset(groupElement("byte4"));
258258

259259
/**
260260
* Offset for field:
@@ -298,7 +298,7 @@ public static void byte4(MemorySegment struct, byte fieldValue) {
298298
return byte5$LAYOUT;
299299
}
300300

301-
private static final long byte5$OFFSET = 5;
301+
private static final long byte5$OFFSET = $LAYOUT.byteOffset(groupElement("byte5"));
302302

303303
/**
304304
* Offset for field:
@@ -342,7 +342,7 @@ public static void byte5(MemorySegment struct, byte fieldValue) {
342342
return byte6$LAYOUT;
343343
}
344344

345-
private static final long byte6$OFFSET = 6;
345+
private static final long byte6$OFFSET = $LAYOUT.byteOffset(groupElement("byte6"));
346346

347347
/**
348348
* Offset for field:
@@ -386,7 +386,7 @@ public static void byte6(MemorySegment struct, byte fieldValue) {
386386
return byte7$LAYOUT;
387387
}
388388

389-
private static final long byte7$OFFSET = 7;
389+
private static final long byte7$OFFSET = $LAYOUT.byteOffset(groupElement("byte7"));
390390

391391
/**
392392
* Offset for field:
@@ -430,7 +430,7 @@ public static void byte7(MemorySegment struct, byte fieldValue) {
430430
return byte8$LAYOUT;
431431
}
432432

433-
private static final long byte8$OFFSET = 8;
433+
private static final long byte8$OFFSET = $LAYOUT.byteOffset(groupElement("byte8"));
434434

435435
/**
436436
* Offset for field:
@@ -474,7 +474,7 @@ public static void byte8(MemorySegment struct, byte fieldValue) {
474474
return byte9$LAYOUT;
475475
}
476476

477-
private static final long byte9$OFFSET = 9;
477+
private static final long byte9$OFFSET = $LAYOUT.byteOffset(groupElement("byte9"));
478478

479479
/**
480480
* Offset for field:
@@ -518,7 +518,7 @@ public static void byte9(MemorySegment struct, byte fieldValue) {
518518
return byte10$LAYOUT;
519519
}
520520

521-
private static final long byte10$OFFSET = 10;
521+
private static final long byte10$OFFSET = $LAYOUT.byteOffset(groupElement("byte10"));
522522

523523
/**
524524
* Offset for field:
@@ -562,7 +562,7 @@ public static void byte10(MemorySegment struct, byte fieldValue) {
562562
return byte11$LAYOUT;
563563
}
564564

565-
private static final long byte11$OFFSET = 11;
565+
private static final long byte11$OFFSET = $LAYOUT.byteOffset(groupElement("byte11"));
566566

567567
/**
568568
* Offset for field:
@@ -606,7 +606,7 @@ public static void byte11(MemorySegment struct, byte fieldValue) {
606606
return byte12$LAYOUT;
607607
}
608608

609-
private static final long byte12$OFFSET = 12;
609+
private static final long byte12$OFFSET = $LAYOUT.byteOffset(groupElement("byte12"));
610610

611611
/**
612612
* Offset for field:
@@ -650,7 +650,7 @@ public static void byte12(MemorySegment struct, byte fieldValue) {
650650
return byte13$LAYOUT;
651651
}
652652

653-
private static final long byte13$OFFSET = 13;
653+
private static final long byte13$OFFSET = $LAYOUT.byteOffset(groupElement("byte13"));
654654

655655
/**
656656
* Offset for field:
@@ -694,7 +694,7 @@ public static void byte13(MemorySegment struct, byte fieldValue) {
694694
return byte14$LAYOUT;
695695
}
696696

697-
private static final long byte14$OFFSET = 14;
697+
private static final long byte14$OFFSET = $LAYOUT.byteOffset(groupElement("byte14"));
698698

699699
/**
700700
* Offset for field:
@@ -738,7 +738,7 @@ public static void byte14(MemorySegment struct, byte fieldValue) {
738738
return byte15$LAYOUT;
739739
}
740740

741-
private static final long byte15$OFFSET = 15;
741+
private static final long byte15$OFFSET = $LAYOUT.byteOffset(groupElement("byte15"));
742742

743743
/**
744744
* Offset for field:
@@ -799,15 +799,15 @@ public static MemorySegment allocateArray(long elementCount, SegmentAllocator al
799799
}
800800

801801
/**
802-
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any).
802+
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction} (if any).
803803
* The returned segment has size {@code layout().byteSize()}
804804
*/
805805
public static MemorySegment reinterpret(MemorySegment addr, Arena arena, Consumer<MemorySegment> cleanup) {
806806
return reinterpret(addr, 1, arena, cleanup);
807807
}
808808

809809
/**
810-
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction) (if any).
810+
* Reinterprets {@code addr} using target {@code arena} and {@code cleanupAction} (if any).
811811
* The returned segment has size {@code elementCount * layout().byteSize()}
812812
*/
813813
public static MemorySegment reinterpret(MemorySegment addr, long elementCount, Arena arena, Consumer<MemorySegment> cleanup) {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Generated by jextract
2+
3+
package net.codecrete.usb.macos.gen.corefoundation;
4+
5+
import java.lang.invoke.*;
6+
import java.lang.foreign.*;
7+
import java.nio.ByteOrder;
8+
import java.util.*;
9+
import java.util.function.*;
10+
import java.util.stream.*;
11+
12+
import static java.lang.foreign.ValueLayout.*;
13+
import static java.lang.foreign.MemoryLayout.PathElement.*;
14+
15+
public class CoreFoundation$shared {
16+
17+
CoreFoundation$shared() {
18+
// Should not be called directly
19+
}
20+
21+
public static final ValueLayout.OfBoolean C_BOOL = (ValueLayout.OfBoolean) Linker.nativeLinker().canonicalLayouts().get("bool");
22+
public static final ValueLayout.OfByte C_CHAR =(ValueLayout.OfByte)Linker.nativeLinker().canonicalLayouts().get("char");
23+
public static final ValueLayout.OfShort C_SHORT = (ValueLayout.OfShort) Linker.nativeLinker().canonicalLayouts().get("short");
24+
public static final ValueLayout.OfInt C_INT = (ValueLayout.OfInt) Linker.nativeLinker().canonicalLayouts().get("int");
25+
public static final ValueLayout.OfLong C_LONG_LONG = (ValueLayout.OfLong) Linker.nativeLinker().canonicalLayouts().get("long long");
26+
public static final ValueLayout.OfFloat C_FLOAT = (ValueLayout.OfFloat) Linker.nativeLinker().canonicalLayouts().get("float");
27+
public static final ValueLayout.OfDouble C_DOUBLE = (ValueLayout.OfDouble) Linker.nativeLinker().canonicalLayouts().get("double");
28+
public static final AddressLayout C_POINTER = ((AddressLayout) Linker.nativeLinker().canonicalLayouts().get("void*"))
29+
.withTargetLayout(MemoryLayout.sequenceLayout(java.lang.Long.MAX_VALUE, C_CHAR));
30+
public static final ValueLayout.OfLong C_LONG = (ValueLayout.OfLong) Linker.nativeLinker().canonicalLayouts().get("long");
31+
32+
static final boolean TRACE_DOWNCALLS = Boolean.getBoolean("jextract.trace.downcalls");
33+
34+
static void traceDowncall(String name, Object... args) {
35+
String traceArgs = Arrays.stream(args)
36+
.map(Object::toString)
37+
.collect(Collectors.joining(", "));
38+
System.out.printf("%s(%s)\n", name, traceArgs);
39+
}
40+
41+
static MethodHandle upcallHandle(Class<?> fi, String name, FunctionDescriptor fdesc) {
42+
try {
43+
return MethodHandles.lookup().findVirtual(fi, name, fdesc.toMethodType());
44+
} catch (ReflectiveOperationException ex) {
45+
throw new AssertionError(ex);
46+
}
47+
}
48+
49+
static MemoryLayout align(MemoryLayout layout, long align) {
50+
return switch (layout) {
51+
case PaddingLayout p -> p;
52+
case ValueLayout v -> v.withByteAlignment(align);
53+
case GroupLayout g -> {
54+
MemoryLayout[] alignedMembers = g.memberLayouts().stream()
55+
.map(m -> align(m, align)).toArray(MemoryLayout[]::new);
56+
yield g instanceof StructLayout ?
57+
MemoryLayout.structLayout(alignedMembers) : MemoryLayout.unionLayout(alignedMembers);
58+
}
59+
case SequenceLayout s -> MemoryLayout.sequenceLayout(s.elementCount(), align(s.elementLayout(), align));
60+
};
61+
}
62+
}
63+

0 commit comments

Comments
 (0)