[Python-Dev] Possible GIL/threading issue involving subprocess and PyMem_MALLOC...

Kristján Valur Jónsson kristjan at ccpgames.com
Fri Dec 21 10:31:44 CET 2012


I ran into this the other day.  I had put in hooks in the PyMem_MALLOC to track memory per tasklet, and it crashed
in those cases because it was being called without the GIL.  My local patch was simply to _not_ release the GIL.
Clearly, calling PyMem_MALLOC without the GIL is an API violation.

K

> -----Original Message-----
> From: Python-Dev [mailto:python-dev-
> bounces+kristjan=ccpgames.com at python.org] On Behalf Of Trent Nelson
> Sent: 21. desember 2012 03:13
> To: Gregory P. Smith
> Cc: Python-Dev
> Subject: Re: [Python-Dev] Possible GIL/threading issue involving subprocess
> and PyMem_MALLOC...
> 
> On Thu, Dec 20, 2012 at 05:47:40PM -0800, Gregory P. Smith wrote:
> >    On Thu, Dec 20, 2012 at 10:43 AM, Trent Nelson <trent at snakebite.org>
> >    wrote:
> >
> >          This seems odd to me so I wanted to see what others think.  The unit
> >          test Lib/unittest/test/test_runner.py:Test_TextRunner.test_warnings
> >          will eventually hit subprocess.Popen._communicate.
> >
> >          The `mswindows` implementation of this method relies on threads to
> >          buffer stdin/stdout.  That'll eventually result in
> >      PyOs_StdioReadline
> >          being called without the GIL being held.  PyOs_StdioReadline calls
> >          PyMem_MALLOC, PyMem_FREE and possibly PyMem_REALLOC.
> >
> >    Those threads are implemented in Python so how would the GIL ever not
> be
> >    held?
> >    -gps
> 
>     PyOS_Readline drops the GIL prior to calling PyOS_StdioReadline:
> 
>         Py_BEGIN_ALLOW_THREADS
> --------^^^^^^^^^^^^^^^^^^^^^^
>     #ifdef WITH_THREAD
>         PyThread_acquire_lock(_PyOS_ReadlineLock, 1);
>     #endif
> 
>         /* This is needed to handle the unlikely case that the
>          * interpreter is in interactive mode *and* stdin/out are not
>          * a tty.  This can happen, for example if python is run like
>          * this: python -i < test1.py
>          */
>         if (!isatty (fileno (sys_stdin)) || !isatty (fileno (sys_stdout)))
>             rv = PyOS_StdioReadline (sys_stdin, sys_stdout, prompt); ----------------
> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>         else
>             rv = (*PyOS_ReadlineFunctionPointer)(sys_stdin, sys_stdout,
>                                                  prompt);
>         Py_END_ALLOW_THREADS
> 
> 
>         Trent.
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: http://mail.python.org/mailman/options/python-
> dev/kristjan%40ccpgames.com




More information about the Python-Dev mailing list