[Python-Dev] RE: [Zope-CVS] CVS: Products/Ape/lib/apelib/zodb3 - serializers.py:1.3storage.py:1.8 (original) (raw)

Tim Peters tim at zope.com
Tue Sep 16 21:34:50 EDT 2003


[Shane Hathaway]

Modified Files: serializers.py storage.py Log Message: Fixed Python 2.3 compatibility.

- If you append to a list while it is being pickled, Python 2.3 will pick up the new items. Previous versions of Python did not.

How do you grow a list while it's being pickled? Must be another thread doing that, and if so that's mighty dubious. If you're pickling to a genuine file object, then cPickle releases the GIL around its fwrite() calls, so that's one way. But in the context of the patch:

the use of .getvalue() suggests the pickle target isn't a real file. Then cPickle never releases the GIL (cStringIO doesn't either), and no other thread should dare muck with a Python object (like the Python list getting pickled) without holding the GIL.

However this ends up happening, if you instead shrink a list while it's being pickled, Pythons earlier than 2.3 can end up trying to pickle random recycled memory. Their cPickles captured the list length once at the start of pickling the list, and that coding optimization is appropriate only if the GIL is never released. 2.3 uses the iteration protocol instead, so "sees" dynamic changes in the list size.

Copying Python-Dev because this may reveal a new mountain of ways to crash the interpreter: mutate objects in devious ways while they're getting cPickled.



More information about the Python-Dev mailing list