Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,6 @@ private static void modifyPinnedObjectCount(Object object, int delta) {
oldValue = pinnedObjectCount.readInt(0);
} while (!pinnedObjectCount.logicCompareAndSwapInt(0, oldValue, oldValue + delta, NamedLocationIdentity.OFF_HEAP_LOCATION));

assert oldValue < Integer.MAX_VALUE;
assert oldValue >= 0 && oldValue < Integer.MAX_VALUE && oldValue + delta >= 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,13 @@
*/
package com.oracle.svm.core.handles;

import com.oracle.svm.core.Uninterruptible;
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
import com.oracle.svm.core.feature.InternalFeature;

import org.graalvm.nativeimage.ImageSingletons;
import org.graalvm.nativeimage.PinnedObject;
import org.graalvm.word.PointerBase;

import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
import com.oracle.svm.core.feature.InternalFeature;

@AutomaticallyRegisteredFeature
final class PinnedPrimitiveArrayViewFeature implements InternalFeature {
@Override
Expand All @@ -51,7 +50,6 @@ static final class PinnedPrimitiveElementArrayReferenceImpl implements Primitive
}

@Override
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
public void close() {
pinnedObject.close();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,25 +32,25 @@
import com.oracle.svm.core.threadlocal.FastThreadLocalObject;

/**
* Manages per-thread lists of referenced objects for safe direct memory access from native code.
* Manages per-thread lists of referenced arrays for safe direct memory access from native code.
*/
public class JNIThreadLocalPrimitiveArrayViews {
private static class ReferencedObjectListNode {
final PrimitiveArrayView object;
ReferencedObjectListNode next;
private static class ReferencedArrayListNode {
final PrimitiveArrayView array;
ReferencedArrayListNode next;

ReferencedObjectListNode(PrimitiveArrayView object, ReferencedObjectListNode next) {
this.object = object;
ReferencedArrayListNode(PrimitiveArrayView array, ReferencedArrayListNode next) {
this.array = array;
this.next = next;
}
}

private static final FastThreadLocalObject<ReferencedObjectListNode> referencedObjectsListHead = FastThreadLocalFactory.createObject(ReferencedObjectListNode.class,
"JNIThreadLocalReferencedObjects.referencedObjectsListHead");
private static final FastThreadLocalObject<ReferencedArrayListNode> referencedArraysListHead = FastThreadLocalFactory.createObject(ReferencedArrayListNode.class,
"JNIThreadLocalPrimitiveArrayViews.referencedArraysListHead");

public static PrimitiveArrayView createArrayView(Object array) {
PrimitiveArrayView ref = PrimitiveArrayView.createForReading(array);
referencedObjectsListHead.set(new ReferencedObjectListNode(ref, referencedObjectsListHead.get()));
referencedArraysListHead.set(new ReferencedArrayListNode(ref, referencedArraysListHead.get()));
return ref;
}

Expand All @@ -59,23 +59,23 @@ public static <T extends PointerBase> T createArrayViewAndGetAddress(Object arra
}

public static void destroyNewestArrayViewByAddress(PointerBase address, int mode) {
ReferencedObjectListNode previous = null;
ReferencedObjectListNode current = referencedObjectsListHead.get();
ReferencedArrayListNode previous = null;
ReferencedArrayListNode current = referencedArraysListHead.get();
while (current != null) {
if (current.object.addressOfArrayElement(0) == address) {
if (current.array.addressOfArrayElement(0) == address) {
if (previous != null) {
previous.next = current.next;
} else {
referencedObjectsListHead.set(current.next);
referencedArraysListHead.set(current.next);
}

if (mode == 0 || mode == JNIMode.JNI_COMMIT()) {
current.object.syncToHeap();
current.array.syncToHeap();
}
if (mode == 0 || mode == JNIMode.JNI_ABORT()) {
current.object.close();
current.array.close();
} else {
current.object.untrack();
current.array.untrack();
}
return;
}
Expand All @@ -86,7 +86,7 @@ public static void destroyNewestArrayViewByAddress(PointerBase address, int mode

static int getCount() {
int count = 0;
ReferencedObjectListNode node = referencedObjectsListHead.get();
ReferencedArrayListNode node = referencedArraysListHead.get();
while (node != null) {
count++;
node = node.next;
Expand Down