Skip to content

Commit 075412b

Browse files
committed
Call NFI attachCurrentThread from PyGILState_Ensure
1 parent d989a48 commit 075412b

File tree

5 files changed

+40
-18
lines changed

5 files changed

+40
-18
lines changed

graalpython/com.oracle.graal.python.jni/src/capi_native.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@
5050
#include <pycore_pymem.h>
5151
#include <pycore_moduleobject.h>
5252

53+
#include <trufflenfi.h>
54+
5355
#include <stdio.h>
5456
#include <stdint.h>
5557
#include <time.h>
5658

5759
#define MUST_INLINE __attribute__((always_inline)) inline
5860

61+
TruffleContext* TRUFFLE_CONTEXT;
62+
5963
#define PY_TYPE_OBJECTS(OBJECT) \
6064
OBJECT(PyAsyncGen_Type, async_generator) \
6165
OBJECT(PyBaseObject_Type, object) \
@@ -299,14 +303,16 @@ int initNativeForwardCalled = 0;
299303
/**
300304
* Returns 1 on success, 0 on error (if it was already initialized).
301305
*/
302-
PyAPI_FUNC(int) initNativeForward(void* (*getBuiltin)(int), void* (*getAPI)(const char*), void* (*getType)(const char*), void (*setTypeStore)(const char*, void*), void (*initialize_native_locations)(void*,void*,void*)) {
306+
PyAPI_FUNC(int) initNativeForward(TruffleEnv* env, void* (*getBuiltin)(int), void* (*getAPI)(const char*), void* (*getType)(const char*), void (*setTypeStore)(const char*, void*), void (*initialize_native_locations)(void*,void*,void*)) {
303307
if (initNativeForwardCalled) {
304308
return 0;
305309
}
306310
initNativeForwardCalled = 1;
307311
clock_t t;
308312
t = clock();
309313

314+
TRUFFLE_CONTEXT = (*env)->getTruffleContext(env);
315+
310316
#define SET_TYPE_OBJECT_STORE(NAME, TYPENAME) setTypeStore(#TYPENAME, (void*) &NAME);
311317
PY_TYPE_OBJECTS(SET_TYPE_OBJECT_STORE)
312318
#undef SET_TYPE_OBJECT_STORE
@@ -459,6 +465,19 @@ void finalizeCAPI() {
459465
GraalPy_set_PyObject_ob_refcnt = nop_GraalPy_set_PyObject_ob_refcnt;
460466
}
461467

468+
PyAPI_FUNC(PyGILState_STATE) PyGILState_Ensure() {
469+
(*TRUFFLE_CONTEXT)->attachCurrentThread(TRUFFLE_CONTEXT);
470+
int res = PyTruffleGILState_Ensure();
471+
return res ? PyGILState_LOCKED : PyGILState_UNLOCKED;
472+
}
473+
474+
PyAPI_FUNC(void) PyGILState_Release(PyGILState_STATE state) {
475+
if (state == PyGILState_LOCKED) {
476+
PyTruffleGILState_Release();
477+
(*TRUFFLE_CONTEXT)->detachCurrentThread(TRUFFLE_CONTEXT);
478+
}
479+
}
480+
462481
PyObject* PyTuple_Pack(Py_ssize_t n, ...) {
463482
va_list vargs;
464483
va_start(vargs, n);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextPyStateBuiltins.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
4444
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored;
4545
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
46-
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_GIL_STATE_STATE;
4746
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
4847
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyThreadState;
4948
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Py_ssize_t;
@@ -52,6 +51,7 @@
5251
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
5352
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiNullaryBuiltinNode;
5453
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
54+
import com.oracle.graal.python.builtins.objects.PNone;
5555
import com.oracle.graal.python.builtins.objects.cext.capi.PThreadState;
5656
import com.oracle.graal.python.builtins.objects.dict.PDict;
5757
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -66,34 +66,33 @@
6666

6767
public final class PythonCextPyStateBuiltins {
6868

69-
@CApiBuiltin(ret = PY_GIL_STATE_STATE, args = {}, acquiresGIL = false, call = Direct)
70-
abstract static class PyGILState_Ensure extends CApiNullaryBuiltinNode {
69+
@CApiBuiltin(ret = Int, args = {}, acquiresGIL = false, call = Direct)
70+
abstract static class PyGILState_Check extends CApiNullaryBuiltinNode {
7171

7272
@Specialization
73-
static Object save(@Cached GilNode gil) {
74-
// TODO allow acquiring from foreign thread
75-
boolean acquired = gil.acquire();
76-
return acquired ? 1 : 0;
73+
Object check() {
74+
return PythonContext.get(this).ownsGil() ? 1 : 0;
7775
}
7876
}
7977

8078
@CApiBuiltin(ret = Int, args = {}, acquiresGIL = false, call = Direct)
81-
abstract static class PyGILState_Check extends CApiNullaryBuiltinNode {
79+
abstract static class PyTruffleGILState_Ensure extends CApiNullaryBuiltinNode {
8280

8381
@Specialization
84-
Object check() {
85-
return PythonContext.get(this).ownsGil() ? 1 : 0;
82+
static Object save(@Cached GilNode gil) {
83+
boolean acquired = gil.acquire();
84+
return acquired ? 1 : 0;
8685
}
8786
}
8887

89-
@CApiBuiltin(ret = Void, args = {PY_GIL_STATE_STATE}, acquiresGIL = false, call = Direct)
90-
abstract static class PyGILState_Release extends CApiUnaryBuiltinNode {
88+
@CApiBuiltin(ret = Void, args = {}, acquiresGIL = false, call = Direct)
89+
abstract static class PyTruffleGILState_Release extends CApiNullaryBuiltinNode {
9190

9291
@Specialization
93-
static Object restore(int state,
92+
static Object restore(
9493
@Cached GilNode gil) {
95-
gil.release(state == 1);
96-
return 0;
94+
gil.release(true);
95+
return PNone.NO_VALUE;
9796
}
9897
}
9998

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ public boolean ensureNative() {
10061006
Object initFunction = InteropLibrary.getUncached().readMember(nativeLibrary, "initNativeForward");
10071007
Object initializeNativeLocations = InteropLibrary.getUncached().readMember(getLLVMLibrary(), "initialize_native_locations");
10081008
Object signature = env.parseInternal(
1009-
Source.newBuilder(J_NFI_LANGUAGE, "((SINT32):POINTER,(STRING):POINTER,(STRING):POINTER, (STRING,SINT64):VOID, (POINTER, POINTER, POINTER):VOID):SINT32",
1009+
Source.newBuilder(J_NFI_LANGUAGE, "(ENV,(SINT32):POINTER,(STRING):POINTER,(STRING):POINTER, (STRING,SINT64):VOID, (POINTER, POINTER, POINTER):VOID):SINT32",
10101010
"exec").build()).call();
10111011
Object result = SignatureLibrary.getUncached().call(signature, initFunction, new GetBuiltin(), new GetAPI(), new GetType(), new SetTypeStore(), initializeNativeLocations);
10121012
if (InteropLibrary.getUncached().asInt(result) == 0) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiFunction.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_COMPLEX;
9797
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_C_FUNCTION;
9898
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_GEN_OBJECT;
99+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_GIL_STATE_STATE;
99100
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_HASH_T_PTR;
100101
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_IDENTIFIER;
101102
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PY_LOCK_STATUS;
@@ -367,6 +368,8 @@ public final class CApiFunction {
367368
@CApiBuiltin(name = "PyDescr_IsData", ret = Int, args = {PyObject}, call = CImpl)
368369
@CApiBuiltin(name = "PyByteArray_AsString", ret = CHAR_PTR, args = {PyObject}, call = CImpl)
369370
@CApiBuiltin(name = "PyByteArray_Size", ret = Py_ssize_t, args = {PyObject}, call = CImpl)
371+
@CApiBuiltin(name = "PyGILState_Ensure", ret = PY_GIL_STATE_STATE, args = {}, acquiresGIL = false, call = CImpl)
372+
@CApiBuiltin(name = "PyGILState_Release", ret = Void, args = {PY_GIL_STATE_STATE}, acquiresGIL = false, call = CImpl)
370373

371374
/*
372375
* Functions that are implemented in C code that needs to run on Sulong:

mx.graalpython/suite.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,8 @@
498498
"-I\"<path:com.oracle.graal.python.cext>/include\"",
499499
"-I\"<path:com.oracle.graal.python.cext>/include/internal\"",
500500
"-I\"<path:com.oracle.graal.python.cext>/src\"",
501-
"-I\"<path:com.oracle.graal.python.cext>/hpy\""
501+
"-I\"<path:com.oracle.graal.python.cext>/hpy\"",
502+
"-I\"<path:com.oracle.truffle.nfi.native>/include\""
502503
],
503504
"ldlibs": [
504505
"-lm"

0 commit comments

Comments
 (0)