Issue #17931: Resolve confusion on Windows between pids and process handles.
This commit is contained in:
parent
448f1a86ef
commit
ac0ad884d1
|
@ -52,6 +52,19 @@ PyAPI_FUNC(PyObject *) PyLong_GetInfo(void);
|
||||||
#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
|
#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
|
||||||
#endif /* SIZEOF_PID_T */
|
#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. */
|
/* Used by Python/mystrtoul.c. */
|
||||||
#ifndef Py_LIMITED_API
|
#ifndef Py_LIMITED_API
|
||||||
PyAPI_DATA(unsigned char) _PyLong_DigitValue[256];
|
PyAPI_DATA(unsigned char) _PyLong_DigitValue[256];
|
||||||
|
|
|
@ -10,9 +10,8 @@ What's New in Python 3.4.0 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
- Issue #17931: Fix PyLong_FromPid() on Windows 64-bit: processes are
|
- Issue #17931: Resolve confusion on Windows between pids and process
|
||||||
identified by their HANDLE which is a pointer (and not a long, which is
|
handles.
|
||||||
smaller).
|
|
||||||
|
|
||||||
- Tweak the exception message when the magic number or size value in a bytecode
|
- Tweak the exception message when the magic number or size value in a bytecode
|
||||||
file is truncated.
|
file is truncated.
|
||||||
|
|
|
@ -5014,11 +5014,7 @@ posix_spawnv(PyObject *self, PyObject *args)
|
||||||
if (spawnval == -1)
|
if (spawnval == -1)
|
||||||
return posix_error();
|
return posix_error();
|
||||||
else
|
else
|
||||||
#if SIZEOF_LONG == SIZEOF_VOID_P
|
return Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
|
||||||
return Py_BuildValue("l", (long) spawnval);
|
|
||||||
#else
|
|
||||||
return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5104,11 +5100,7 @@ posix_spawnve(PyObject *self, PyObject *args)
|
||||||
if (spawnval == -1)
|
if (spawnval == -1)
|
||||||
(void) posix_error();
|
(void) posix_error();
|
||||||
else
|
else
|
||||||
#if SIZEOF_LONG == SIZEOF_VOID_P
|
res = Py_BuildValue(_Py_PARSE_INTPTR, spawnval);
|
||||||
res = Py_BuildValue("l", (long) spawnval);
|
|
||||||
#else
|
|
||||||
res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (--envc >= 0)
|
while (--envc >= 0)
|
||||||
PyMem_DEL(envlist[envc]);
|
PyMem_DEL(envlist[envc]);
|
||||||
|
@ -6178,16 +6170,17 @@ static PyObject *
|
||||||
win32_kill(PyObject *self, PyObject *args)
|
win32_kill(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *result;
|
PyObject *result;
|
||||||
DWORD pid, sig, err;
|
pid_t pid;
|
||||||
|
DWORD sig, err;
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "kk:kill", &pid, &sig))
|
if (!PyArg_ParseTuple(args, _Py_PARSE_PID "k:kill", &pid, &sig))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Console processes which share a common console can be sent CTRL+C or
|
/* Console processes which share a common console can be sent CTRL+C or
|
||||||
CTRL+BREAK events, provided they handle said events. */
|
CTRL+BREAK events, provided they handle said events. */
|
||||||
if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
|
if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
|
||||||
if (GenerateConsoleCtrlEvent(sig, pid) == 0) {
|
if (GenerateConsoleCtrlEvent(sig, (DWORD)pid) == 0) {
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
PyErr_SetFromWindowsErr(err);
|
PyErr_SetFromWindowsErr(err);
|
||||||
}
|
}
|
||||||
|
@ -6197,7 +6190,7 @@ win32_kill(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
/* If the signal is outside of what GenerateConsoleCtrlEvent can use,
|
/* If the signal is outside of what GenerateConsoleCtrlEvent can use,
|
||||||
attempt to open and terminate the process. */
|
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) {
|
if (handle == NULL) {
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
return PyErr_SetFromWindowsErr(err);
|
return PyErr_SetFromWindowsErr(err);
|
||||||
|
@ -6603,7 +6596,7 @@ posix_waitpid(PyObject *self, PyObject *args)
|
||||||
Py_intptr_t pid;
|
Py_intptr_t pid;
|
||||||
int status, options;
|
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;
|
return NULL;
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
pid = _cwait(&status, pid, options);
|
pid = _cwait(&status, pid, options);
|
||||||
|
@ -6612,7 +6605,7 @@ posix_waitpid(PyObject *self, PyObject *args)
|
||||||
return posix_error();
|
return posix_error();
|
||||||
|
|
||||||
/* shift the status left a byte so this is more like the POSIX waitpid */
|
/* 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 */
|
#endif /* HAVE_WAITPID || HAVE_CWAIT */
|
||||||
|
|
||||||
|
|
|
@ -113,11 +113,12 @@ os.O_BINARY.");
|
||||||
static PyObject *
|
static PyObject *
|
||||||
msvcrt_open_osfhandle(PyObject *self, PyObject *args)
|
msvcrt_open_osfhandle(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
long handle;
|
Py_intptr_t handle;
|
||||||
int flags;
|
int flags;
|
||||||
int fd;
|
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;
|
return NULL;
|
||||||
|
|
||||||
fd = _open_osfhandle(handle, flags);
|
fd = _open_osfhandle(handle, flags);
|
||||||
|
|
|
@ -723,8 +723,8 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
|
||||||
/* The size of `wchar_t', as computed by sizeof. */
|
/* The size of `wchar_t', as computed by sizeof. */
|
||||||
#define SIZEOF_WCHAR_T 2
|
#define SIZEOF_WCHAR_T 2
|
||||||
|
|
||||||
/* The size of `pid_t' (HANDLE). */
|
/* The size of `pid_t', as computed by sizeof. */
|
||||||
#define SIZEOF_PID_T SIZEOF_VOID_P
|
#define SIZEOF_PID_T SIZEOF_INT
|
||||||
|
|
||||||
/* Define if you have the dl library (-ldl). */
|
/* Define if you have the dl library (-ldl). */
|
||||||
/* #undef HAVE_LIBDL */
|
/* #undef HAVE_LIBDL */
|
||||||
|
|
Loading…
Reference in New Issue