diff options
author | pxinwr <peixing.xin@windriver.com> | 2019-05-21 10:46:37 (GMT) |
---|---|---|
committer | Victor Stinner <vstinner@redhat.com> | 2019-05-21 10:46:37 (GMT) |
commit | f2d7ac7e5bd821e29e0fcb78a760a282059ae000 (patch) | |
tree | 096d1f8f9ccb49a93741ecbd15e35b6775282a48 /Modules | |
parent | d12e75734d46ecde588c5de65e6d64146911d20c (diff) | |
download | cpython-f2d7ac7e5bd821e29e0fcb78a760a282059ae000.zip cpython-f2d7ac7e5bd821e29e0fcb78a760a282059ae000.tar.gz cpython-f2d7ac7e5bd821e29e0fcb78a760a282059ae000.tar.bz2 |
bpo-31904: Add posix module support for VxWorks (GH-12118)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/clinic/posixmodule.c.h | 10 | ||||
-rw-r--r-- | Modules/posixmodule.c | 72 |
2 files changed, 70 insertions, 12 deletions
diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 43f8ba6..f274559 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -2491,7 +2491,7 @@ exit: #endif /* defined(HAVE_POSIX_SPAWNP) */ -#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) +#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) PyDoc_STRVAR(os_spawnv__doc__, "spawnv($module, mode, path, argv, /)\n" @@ -2545,9 +2545,9 @@ exit: return return_value; } -#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) */ +#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */ -#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) +#if (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) PyDoc_STRVAR(os_spawnve__doc__, "spawnve($module, mode, path, argv, env, /)\n" @@ -2606,7 +2606,7 @@ exit: return return_value; } -#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV)) */ +#endif /* (defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) || defined(HAVE_RTPSPAWN)) */ #if defined(HAVE_FORK) @@ -8576,4 +8576,4 @@ exit: #ifndef OS__REMOVE_DLL_DIRECTORY_METHODDEF #define OS__REMOVE_DLL_DIRECTORY_METHODDEF #endif /* !defined(OS__REMOVE_DLL_DIRECTORY_METHODDEF) */ -/*[clinic end generated code: output=ab36ec0376a422ae input=a9049054013a1b77]*/ +/*[clinic end generated code: output=5ee9420fb2e7aa2c input=a9049054013a1b77]*/ diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index aca64ef..9f15866 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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 */ - -#if defined(HAVE_SPAWNV) || defined(HAVE_WSPAWNV) +#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; + + /* 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 |