* Remove unused <locale.h> includes.
* Remove unused <fcntl.h> include in traceback.h.
* Remove redundant <assert.h> and <stddef.h> includes. They are already
included by "Python.h".
* Remove <object.h> include in faulthandler.c. Python.h already includes it.
* Add missing <stdbool.h> in pycore_pythread.h if HAVE_PTHREAD_STUBS
is defined.
* Fix also warnings in pthread_stubs.h: don't redefine macros if they
are already defined, like the __NEED_pthread_t macro.
* ``Python.h`` no longer includes the ``<unistd.h>`` standard header file. If
needed, it should now be included explicitly. For example, it provides the
- functions: ``close()``, ``getpagesize()``, ``getpid()`` and ``sysconf()``.
+ functions: ``read()``, ``write()``, ``close()``, ``isatty()``, ``lseek()``,
+ ``getpid()``, ``getcwd()``, ``sysconf()`` and ``getpagesize()``.
As a consequence, ``_POSIX_SEMAPHORES`` and ``_POSIX_THREADS`` macros are no
longer defined by ``Python.h``. The ``HAVE_UNISTD_H`` and ``HAVE_PTHREAD_H``
macros defined by ``Python.h`` can be used to decide if ``<unistd.h>`` and
#ifdef __wasi__
// WASI's bits/alltypes.h provides type definitions when __NEED_ is set.
// The header file can be included multiple times.
-# define __NEED_pthread_cond_t 1
-# define __NEED_pthread_condattr_t 1
-# define __NEED_pthread_mutex_t 1
-# define __NEED_pthread_mutexattr_t 1
-# define __NEED_pthread_key_t 1
-# define __NEED_pthread_t 1
-# define __NEED_pthread_attr_t 1
+//
+// <sys/types.h> may also define these macros.
+# ifndef __NEED_pthread_cond_t
+# define __NEED_pthread_cond_t 1
+# endif
+# ifndef __NEED_pthread_condattr_t
+# define __NEED_pthread_condattr_t 1
+# endif
+# ifndef __NEED_pthread_mutex_t
+# define __NEED_pthread_mutex_t 1
+# endif
+# ifndef __NEED_pthread_mutexattr_t
+# define __NEED_pthread_mutexattr_t 1
+# endif
+# ifndef __NEED_pthread_key_t
+# define __NEED_pthread_key_t 1
+# endif
+# ifndef __NEED_pthread_t
+# define __NEED_pthread_t 1
+# endif
+# ifndef __NEED_pthread_attr_t
+# define __NEED_pthread_attr_t 1
+# endif
# include <bits/alltypes.h>
#else
typedef struct { void *__x; } pthread_cond_t;
# error "this header requires Py_BUILD_CORE define"
#endif
-
// Get _POSIX_THREADS and _POSIX_SEMAPHORES macros if available
#if (defined(HAVE_UNISTD_H) && !defined(_POSIX_THREADS) \
&& !defined(_POSIX_SEMAPHORES))
#if defined(HAVE_PTHREAD_STUBS)
+#include <stdbool.h> // bool
+
// pthread_key
struct py_stub_tls_entry {
bool in_use;
#include "pycore_object.h" // _PyObject_GC_UNTRACK()
#include "pycore_pyerrors.h" // _PyErr_ChainExceptions1()
-#include <stdbool.h>
+#include <stdbool.h> // bool
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // lseek()
+#endif
#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
+# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
+# include <sys/stat.h>
#endif
#ifdef HAVE_IO_H
-#include <io.h>
+# include <io.h>
#endif
#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
+# include <fcntl.h> // open()
#endif
-#include <stddef.h> /* For offsetof */
+
#include "_iomodule.h"
/*
*/
#ifdef MS_WINDOWS
-/* can simulate truncate with Win32 API functions; see file_truncate */
-#define HAVE_FTRUNCATE
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include <windows.h>
+ // can simulate truncate with Win32 API functions; see file_truncate
+# define HAVE_FTRUNCATE
+# ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
#endif
#if BUFSIZ < (8*1024)
-#define SMALLCHUNK (8*1024)
+# define SMALLCHUNK (8*1024)
#elif (BUFSIZ >= (2 << 25))
-#error "unreasonable BUFSIZ > 64 MiB defined"
+# error "unreasonable BUFSIZ > 64 MiB defined"
#else
-#define SMALLCHUNK BUFSIZ
+# define SMALLCHUNK BUFSIZ
#endif
+
/*[clinic input]
module _io
class _io.FileIO "fileio *" "clinic_state()->PyFileIO_Type"
#include "pycore_long.h" // _PyLong_AsByteArray()
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_pylifecycle.h" // _PyOS_URandomNonblock()
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // getpid()
+#endif
#ifdef HAVE_PROCESS_H
# include <process.h> // getpid()
#endif
-
#ifdef MS_WINDOWS
-# include <windows.h>
+# include <windows.h> // GetCurrentProcessId()
#endif
/* Period parameters -- These are all magic. Don't change. */
#include "pycore_sysmodule.h" // _PySys_GetAttr()
#include "pycore_traceback.h" // _Py_DumpTracebackThreads
-#include <object.h>
-#include <signal.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // _exit()
+#endif
+#include <signal.h> // sigaction()
#include <stdlib.h> // abort()
#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H)
# include <pthread.h>
# include <windows.h>
#endif
#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
+# include <sys/resource.h> // setrlimit()
#endif
#if defined(FAULTHANDLER_USE_ALT_STACK) && defined(HAVE_LINUX_AUXVEC_H) && defined(HAVE_SYS_AUXV_H)
# include <sys/auxv.h> // getauxval()
#endif
+
/* Allocate at maximum 100 MiB of the stack to raise the stack overflow */
#define STACK_OVERFLOW_MAX_SIZE (100 * 1024 * 1024)
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_signal.h" // Py_NSIG
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // symlink()
+#endif
+
#ifdef MS_WINDOWS
# include <windows.h>
# if !defined(MS_WINDOWS_GAMES) || defined(MS_WINDOWS_DESKTOP)
# endif /* MS_WINDOWS_DESKTOP | MS_WINDOWS_SYSTEM */
#endif
-
#ifndef MS_WINDOWS
# include "posixmodule.h"
#else
# include <sched.h>
#endif
-#ifdef HAVE_COPY_FILE_RANGE
-# include <unistd.h> // copy_file_range()
-#endif
-
#if !defined(CPU_ALLOC) && defined(HAVE_SCHED_SETAFFINITY)
# undef HAVE_SCHED_SETAFFINITY
#endif
#include "pycore_call.h" // _PyObject_CallNoArgs()
#include "pycore_runtime.h" // _PyRuntime
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // isatty()
+#endif
+
#if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER)
-/* clang MemorySanitizer doesn't yet understand getc_unlocked. */
-#define GETC(f) getc_unlocked(f)
-#define FLOCKFILE(f) flockfile(f)
-#define FUNLOCKFILE(f) funlockfile(f)
+ /* clang MemorySanitizer doesn't yet understand getc_unlocked. */
+# define GETC(f) getc_unlocked(f)
+# define FLOCKFILE(f) flockfile(f)
+# define FUNLOCKFILE(f) funlockfile(f)
#else
-#define GETC(f) getc(f)
-#define FLOCKFILE(f)
-#define FUNLOCKFILE(f)
+# define GETC(f) getc(f)
+# define FLOCKFILE(f)
+# define FUNLOCKFILE(f)
#endif
/* Newline flags */
#include "pycore_pystate.h" // _PyThreadState_GET()
#ifdef MS_WINDOWS
# ifndef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
# endif
# include "windows.h"
#endif /* MS_WINDOWS */
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // isatty()
+#endif
+
// Export the symbol since it's used by the readline shared extension
PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState;
#include "Python.h"
#include "pycore_call.h" // _PyObject_CallNoArgs()
-#include <assert.h>
+#include "tokenizer.h" // struct tok_state
+#include "errcode.h" // E_OK
-#include "tokenizer.h"
-#include "errcode.h"
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // read()
+#endif
/* Alternate tab spacing */
#define ALTTABSIZE 1
#include "clinic/bltinmodule.c.h"
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // isatty()
+#endif
+
+
static PyObject*
update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs)
{
#include "pycore_pylifecycle.h" // _PyOS_URandomNonblock()
#include "pycore_runtime.h" // _PyRuntime
+#undef HAVE_GETRANDOM
+#undef HAVE_GETENTROPY
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // close()
+#endif
#ifdef MS_WINDOWS
# include <windows.h>
# include <bcrypt.h>
#else
-# include <fcntl.h>
+# include <fcntl.h> // O_RDONLY
# ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
# endif
# ifdef HAVE_LINUX_RANDOM_H
-# include <linux/random.h>
+# include <linux/random.h> // GRND_NONBLOCK
# endif
# if defined(HAVE_SYS_RANDOM_H) && (defined(HAVE_GETRANDOM) || defined(HAVE_GETENTROPY))
-# include <sys/random.h>
+# include <sys/random.h> // getrandom()
# endif
# if !defined(HAVE_GETRANDOM) && defined(HAVE_GETRANDOM_SYSCALL)
-# include <sys/syscall.h>
+# include <sys/syscall.h> // SYS_getrandom
# endif
#endif
#include "pycore_fileutils.h" // fileutils definitions
#include "pycore_runtime.h" // _PyRuntime
#include "osdefs.h" // SEP
-#include <locale.h>
+
#include <stdlib.h> // mbstowcs()
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // getcwd()
+#endif
#ifdef MS_WINDOWS
# include <malloc.h>
#endif
#ifdef HAVE_LANGINFO_H
-#include <langinfo.h>
+# include <langinfo.h> // nl_langinfo(CODESET)
#endif
#ifdef HAVE_SYS_IOCTL_H
#endif
#ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION
-#include <iconv.h>
+# include <iconv.h> // iconv_open()
#endif
#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif /* HAVE_FCNTL_H */
+# include <fcntl.h> // fcntl(F_GETFD)
+#endif
#ifdef O_CLOEXEC
/* Does open() support the O_CLOEXEC flag? Possible values:
#include "Python.h"
#include "pycore_pystate.h" // _Py_GetConfig()
#include "pycore_runtime.h" // _PyRuntime_Initialize()
-#include <locale.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // isatty()
+#endif
+
#ifdef MS_WINDOWS
extern void PyWinFreeze_ExeInit(void);
#include <locale.h> // setlocale()
#include <stdlib.h> // getenv()
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // isatty()
+#endif
#if defined(__APPLE__)
# include <mach-o/loader.h>
#include "osdefs.h" // DELIM
#include "stdlib_module_names.h" // _Py_stdlib_module_names
-#include <locale.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // getpid()
+#endif
#ifdef MS_WINDOWS
# define WIN32_LEAN_AND_MEAN
#include "frameobject.h" // PyFrame_New()
#include "osdefs.h" // SEP
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> // lseek()
#endif
-#define OFF(x) offsetof(PyTracebackObject, x)
+#define OFF(x) offsetof(PyTracebackObject, x)
#define PUTS(fd, str) (void)_Py_write_noraise(fd, str, (int)strlen(str))
+
#define MAX_STRING_LENGTH 500
#define MAX_FRAME_DEPTH 100
#define MAX_NTHREADS 100