freesteel schrieb:
> /*
> Is this a bug in Py_NewInterpreter?
> 
> The function below "MyThread" is instantiated from a windows worker
> thread, but I don't
> think that is relevant.
> (I can try this on a linux box, but I would have to compile a python
> library with debugging
> enabled.)
> 
> The following code fragment throws an exception in a debug version of
> python:
> */
> 
> UINT MyThread(LPVOID lpParam)
> {
>       {
>               cs.Lock(); // this is a CCriticalSection lock
>               if (!Py_IsInitialized())
>               {
>                       Py_Initialize();
>                       PyEval_InitThreads();
> 
>                       // global pointer to the main PyThreadState object
>                       mainThreadState = PyThreadState_Get();
>                       PyEval_ReleaseLock();
>               }
>               cs.Unlock();
>       }
> 
>       ASSERT(Py_IsInitialized());
>       ASSERT(PyEval_ThreadsInitialized());
>       ASSERT(mainThreadState);
>       threadnum++;
> 
>       // get the global lock
>       PyEval_AcquireLock();
>     PyGILState_STATE gstate;
>     gstate = PyGILState_Ensure(); // Is tis necessary?
> 
> 
>       PyThreadState_Swap(mainThreadState);
>       PyThreadState* nts = Py_NewInterpreter();
> 
> /*
> 
> The exception is thrown inside the above function call:
> This statement tries to swap the new threadstate 'tstate' with the
> current one
>       save_tstate = PyThreadState_Swap(tstate);
> 
> Inside PyThreadState_Swap the code uses another way
> 'PyGILState_GetThisThreadState()' to find the current thread state and
> compares this with the newly set thread state.
> Naturally you would expect the two to be equal but that test fails:
> #if defined(Py_DEBUG) && defined(WITH_THREAD)
>       if (new) {
>               PyThreadState *check = PyGILState_GetThisThreadState();
>               if (check && check != new)
>                       Py_FatalError("Invalid thread state for this thread");
>       }
> #endif
> 
> The variable 'check' looks as if it is the 'previous' thread state, as
> if changing the thread state
> is not been done properly. Py_FatalError is called and that's the end.
> 
> Is there a mistake in my code, or is there something wrong in how
> Py_NewInterpreter is implemented?

As far as I know, the PyGILState_... functions are incompatible with multiple
Python interpreters.

Thomas

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to