Search in sources :

Example 36 with FunctionDescriptor

use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.

the class StructTests method test_addCharFromPointerAndCharsFromStruct_returnCharPointer.

@Test
public void test_addCharFromPointerAndCharsFromStruct_returnCharPointer() throws Throwable {
    GroupLayout structLayout = MemoryLayout.ofStruct(C_SHORT.withName("elem1"), C_SHORT.withName("elem2"));
    VarHandle charHandle1 = structLayout.varHandle(char.class, PathElement.groupElement("elem1"));
    VarHandle charHandle2 = structLayout.varHandle(char.class, PathElement.groupElement("elem2"));
    MethodType mt = MethodType.methodType(MemoryAddress.class, MemoryAddress.class, MemorySegment.class);
    FunctionDescriptor fd = FunctionDescriptor.of(C_POINTER, C_POINTER, structLayout);
    Symbol functionSymbol = nativeLib.lookup("addCharFromPointerAndCharsFromStruct_returnCharPointer").get();
    MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
    MemorySegment charSegmt = MemorySegment.allocateNative(C_SHORT);
    MemoryAccess.setChar(charSegmt, 'D');
    MemorySegment structSegmt = MemorySegment.allocateNative(structLayout);
    charHandle1.set(structSegmt, 'E');
    charHandle2.set(structSegmt, 'F');
    MemoryAddress resultAddr = (MemoryAddress) mh.invokeExact(charSegmt.address(), structSegmt);
    MemorySegment resultSegmt = resultAddr.asSegmentRestricted(C_SHORT.byteSize());
    VarHandle charHandle = MemoryHandles.varHandle(char.class, ByteOrder.nativeOrder());
    char result = (char) charHandle.get(resultSegmt, 0);
    Assert.assertEquals(result, 'M');
    Assert.assertEquals(resultSegmt.address().toRawLongValue(), charSegmt.address().toRawLongValue());
    charSegmt.close();
    structSegmt.close();
    resultSegmt.close();
}
Also used : MethodType(java.lang.invoke.MethodType) VarHandle(java.lang.invoke.VarHandle) Symbol(jdk.incubator.foreign.LibraryLookup.Symbol) GroupLayout(jdk.incubator.foreign.GroupLayout) FunctionDescriptor(jdk.incubator.foreign.FunctionDescriptor) MemoryAddress(jdk.incubator.foreign.MemoryAddress) MemorySegment(jdk.incubator.foreign.MemorySegment) MethodHandle(java.lang.invoke.MethodHandle) Test(org.testng.annotations.Test)

Example 37 with FunctionDescriptor

use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.

the class StructTests method test_addShortFromPointerAndShortsFromStruct_returnShortPointer.

@Test
public void test_addShortFromPointerAndShortsFromStruct_returnShortPointer() throws Throwable {
    GroupLayout structLayout = MemoryLayout.ofStruct(C_SHORT.withName("elem1"), C_SHORT.withName("elem2"));
    VarHandle shortHandle1 = structLayout.varHandle(short.class, PathElement.groupElement("elem1"));
    VarHandle shortHandle2 = structLayout.varHandle(short.class, PathElement.groupElement("elem2"));
    MethodType mt = MethodType.methodType(MemoryAddress.class, MemoryAddress.class, MemorySegment.class);
    FunctionDescriptor fd = FunctionDescriptor.of(C_POINTER, C_POINTER, structLayout);
    Symbol functionSymbol = nativeLib.lookup("addShortFromPointerAndShortsFromStruct_returnShortPointer").get();
    MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
    MemorySegment shortSegmt = MemorySegment.allocateNative(C_SHORT);
    MemoryAccess.setShort(shortSegmt, (short) 12);
    MemorySegment structSegmt = MemorySegment.allocateNative(structLayout);
    shortHandle1.set(structSegmt, (short) 18);
    shortHandle2.set(structSegmt, (short) 19);
    MemoryAddress resultAddr = (MemoryAddress) mh.invokeExact(shortSegmt.address(), structSegmt);
    MemorySegment resultSegmt = resultAddr.asSegmentRestricted(C_SHORT.byteSize());
    VarHandle shortHandle = MemoryHandles.varHandle(short.class, ByteOrder.nativeOrder());
    short result = (short) shortHandle.get(resultSegmt, 0);
    Assert.assertEquals(result, 49);
    Assert.assertEquals(resultSegmt.address().toRawLongValue(), shortSegmt.address().toRawLongValue());
    shortSegmt.close();
    structSegmt.close();
    resultSegmt.close();
}
Also used : MethodType(java.lang.invoke.MethodType) VarHandle(java.lang.invoke.VarHandle) Symbol(jdk.incubator.foreign.LibraryLookup.Symbol) GroupLayout(jdk.incubator.foreign.GroupLayout) FunctionDescriptor(jdk.incubator.foreign.FunctionDescriptor) MemoryAddress(jdk.incubator.foreign.MemoryAddress) MemorySegment(jdk.incubator.foreign.MemorySegment) MethodHandle(java.lang.invoke.MethodHandle) Test(org.testng.annotations.Test)

Example 38 with FunctionDescriptor

use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.

the class MultiThreadingTests4 method test_multiThreadsWithMixedFuncDescriptors.

@Test
public void test_multiThreadsWithMixedFuncDescriptors() throws Throwable {
    Thread thr1 = new Thread() {

        public void run() {
            try {
                MethodType mt = MethodType.methodType(int.class, int.class, int.class);
                FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT);
                Addressable functionSymbol = nativeLibLookup.lookup("add2Ints").get();
                MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
                int result = (int) mh.invokeExact(128, 246);
                Assert.assertEquals(result, 374);
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        }
    };
    Thread thr2 = new Thread() {

        public void run() {
            try {
                MethodType mt = MethodType.methodType(int.class, int.class, int.class, int.class);
                FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT, C_INT);
                Addressable functionSymbol = nativeLibLookup.lookup("add3Ints").get();
                MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
                int result = (int) mh.invokeExact(112, 642, 971);
                Assert.assertEquals(result, 1725);
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        }
    };
    Thread thr3 = new Thread() {

        public void run() {
            try {
                MethodType mt = MethodType.methodType(boolean.class, boolean.class, boolean.class);
                FunctionDescriptor fd = FunctionDescriptor.of(C_CHAR, C_CHAR, C_CHAR);
                Addressable functionSymbol = nativeLibLookup.lookup("add2BoolsWithOr").get();
                MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
                boolean result = (boolean) mh.invokeExact(true, false);
                Assert.assertEquals(result, true);
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        }
    };
    Thread thr4 = new Thread() {

        public void run() {
            try {
                MethodType mt = MethodType.methodType(int.class, int.class, int.class);
                FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT);
                Addressable functionSymbol = nativeLibLookup.lookup("add2Ints").get();
                MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
                int result = (int) mh.invokeExact(416, 728);
                Assert.assertEquals(result, 1144);
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        }
    };
    Thread thr5 = new Thread() {

        public void run() {
            try {
                MethodType mt = MethodType.methodType(int.class, int.class, int.class, int.class);
                FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT, C_INT);
                Addressable functionSymbol = nativeLibLookup.lookup("add3Ints").get();
                MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
                int result = (int) mh.invokeExact(1012, 1023, 2035);
                Assert.assertEquals(result, 4070);
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        }
    };
    Thread thr6 = new Thread() {

        public void run() {
            try {
                MethodType mt = MethodType.methodType(boolean.class, boolean.class, boolean.class);
                FunctionDescriptor fd = FunctionDescriptor.of(C_CHAR, C_CHAR, C_CHAR);
                Addressable functionSymbol = nativeLibLookup.lookup("add2BoolsWithOr").get();
                MethodHandle mh = clinker.downcallHandle(functionSymbol, mt, fd);
                boolean result = (boolean) mh.invokeExact(false, false);
                Assert.assertEquals(result, false);
            } catch (Throwable t) {
                throw new RuntimeException(t);
            }
        }
    };
    thr1.setUncaughtExceptionHandler(this);
    thr2.setUncaughtExceptionHandler(this);
    thr3.setUncaughtExceptionHandler(this);
    thr4.setUncaughtExceptionHandler(this);
    thr5.setUncaughtExceptionHandler(this);
    thr6.setUncaughtExceptionHandler(this);
    thr1.start();
    thr2.start();
    thr3.start();
    thr4.start();
    thr5.start();
    thr6.start();
    thr6.join();
    thr5.join();
    thr4.join();
    thr3.join();
    thr2.join();
    thr1.join();
    if (initException != null) {
        throw new RuntimeException(initException);
    }
}
Also used : MethodType(java.lang.invoke.MethodType) Addressable(jdk.incubator.foreign.Addressable) FunctionDescriptor(jdk.incubator.foreign.FunctionDescriptor) MethodHandle(java.lang.invoke.MethodHandle) Test(org.testng.annotations.Test)

Example 39 with FunctionDescriptor

use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.

the class PrimitiveTypeTests2 method test_addTwoNegtiveInts_2.

@Test
public void test_addTwoNegtiveInts_2() throws Throwable {
    MethodType mt = MethodType.methodType(int.class, int.class, int.class);
    FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_INT, C_INT);
    Addressable functionSymbol = nativeLibLookup.lookup("add2Ints").get();
    MethodHandle mh = clinker.downcallHandle(functionSymbol, allocator, mt, fd);
    int result = (int) mh.invokeExact(-112, -123);
    Assert.assertEquals(result, -235);
}
Also used : MethodType(java.lang.invoke.MethodType) Addressable(jdk.incubator.foreign.Addressable) FunctionDescriptor(jdk.incubator.foreign.FunctionDescriptor) MethodHandle(java.lang.invoke.MethodHandle) Test(org.testng.annotations.Test)

Example 40 with FunctionDescriptor

use of jdk.incubator.foreign.FunctionDescriptor in project openj9 by eclipse.

the class PrimitiveTypeTests2 method test_printfFromDefaultLibWithMemAddr_fromMemAddr_2.

@Test
public void test_printfFromDefaultLibWithMemAddr_fromMemAddr_2() throws Throwable {
    /* Temporarily disable the default library loading on AIX till we figure out a way
		 * around to handle the case as the official implementation in OpenJDK17 doesn't
		 * help to load the static libray (libc.a).
		 */
    if (!isAixOS) {
        Addressable functionSymbol = defaultLibLookup.lookup("printf").get();
        MemoryAddress memAddr = functionSymbol.address();
        MethodType mt = MethodType.methodType(int.class, MemoryAddress.class, int.class, int.class, int.class);
        FunctionDescriptor fd = FunctionDescriptor.of(C_INT, C_POINTER, C_INT, C_INT, C_INT);
        MethodHandle mh = clinker.downcallHandle(memAddr, allocator, mt, fd);
        MemorySegment formatMemSegment = CLinker.toCString("\n%d + %d = %d\n", resourceScope);
        mh.invoke(formatMemSegment.address(), 15, 27, 42);
    }
}
Also used : MethodType(java.lang.invoke.MethodType) Addressable(jdk.incubator.foreign.Addressable) FunctionDescriptor(jdk.incubator.foreign.FunctionDescriptor) MemoryAddress(jdk.incubator.foreign.MemoryAddress) MemorySegment(jdk.incubator.foreign.MemorySegment) MethodHandle(java.lang.invoke.MethodHandle) Test(org.testng.annotations.Test)

Aggregations

MethodHandle (java.lang.invoke.MethodHandle)939 FunctionDescriptor (jdk.incubator.foreign.FunctionDescriptor)939 Test (org.testng.annotations.Test)939 MemorySegment (jdk.incubator.foreign.MemorySegment)754 GroupLayout (jdk.incubator.foreign.GroupLayout)675 MethodType (java.lang.invoke.MethodType)605 ResourceScope (jdk.incubator.foreign.ResourceScope)549 SegmentAllocator (jdk.incubator.foreign.SegmentAllocator)541 Addressable (jdk.incubator.foreign.Addressable)432 NativeSymbol (jdk.incubator.foreign.NativeSymbol)334 VarHandle (java.lang.invoke.VarHandle)318 SequenceLayout (jdk.incubator.foreign.SequenceLayout)240 Symbol (jdk.incubator.foreign.LibraryLookup.Symbol)173 MemoryAddress (jdk.incubator.foreign.MemoryAddress)127 VaList (jdk.incubator.foreign.VaList)4