[Python-checkins] cpython: Issue #17931: Resolve confusion on Windows between pids and process handles.

Brett Cannon brett at python.org
Fri Jun 7 17:16:05 CEST 2013


I think this CL introduced a memory leak. The daily leak report went from 0
to not 0 between June 4 and June 5 and this is the only CL that touched C
code.


On Wed, Jun 5, 2013 at 6:31 PM, richard.oudkerk
<python-checkins at python.org>wrote:

> http://hg.python.org/cpython/rev/0410bf251e10
> changeset:   84045:0410bf251e10
> user:        Richard Oudkerk <shibturn at gmail.com>
> date:        Wed Jun 05 23:29:30 2013 +0100
> summary:
>   Issue #17931: Resolve confusion on Windows between pids and process
> handles.
>
> files:
>   Include/longobject.h  |  13 +++++++++++++
>   Misc/NEWS             |   5 ++---
>   Modules/posixmodule.c |  25 +++++++++----------------
>   PC/msvcrtmodule.c     |   5 +++--
>   PC/pyconfig.h         |   4 ++--
>   5 files changed, 29 insertions(+), 23 deletions(-)
>
>
> diff --git a/Include/longobject.h b/Include/longobject.h
> --- a/Include/longobject.h
> +++ b/Include/longobject.h
> @@ -52,6 +52,19 @@
>  #error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long
> long)"
>  #endif /* SIZEOF_PID_T */
>
> +#if SIZEOF_VOID_P == SIZEOF_INT
> +#  define _Py_PARSE_INTPTR "i"
> +#  define _Py_PARSE_UINTPTR "I"
> +#elif SIZEOF_VOID_P == SIZEOF_LONG
> +#  define _Py_PARSE_INTPTR "l"
> +#  define _Py_PARSE_UINTPTR "k"
> +#elif defined(SIZEOF_LONG_LONG) && SIZEOF_VOID_P == SIZEOF_LONG_LONG
> +#  define _Py_PARSE_INTPTR "L"
> +#  define _Py_PARSE_UINTPTR "K"
> +#else
> +#  error "void* different in size from int, long and long long"
> +#endif /* SIZEOF_VOID_P */
> +
>  /* Used by Python/mystrtoul.c. */
>  #ifndef Py_LIMITED_API
>  PyAPI_DATA(unsigned char) _PyLong_DigitValue[256];
> diff --git a/Misc/NEWS b/Misc/NEWS
> --- a/Misc/NEWS
> +++ b/Misc/NEWS
> @@ -10,9 +10,8 @@
>  Core and Builtins
>  -----------------
>
> -- Issue #17931: Fix PyLong_FromPid() on Windows 64-bit: processes are
> -  identified by their HANDLE which is a pointer (and not a long, which is
> -  smaller).
> +- Issue #17931: Resolve confusion on Windows between pids and process
> +  handles.
>
>  - Tweak the exception message when the magic number or size value in a
> bytecode
>    file is truncated.
> diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
> --- a/Modules/posixmodule.c
> +++ b/Modules/posixmodule.c
> @@ -5014,11 +5014,7 @@
>      if (spawnval == -1)
>          return posix_error();
>      else
> -#if SIZEOF_LONG == SIZEOF_VOID_P
> -        return Py_BuildValue("l", (long) spawnval);
> -#else
> -        return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
> -#endif
> +        return Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
>  }
>
>
> @@ -5104,11 +5100,7 @@
>      if (spawnval == -1)
>          (void) posix_error();
>      else
> -#if SIZEOF_LONG == SIZEOF_VOID_P
> -        res = Py_BuildValue("l", (long) spawnval);
> -#else
> -        res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
> -#endif
> +        res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
>
>      while (--envc >= 0)
>          PyMem_DEL(envlist[envc]);
> @@ -6178,16 +6170,17 @@
>  win32_kill(PyObject *self, PyObject *args)
>  {
>      PyObject *result;
> -    DWORD pid, sig, err;
> +    pid_t pid;
> +    DWORD sig, err;
>      HANDLE handle;
>
> -    if (!PyArg_ParseTuple(args, "kk:kill", &pid, &sig))
> +    if (!PyArg_ParseTuple(args, _Py_PARSE_PID "k:kill", &pid, &sig))
>          return NULL;
>
>      /* Console processes which share a common console can be sent CTRL+C
> or
>         CTRL+BREAK events, provided they handle said events. */
>      if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
> -        if (GenerateConsoleCtrlEvent(sig, pid) == 0) {
> +        if (GenerateConsoleCtrlEvent(sig, (DWORD)pid) == 0) {
>              err = GetLastError();
>              PyErr_SetFromWindowsErr(err);
>          }
> @@ -6197,7 +6190,7 @@
>
>      /* If the signal is outside of what GenerateConsoleCtrlEvent can use,
>         attempt to open and terminate the process. */
> -    handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
> +    handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid);
>      if (handle == NULL) {
>          err = GetLastError();
>          return PyErr_SetFromWindowsErr(err);
> @@ -6603,7 +6596,7 @@
>      Py_intptr_t pid;
>      int status, options;
>
> -    if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid,
> &options))
> +    if (!PyArg_ParseTuple(args, _Py_PARSE_INTPTR "i:waitpid", &pid,
> &options))
>          return NULL;
>      Py_BEGIN_ALLOW_THREADS
>      pid = _cwait(&status, pid, options);
> @@ -6612,7 +6605,7 @@
>          return posix_error();
>
>      /* shift the status left a byte so this is more like the POSIX
> waitpid */
> -    return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
> +    return Py_BuildValue(_Py_PARSE_INTPTR "i", pid, status << 8);
>  }
>  #endif /* HAVE_WAITPID || HAVE_CWAIT */
>
> diff --git a/PC/msvcrtmodule.c b/PC/msvcrtmodule.c
> --- a/PC/msvcrtmodule.c
> +++ b/PC/msvcrtmodule.c
> @@ -113,11 +113,12 @@
>  static PyObject *
>  msvcrt_open_osfhandle(PyObject *self, PyObject *args)
>  {
> -    long handle;
> +    Py_intptr_t handle;
>      int flags;
>      int fd;
>
> -    if (!PyArg_ParseTuple(args, "li:open_osfhandle", &handle, &flags))
> +    if (!PyArg_ParseTuple(args, _Py_PARSE_INTPTR "i:open_osfhandle",
> +                          &handle, &flags))
>          return NULL;
>
>      fd = _open_osfhandle(handle, flags);
> diff --git a/PC/pyconfig.h b/PC/pyconfig.h
> --- a/PC/pyconfig.h
> +++ b/PC/pyconfig.h
> @@ -723,8 +723,8 @@
>  /* The size of `wchar_t', as computed by sizeof. */
>  #define SIZEOF_WCHAR_T 2
>
> -/* The size of `pid_t' (HANDLE). */
> -#define SIZEOF_PID_T SIZEOF_VOID_P
> +/* The size of `pid_t', as computed by sizeof. */
> +#define SIZEOF_PID_T SIZEOF_INT
>
>  /* Define if you have the dl library (-ldl).  */
>  /* #undef HAVE_LIBDL */
>
> --
> Repository URL: http://hg.python.org/cpython
>
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-checkins/attachments/20130607/5b9cf444/attachment-0001.html>


More information about the Python-checkins mailing list