<br><br><div><span class="gmail_quote">On 5/1/07, <b class="gmail_sendername">Tim Peters</b> &lt;<a href="mailto:tim.peters@gmail.com">tim.peters@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
[Neal Norwitz]<br>&gt;&gt; In rev 54982 (the first time this crash was seen), I see something<br>&gt;&gt; which might create a problem.&nbsp;&nbsp;In python/trunk/Modules/posixmodule.c<br>&gt;&gt; (near line 6300):<br>&gt;&gt;<br>&gt;&gt; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PyMem_FREE(mode);
<br>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Py_END_ALLOW_THREADS<br><br>Shouldn&#39;t do that.<br><br>[Brett Cannon]<br>&gt; The PyMem_MALLOC call that creates &#39;mode&#39; is also called without explicitly<br>&gt; holding the GIL.<br><br>Or that ;-)
</blockquote><div><br><br>Luckily I misread the code so it doesn&#39;t do that boo-boo.<br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
&gt;&gt; Can you call PyMem_FREE() without the GIL held?&nbsp;&nbsp;I couldn&#39;t find it<br>&gt;&gt; documented either way.<br><br>&gt; I believe the GIL does not need to be held, but obviously Tim or someone<br>&gt; with more memory experience should step in to say definitively.
<br><br>The GIL should be held.&nbsp;&nbsp;The relevant docs are in the Python/C API<br>manual, section &quot;8.1 Thread State and the Global Interpreter Lock&quot;:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Therefore, the rule exists that only the thread that has acquired the global
<br>&nbsp;&nbsp;&nbsp;&nbsp;interpreter lock may operate on Python objects or call Python/C<br>API functions.<br><br>PyMem_XYZ is certainly a &quot;Python/C API function&quot;.&nbsp;&nbsp;There are functions<br>you can call without holding the GIL, and section 
8.1 intends to give<br>an exhaustive list of those.&nbsp;&nbsp;These are functions that can&#39;t rely on<br>the GIL, like PyEval_InitThreads() (which /creates/ the GIL), and<br>various functions that create and destroy thread and interpreter
<br>state.<br><br>&gt; If you look at Include/pymem.h, PyMem_FREE gets defined as PyObject_FREE in<br>&gt; a debug build.&nbsp;&nbsp;PyObject_Free is defined at _PyObject_DebugFree.&nbsp;&nbsp;That<br>&gt; function checks that the memory has not been written with the debug bit
<br>&gt; pattern and then calls PyObject_Free.&nbsp;&nbsp;That call just sticks the memory back<br>&gt; into pymalloc&#39;s memory pool which is implemented without using any Python<br>&gt; objects.<br><br>But pymalloc&#39;s pools have a complex internal structure of their own,
<br>and cannot be mucked with safely by multiple threads simultaneously.</blockquote><div><br><br>Ah, OK.&nbsp; That makes sense.&nbsp; Glad I pointed out my ignorance then.&nbsp; =)<br></div></div><br>-Brett