]> gerrit.simantics Code Review - simantics/python.git/blobdiff - org.simantics.pythonlink.win32.x86_64/src/sclpy.c
Mind the threads in writeSCL.
[simantics/python.git] / org.simantics.pythonlink.win32.x86_64 / src / sclpy.c
index 4881cc7d7c26d4a20979542530230724dc1df5f2..428a45a35667fe34fcf70b0f0baae0f465c53557 100644 (file)
@@ -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, "<init>", "()V");
                jmethodID flushMethod = (*env)->GetMethodID(env, sclReportingWriterClass, "flush", "()V");