package com.oracle.svm.core.c.function;
import org.graalvm.nativeimage.CurrentIsolate;
import org.graalvm.nativeimage.Isolate;
import org.graalvm.nativeimage.IsolateThread;
import org.graalvm.nativeimage.c.function.CEntryPoint;
import org.graalvm.nativeimage.c.function.CEntryPoint.Builtin;
import org.graalvm.word.WordFactory;
import com.oracle.svm.core.annotate.Uninterruptible;
import com.oracle.svm.core.c.function.CEntryPointOptions.NoEpilogue;
import com.oracle.svm.core.c.function.CEntryPointOptions.NoPrologue;
import com.oracle.svm.core.c.function.CEntryPointOptions.Publish;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public final class CEntryPointBuiltins {
private static final String UNINTERRUPTIBLE_REASON = "Unsafe state in case of failure";
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CEntryPointBuiltinImplementation {
Builtin builtin() default Builtin.NO_BUILTIN;
}
@Uninterruptible(reason = UNINTERRUPTIBLE_REASON)
@CEntryPoint
@CEntryPointOptions(prologue = NoPrologue.class, epilogue = NoEpilogue.class, publishAs = Publish.NotPublished)
@CEntryPointBuiltinImplementation(builtin = Builtin.CREATE_ISOLATE)
public static IsolateThread createIsolate() {
int status = CEntryPointActions.enterCreateIsolate(WordFactory.nullPointer());
if (status != 0) {
return WordFactory.nullPointer();
}
IsolateThread result = CurrentIsolate.getCurrentThread();
CEntryPointActions.leave();
return result;
}
@Uninterruptible(reason = UNINTERRUPTIBLE_REASON)
@CEntryPoint
@CEntryPointOptions(prologue = NoPrologue.class, epilogue = NoEpilogue.class, publishAs = Publish.NotPublished)
@CEntryPointBuiltinImplementation(builtin = Builtin.ATTACH_THREAD)
public static IsolateThread attachThread(Isolate isolate) {
int status = CEntryPointActions.enterAttachThread(isolate, true);
if (status != 0) {
return WordFactory.nullPointer();
}
IsolateThread result = CurrentIsolate.getCurrentThread();
CEntryPointActions.leave();
return result;
}
@Uninterruptible(reason = UNINTERRUPTIBLE_REASON)
@CEntryPoint
@CEntryPointOptions(prologue = NoPrologue.class, epilogue = NoEpilogue.class, publishAs = Publish.NotPublished)
@CEntryPointBuiltinImplementation(builtin = Builtin.GET_CURRENT_THREAD)
public static IsolateThread getCurrentThread(Isolate isolate) {
int status = CEntryPointActions.enterIsolate(isolate);
if (status != 0) {
return WordFactory.nullPointer();
}
IsolateThread thread = CurrentIsolate.getCurrentThread();
CEntryPointActions.leave();
return thread;
}
@Uninterruptible(reason = UNINTERRUPTIBLE_REASON)
@CEntryPoint
@CEntryPointOptions(prologue = NoPrologue.class, epilogue = NoEpilogue.class, publishAs = Publish.NotPublished)
@CEntryPointBuiltinImplementation(builtin = Builtin.GET_ISOLATE)
public static Isolate getIsolate(IsolateThread thread) {
int status = CEntryPointActions.enter(thread);
if (status != 0) {
return WordFactory.nullPointer();
}
Isolate isolate = CurrentIsolate.getIsolate();
CEntryPointActions.leave();
return isolate;
}
@Uninterruptible(reason = UNINTERRUPTIBLE_REASON)
@CEntryPoint
@CEntryPointOptions(prologue = NoPrologue.class, epilogue = NoEpilogue.class, publishAs = Publish.NotPublished)
@CEntryPointBuiltinImplementation(builtin = Builtin.DETACH_THREAD)
public static int detachThread(IsolateThread thread) {
int status = CEntryPointActions.enter(thread);
if (status != 0) {
return status;
}
return CEntryPointActions.leaveDetachThread();
}
@Uninterruptible(reason = UNINTERRUPTIBLE_REASON)
@CEntryPoint
@CEntryPointOptions(prologue = NoPrologue.class, epilogue = NoEpilogue.class, publishAs = Publish.NotPublished)
@CEntryPointBuiltinImplementation(builtin = Builtin.TEAR_DOWN_ISOLATE)
public static int tearDownIsolate(IsolateThread isolateThread) {
int result = CEntryPointActions.enter(isolateThread);
if (result != 0) {
return result;
}
return CEntryPointActions.leaveTearDownIsolate();
}
private CEntryPointBuiltins() {
}
}