summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorpxinwr <peixing.xin@windriver.com>2019-05-21 10:46:37 (GMT)
committerVictor Stinner <vstinner@redhat.com>2019-05-21 10:46:37 (GMT)
commitf2d7ac7e5bd821e29e0fcb78a760a282059ae000 (patch)
tree096d1f8f9ccb49a93741ecbd15e35b6775282a48 /Modules
parentd12e75734d46ecde588c5de65e6d64146911d20c (diff)
downloadcpython-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.h10
-rw-r--r--Modules/posixmodule.c72
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