From 393218fd18981b3a030ea971b5eafae54cd638cc Mon Sep 17 00:00:00 2001 From: "Manuel Bl." Date: Sat, 7 Dec 2024 22:01:48 +0100 Subject: [PATCH] Linux: use array element var handle --- .../src/main/java/net/codecrete/usb/linux/EPoll.java | 8 +++++++- .../main/java/net/codecrete/usb/linux/LinuxAsyncTask.java | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/java-does-usb/src/main/java/net/codecrete/usb/linux/EPoll.java b/java-does-usb/src/main/java/net/codecrete/usb/linux/EPoll.java index ac33efe..2b6c411 100644 --- a/java-does-usb/src/main/java/net/codecrete/usb/linux/EPoll.java +++ b/java-does-usb/src/main/java/net/codecrete/usb/linux/EPoll.java @@ -50,8 +50,14 @@ private EPoll() {} JAVA_INT_UNALIGNED.withName("events"), DATA$LAYOUT.withName("data")).withName("epoll_event"); + // varhandle to access the "fd" field in an epoll_event array + static final VarHandle EVENT_ARRAY_DATA_FD$VH = EVENT$LAYOUT.arrayElementVarHandle( + MemoryLayout.PathElement.groupElement("data"), + MemoryLayout.PathElement.groupElement("fd") + ); + // varhandle to access the "fd" field in an epoll_event struct - static final VarHandle EVENT_DATA_FD$VH = EVENT$LAYOUT.varHandle( + private static final VarHandle EVENT_DATA_FD$VH = EVENT$LAYOUT.varHandle( MemoryLayout.PathElement.groupElement("data"), MemoryLayout.PathElement.groupElement("fd") ); diff --git a/java-does-usb/src/main/java/net/codecrete/usb/linux/LinuxAsyncTask.java b/java-does-usb/src/main/java/net/codecrete/usb/linux/LinuxAsyncTask.java index 1fe40ce..079b68e 100644 --- a/java-does-usb/src/main/java/net/codecrete/usb/linux/LinuxAsyncTask.java +++ b/java-does-usb/src/main/java/net/codecrete/usb/linux/LinuxAsyncTask.java @@ -98,8 +98,7 @@ private void asyncCompletionTask() { // for all ready file descriptors, reap URBs for (int i = 0; i < res; i++) { - var event = events.asSlice(i * EPoll.EVENT$LAYOUT.byteSize(), EPoll.EVENT$LAYOUT); - var fd = (int) EPoll.EVENT_DATA_FD$VH.get(event, 0L); + var fd = (int) EPoll.EVENT_ARRAY_DATA_FD$VH.get(events, 0L, i); reapURBs(fd, urbPointerHolder, errorState); } }