mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-31904: Add posix module support for VxWorks (GH-12118)
This commit is contained in:
parent
d12e75734d
commit
f2d7ac7e5b
8 changed files with 83 additions and 14 deletions
|
@ -191,11 +191,13 @@ corresponding Unix manual entries for more information on calls.");
|
|||
#define fsync _commit
|
||||
#else
|
||||
/* Unix functions that the configure script doesn't check for */
|
||||
#ifndef __VXWORKS__
|
||||
#define HAVE_EXECV 1
|
||||
#define HAVE_FORK 1
|
||||
#if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */
|
||||
#define HAVE_FORK1 1
|
||||
#endif
|
||||
#endif
|
||||
#define HAVE_GETEGID 1
|
||||
#define HAVE_GETEUID 1
|
||||
#define HAVE_GETGID 1
|
||||
|
@ -227,6 +229,18 @@ extern char *ctermid_r(char *);
|
|||
|
||||
#endif /* !_MSC_VER */
|
||||
|
||||
#if defined(__VXWORKS__)
|
||||
#include <vxCpuLib.h>
|
||||
#include <rtpLib.h>
|
||||
#include <wait.h>
|
||||
#include <taskLib.h>
|
||||
#ifndef _P_WAIT
|
||||
#define _P_WAIT 0
|
||||
#define _P_NOWAIT 1
|
||||
#define _P_NOWAITO 1
|
||||
#endif
|
||||
#endif /* __VXWORKS__ */
|
||||
|
||||
#ifdef HAVE_POSIX_SPAWN
|
||||
#include <spawn.h>
|
||||
#endif
|
||||
|
@ -1353,7 +1367,7 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag)
|
|||
*/
|
||||
#include <crt_externs.h>
|
||||
static char **environ;
|
||||
#elif !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
|
||||
#elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__))
|
||||
extern char **environ;
|
||||
#endif /* !_MSC_VER */
|
||||
|
||||
|
@ -4870,7 +4884,7 @@ os__exit_impl(PyObject *module, int status)
|
|||
#define EXECV_CHAR char
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV)
|
||||
#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) || defined(HAVE_RTPSPAWN)
|
||||
static void
|
||||
free_string_array(EXECV_CHAR **array, Py_ssize_t count)
|
||||
{
|
||||
|
@ -4908,7 +4922,7 @@ fsconvert_strdup(PyObject *o, EXECV_CHAR **out)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_EXECV) || defined (HAVE_FEXECVE)
|
||||
#if defined(HAVE_EXECV) || defined (HAVE_FEXECVE) || defined(HAVE_RTPSPAWN)
|
||||
static EXECV_CHAR**
|
||||
parse_envlist(PyObject* env, Py_ssize_t *envc_ptr)
|
||||
{
|
||||
|
@ -5632,8 +5646,41 @@ os_posix_spawnp_impl(PyObject *module, path_t *path, PyObject *argv,
|
|||
}
|
||||
#endif /* HAVE_POSIX_SPAWNP */
|
||||
|
||||
#ifdef HAVE_RTPSPAWN
|
||||
static intptr_t
|
||||
_rtp_spawn(int mode, const char *rtpFileName, const char *argv[],
|
||||
const char *envp[])
|
||||
{
|
||||
RTP_ID rtpid;
|
||||
int status;
|
||||
pid_t res;
|
||||
int async_err = 0;
|
||||
|
||||
#if defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)
|
||||
/* Set priority=100 and uStackSize=16 MiB (0x1000000) for new processes.
|
||||
uStackSize=0 cannot be used, the default stack size is too small for
|
||||
Python. */
|
||||
if (envp) {
|
||||
rtpid = rtpSpawn(rtpFileName, argv, envp,
|
||||
100, 0x1000000, 0, VX_FP_TASK);
|
||||
}
|
||||
else {
|
||||
rtpid = rtpSpawn(rtpFileName, argv, (const char **)environ,
|
||||
100, 0x1000000, 0, VX_FP_TASK);
|
||||
}
|
||||
if ((rtpid != RTP_ID_ERROR) && (mode == _P_WAIT)) {
|
||||
do {
|
||||
res = waitpid((pid_t)rtpid, &status, 0);
|
||||
} while (res < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||
|
||||
if (res < 0)
|
||||
return RTP_ID_ERROR;
|
||||
return ((intptr_t)status);
|
||||
}
|
||||
return ((intptr_t)rtpid);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)
|
||||
/*[clinic input]
|
||||
os.spawnv
|
||||
|
||||
|
@ -5703,13 +5750,17 @@ os_spawnv_impl(PyObject *module, int mode, path_t *path, PyObject *argv)
|
|||
}
|
||||
argvlist[argc] = NULL;
|
||||
|
||||
#if !defined(HAVE_RTPSPAWN)
|
||||
if (mode == _OLD_P_OVERLAY)
|
||||
mode = _P_OVERLAY;
|
||||
#endif
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
_Py_BEGIN_SUPPRESS_IPH
|
||||
#ifdef HAVE_WSPAWNV
|
||||
spawnval = _wspawnv(mode, path->wide, argvlist);
|
||||
#elif defined(HAVE_RTPSPAWN)
|
||||
spawnval = _rtp_spawn(mode, path->narrow, (const char **)argvlist, NULL);
|
||||
#else
|
||||
spawnval = _spawnv(mode, path->narrow, argvlist);
|
||||
#endif
|
||||
|
@ -5808,13 +5859,18 @@ os_spawnve_impl(PyObject *module, int mode, path_t *path, PyObject *argv,
|
|||
if (envlist == NULL)
|
||||
goto fail_1;
|
||||
|
||||
#if !defined(HAVE_RTPSPAWN)
|
||||
if (mode == _OLD_P_OVERLAY)
|
||||
mode = _P_OVERLAY;
|
||||
#endif
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
_Py_BEGIN_SUPPRESS_IPH
|
||||
#ifdef HAVE_WSPAWNV
|
||||
spawnval = _wspawnve(mode, path->wide, argvlist, envlist);
|
||||
#elif defined(HAVE_RTPSPAWN)
|
||||
spawnval = _rtp_spawn(mode, path->narrow, (const char **)argvlist,
|
||||
(const char **)envlist);
|
||||
#else
|
||||
spawnval = _spawnve(mode, path->narrow, argvlist, envlist);
|
||||
#endif
|
||||
|
@ -13844,11 +13900,13 @@ all_ins(PyObject *m)
|
|||
if (PyModule_AddIntConstant(m, "POSIX_SPAWN_DUP2", POSIX_SPAWN_DUP2)) return -1;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SPAWNV
|
||||
#if defined(HAVE_SPAWNV) || defined (HAVE_RTPSPAWN)
|
||||
if (PyModule_AddIntConstant(m, "P_WAIT", _P_WAIT)) return -1;
|
||||
if (PyModule_AddIntConstant(m, "P_NOWAIT", _P_NOWAIT)) return -1;
|
||||
if (PyModule_AddIntConstant(m, "P_OVERLAY", _OLD_P_OVERLAY)) return -1;
|
||||
if (PyModule_AddIntConstant(m, "P_NOWAITO", _P_NOWAITO)) return -1;
|
||||
#endif
|
||||
#ifdef HAVE_SPAWNV
|
||||
if (PyModule_AddIntConstant(m, "P_OVERLAY", _OLD_P_OVERLAY)) return -1;
|
||||
if (PyModule_AddIntConstant(m, "P_DETACH", _P_DETACH)) return -1;
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue