X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.pythonlink.win32.x86_64%2Fsrc%2Fsclpy.c;h=428a45a35667fe34fcf70b0f0baae0f465c53557;hb=1a64cbed776f5011b685b7d32bc4c217f1ae4264;hp=4881cc7d7c26d4a20979542530230724dc1df5f2;hpb=ac16ebed6a3e0932f774ca3ee5963ed776ef6c08;p=simantics%2Fpython.git diff --git a/org.simantics.pythonlink.win32.x86_64/src/sclpy.c b/org.simantics.pythonlink.win32.x86_64/src/sclpy.c index 4881cc7..428a45a 100644 --- a/org.simantics.pythonlink.win32.x86_64/src/sclpy.c +++ b/org.simantics.pythonlink.win32.x86_64/src/sclpy.c @@ -53,19 +53,26 @@ writeToSCL(PyObject *self, PyObject *args) Py_UNICODE *what; Py_ssize_t length; if (!PyArg_ParseTuple(args, "u#", &what, &length)) - return Py_BuildValue(""); + Py_RETURN_NONE; { - jclass writerClass = (*env)->FindClass(env, WRITER_CLASS); - jmethodID writeMethod = (*env)->GetMethodID(env, writerClass, "write", "([CII)V"); - jcharArray chars = (*env)->NewCharArray(env, (jsize)length); - - (*env)->SetCharArrayRegion(env, chars, 0, length, what); - (*env)->CallVoidMethod(env, sclWriter, writeMethod, chars, 0, length); + PyThreadState *my_ts = PyThreadState_Get(); + if (my_ts == main_ts) { + jclass writerClass = (*env)->FindClass(env, WRITER_CLASS); + jmethodID writeMethod = (*env)->GetMethodID(env, writerClass, "write", "([CII)V"); + jcharArray chars = (*env)->NewCharArray(env, (jsize)length); + + (*env)->SetCharArrayRegion(env, chars, 0, length, what); + Py_BEGIN_ALLOW_THREADS + (*env)->CallVoidMethod(env, sclWriter, writeMethod, chars, 0, length); + Py_END_ALLOW_THREADS + } else { + //TODO + } } } - return Py_BuildValue(""); + Py_RETURN_NONE; } static PyMethodDef sclWriterMethods[] = { @@ -115,6 +122,7 @@ JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_createContex PyDict_SetItemString(dict, "__builtin__", builtin); PyDict_SetItemString(dict, "__builtins__", builtin); + PyEval_SaveThread(); return (jlong)modDef; } } @@ -856,9 +864,10 @@ jobject pythonDictionaryAsMap(JNIEnv *env, PyObject *dict) { ##VariableImpl( \ JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, \ jtype value) { \ - PyObject *module = getModule(contextID); \ + PyObject *module; \ \ PyEval_RestoreThread(main_ts); \ + module = getModule(contextID); \ setPythonVariable(module, getPythonString(env, variableName), \ j2py(env, value)); \ PyEval_SaveThread(); \ @@ -883,8 +892,6 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonNDArrayVariableImpl( JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jobject value) { - PyObject *module = getModule(contextID); - if (!hasNumpy) { throwPythonException(env, "Importing numpy failed"); return; @@ -892,6 +899,7 @@ Java_org_simantics_pythonlink_PythonContext_setPythonNDArrayVariableImpl( PyEval_RestoreThread(main_ts); { + PyObject *module = getModule(contextID); PyObject *pythonName = getPythonString(env, variableName); PyObject *val = getPythonNDArray(env, value); @@ -904,9 +912,10 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonVariantVariableImpl( JNIEnv *env, jobject thisObj, jlong contextID, jstring variableName, jobject value, jobject binding) { - PyObject *module = getModule(contextID); + PyObject *module; PyEval_RestoreThread(main_ts); + module = getModule(contextID); setPythonVariable(module, getPythonString(env, variableName), getPythonObject(env, value, binding)); PyEval_SaveThread(); @@ -915,13 +924,13 @@ Java_org_simantics_pythonlink_PythonContext_setPythonVariantVariableImpl( JNIEXPORT jint JNICALL Java_org_simantics_pythonlink_PythonContext_executePythonStatementImpl( JNIEnv *env, jobject thisObj, jlong contextID, jstring statement) { - PyObject *module = getModule(contextID); - const char *utfchars = (*env)->GetStringUTFChars(env, statement, NULL); PyEval_RestoreThread(main_ts); PyErr_Clear(); { + PyObject *module = getModule(contextID); + jclass sclReportingWriterClass = (*env)->FindClass(env, SCL_REPORTING_WRITER_CLASS); jmethodID constructor = (*env)->GetMethodID(env, sclReportingWriterClass, "", "()V"); jmethodID flushMethod = (*env)->GetMethodID(env, sclReportingWriterClass, "flush", "()V");