I'm working on a package that can compile CPython byte-code into native machine code (so far: x86 and x86_64 are supported). I have support for almost every byte-code instruction implemented already, but to fully emulate the interpreter, I need an efficient way to determine two things: when to give up the global interpreter lock (GIL) so another thread can use it, and if there are any asynchronous calls pending (a la Py_AddPendingCall).

The interpreter loop does this by polling a pair of boolean values (technically there is a third value it polls first as an optimization, but this is not important), but these values are not exposed by the API in any way. Even if I just implement context switching between compiled code only, I would still need a way to determine if there are pending asynchronous calls. The whole point of this package is to speed up Python programs, so unconditionally calling Py_MakePendingCalls every once in a while is unacceptable.

So far the only solution I have come up with is to implement a basic machine code interpreter that would parse PyEval_AcquireLock and Py_AddPendingCall at run-time to determine the addresses of the values the Python interpreter uses. I wouldn't need to fully parse the machine code since for most instructions, I just need to figure out how long it is so I can skip over it, but with varying compilers and build settings, this would be opening up a can of worms.

Any suggestions are welcome.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to