Problems with thread state

Donn Cave donn at drizzle.com
Tue Jul 3 11:32:08 EDT 2001


Quoth Martin Sjgren <martin at strakt.com>:

| I'm trying to write an OpenSSL module for Python (purely in C) and I've
| run into a big problem.
|
| My understanding of the inner workings of Python isn't that big, so please
| help me out here.
|
| Seeing as a call to SSL_connect() might block, I surrounded the call to it
| by Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS. I also have a wrapper
| callback for verification (i.e. I plug my callback into OpenSSL and it
| calls a Python callback residing in a Context object)... Here's my
| problem: When I call PyEval_CallObject() in my wrapper callback, python
| segfaults! Some poking around with gdb shows that somewhere, before
| PyFrame_New() is called to execute the Python callback in,
| PyThreadState_Get() returns NULL!
|
| When I comment out the Py_(BEGIN|END)_ALLOW_THREADS stuff, everything
| works.
|
| What's wrong? What do I do about it?

Prior to PyEval_CallObject(), you need to get back in line for the
Python thread you released with Py_BEGIN_ALLOW_THREADS.  I do that
with PyEval_AcquireThread(PyThreadState *), and then after the
callback, PyEval_ReleaseThread(PyThreadState *).  How do you get
the thread state?  Not the way I do, I reckon, so I will leave
that to you.

	Donn Cave, donn at drizzle.com



More information about the Python-list mailing list