Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-46315: Add ifdef HAVE_ feature checks for WASI compatibility (GH-30507) #30507

Merged
merged 1 commit into from
Jan 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Include/internal/pycore_condvar.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
*/
#define Py_HAVE_CONDVAR

#include <pthread.h>
#ifdef HAVE_PTHREAD_H
# include <pthread.h>
#endif

#define PyMUTEX_T pthread_mutex_t
#define PyCOND_T pthread_cond_t
Expand Down
2 changes: 1 addition & 1 deletion Include/pythread.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_ReInitTLS(void);
typedef struct _Py_tss_t Py_tss_t; /* opaque */

#ifndef Py_LIMITED_API
#if defined(_POSIX_THREADS)
#ifdef HAVE_PTHREAD_H
/* Darwin needs pthread.h to know type name the pthread_key_t. */
# include <pthread.h>
# define NATIVE_TSS_KEY_T pthread_key_t
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Added and fixed ``#ifdef HAVE_FEATURE`` checks for functionality that is not
available on WASI platform.
4 changes: 4 additions & 0 deletions Modules/_randommodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,11 @@ random_seed_time_pid(RandomObject *self)
key[0] = (uint32_t)(now & 0xffffffffU);
key[1] = (uint32_t)(now >> 32);

#ifdef HAVE_GETPID
key[2] = (uint32_t)getpid();
#else
key[2] = 0;
#endif

now = _PyTime_GetMonotonicClock();
key[3] = (uint32_t)(now & 0xffffffffU);
Expand Down
10 changes: 9 additions & 1 deletion Modules/clinic/posixmodule.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Modules/faulthandler.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <signal.h>
#include <signal.h>
#include <stdlib.h> // abort()
#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
# include <pthread.h>
#endif
#ifdef MS_WINDOWS
Expand Down
9 changes: 9 additions & 0 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -3292,7 +3292,14 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd,
}
else
#endif /* HAVE_FHCMODAT */
{
#ifdef HAVE_CHMOD
result = chmod(path->narrow, mode);
#else
result = -1;
errno = ENOSYS;
#endif
}
Py_END_ALLOW_THREADS

if (result) {
Expand Down Expand Up @@ -4885,6 +4892,7 @@ os_system_impl(PyObject *module, PyObject *command)
#endif /* HAVE_SYSTEM */


#ifdef HAVE_UMASK
/*[clinic input]
os.umask

Expand All @@ -4903,6 +4911,7 @@ os_umask_impl(PyObject *module, int mask)
return posix_error();
return PyLong_FromLong((long)i);
}
#endif

#ifdef MS_WINDOWS

Expand Down
4 changes: 3 additions & 1 deletion Modules/xxsubtype.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,11 @@ spam_bench(PyObject *self, PyObject *args)
{
PyObject *obj, *name, *res;
int n = 1000;
time_t t0, t1;
time_t t0 = 0, t1 = 0;

if (!PyArg_ParseTuple(args, "OU|i", &obj, &name, &n))
return NULL;
#ifdef HAVE_CLOCK
t0 = clock();
while (--n >= 0) {
res = PyObject_GetAttr(obj, name);
Expand All @@ -249,6 +250,7 @@ spam_bench(PyObject *self, PyObject *args)
Py_DECREF(res);
}
t1 = clock();
#endif
return PyFloat_FromDouble((double)(t1-t0) / CLOCKS_PER_SEC);
}

Expand Down
3 changes: 3 additions & 0 deletions PC/pyconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,9 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */
/* Define if you have times. */
/* #undef HAVE_TIMES */

/* Define to 1 if you have the `umask' function. */
#define HAVE_UMASK 1

/* Define if you have uname. */
/* #undef HAVE_UNAME */

Expand Down
5 changes: 4 additions & 1 deletion Python/pyfpe.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
* though, because they may be referenced by extensions using the stable ABI.
*/

#include "setjmp.h"
#ifdef HAVE_SETJMP_H
#include <setjmp.h>

jmp_buf PyFPE_jbuf;
#endif

int PyFPE_counter;

double
Expand Down
17 changes: 17 additions & 0 deletions Tools/wasm/config.site-wasm32-wasi
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# config.site override for cross compiling to wasm32-wasi platform
#
# Written by Christian Heimes <christian@python.org>
# Partly based on pyodide's pyconfig.undefs.h file.


# cannot be detected in cross builds
ac_cv_buggy_getaddrinfo=no

# WASI has no /dev/pt*
ac_cv_file__dev_ptmx=no
ac_cv_file__dev_ptc=no

# dummy readelf, WASI build does not need readelf.
ac_cv_prog_ac_ct_READELF=true

ac_cv_func_eventfd=no
17 changes: 13 additions & 4 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -6268,7 +6268,7 @@ else
EXEEXT=.html ;; #(
Emscripten/node) :
EXEEXT=.js ;; #(
wasi/*) :
WASI/*) :
EXEEXT=.wasm ;; #(
*) :
EXEEXT=
Expand Down Expand Up @@ -7627,6 +7627,15 @@ case $ac_sys_system/$ac_sys_emscripten_target in #(
LDFLAGS_NODIST="$(LDFLAGS_NODIST) -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s EXIT_RUNTIME=1 -s USE_PTHREADS -s PROXY_TO_PTHREAD"
CFLAGS_NODIST="$(CFLAGS_NODIST) -pthread"
;; #(
WASI) :


$as_echo "#define _WASI_EMULATED_SIGNAL 1" >>confdefs.h

LIBS="$LIBS -lwasi-emulated-signal"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h

;; #(
*) :
;;
esac
Expand Down Expand Up @@ -8543,7 +8552,7 @@ for ac_header in \
alloca.h asm/types.h bluetooth.h conio.h crypt.h direct.h dlfcn.h endian.h errno.h fcntl.h grp.h \
ieeefp.h io.h langinfo.h libintl.h libutil.h linux/memfd.h linux/random.h linux/soundcard.h \
linux/tipc.h linux/wait.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \
sched.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \
sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \
sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \
Expand Down Expand Up @@ -13630,7 +13639,7 @@ fi

# checks for library functions
for ac_func in \
accept4 alarm bind_textdomain_codeset chown clock close_range confstr \
accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
Expand All @@ -13652,7 +13661,7 @@ for ac_func in \
sigfillset siginterrupt sigpending sigrelse sigtimedwait sigwait \
sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
sysconf system tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \
tmpnam tmpnam_r truncate ttyname uname unlinkat utimensat utimes vfork \
tmpnam tmpnam_r truncate ttyname umask uname unlinkat utimensat utimes vfork \
wait wait3 wait4 waitid waitpid wcscoll wcsftime wcsxfrm wmemcmp writev \

do :
Expand Down
13 changes: 9 additions & 4 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -1093,7 +1093,7 @@ AC_ARG_WITH([suffix],
AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
[Emscripten/browser], [EXEEXT=.html],
[Emscripten/node], [EXEEXT=.js],
[wasi/*], [EXEEXT=.wasm],
[WASI/*], [EXEEXT=.wasm],
[EXEEXT=]
)
])
Expand Down Expand Up @@ -1805,6 +1805,11 @@ AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
LDFLAGS_NODIST="$(LDFLAGS_NODIST) -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s EXIT_RUNTIME=1 -s USE_PTHREADS -s PROXY_TO_PTHREAD"
CFLAGS_NODIST="$(CFLAGS_NODIST) -pthread"
],
[WASI], [
AC_DEFINE([_WASI_EMULATED_SIGNAL], [1], [Define to 1 if you want to emulate signals on WASI])
LIBS="$LIBS -lwasi-emulated-signal"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h
]
)

AC_SUBST(BASECFLAGS)
Expand Down Expand Up @@ -2306,7 +2311,7 @@ AC_CHECK_HEADERS([ \
alloca.h asm/types.h bluetooth.h conio.h crypt.h direct.h dlfcn.h endian.h errno.h fcntl.h grp.h \
ieeefp.h io.h langinfo.h libintl.h libutil.h linux/memfd.h linux/random.h linux/soundcard.h \
linux/tipc.h linux/wait.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \
sched.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \
sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \
sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \
Expand Down Expand Up @@ -4062,7 +4067,7 @@ fi

# checks for library functions
AC_CHECK_FUNCS([ \
accept4 alarm bind_textdomain_codeset chown clock close_range confstr \
accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \
faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
Expand All @@ -4084,7 +4089,7 @@ AC_CHECK_FUNCS([ \
sigfillset siginterrupt sigpending sigrelse sigtimedwait sigwait \
sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \
sysconf system tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \
tmpnam tmpnam_r truncate ttyname uname unlinkat utimensat utimes vfork \
tmpnam tmpnam_r truncate ttyname umask uname unlinkat utimensat utimes vfork \
wait wait3 wait4 waitid waitpid wcscoll wcsftime wcsxfrm wmemcmp writev \
])

Expand Down
12 changes: 12 additions & 0 deletions pyconfig.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,9 @@
/* Define to 1 if you have the 'chflags' function. */
#undef HAVE_CHFLAGS

/* Define to 1 if you have the `chmod' function. */
#undef HAVE_CHMOD

/* Define to 1 if you have the `chown' function. */
#undef HAVE_CHOWN

Expand Down Expand Up @@ -977,6 +980,9 @@
/* Define to 1 if you have the `setitimer' function. */
#undef HAVE_SETITIMER

/* Define to 1 if you have the <setjmp.h> header file. */
#undef HAVE_SETJMP_H

/* Define to 1 if you have the `setlocale' function. */
#undef HAVE_SETLOCALE

Expand Down Expand Up @@ -1336,6 +1342,9 @@
/* Define this if you have tcl and TCL_UTF_MAX==6 */
#undef HAVE_UCS4_TCL

/* Define to 1 if you have the `umask' function. */
#undef HAVE_UMASK

/* Define to 1 if you have the `uname' function. */
#undef HAVE_UNAME

Expand Down Expand Up @@ -1704,6 +1713,9 @@
/* Define to force use of thread-safe errno, h_errno, and other functions */
#undef _REENTRANT

/* Define to 1 if you want to emulate signals on WASI */
#undef _WASI_EMULATED_SIGNAL

/* Define to the level of X/Open that your system supports */
#undef _XOPEN_SOURCE

Expand Down