[Python-checkins] gh-106320: Remove private pylifecycle.h functions (#106400)
vstinner
webhook-mailer at python.org
Tue Jul 4 05:41:47 EDT 2023
https://github.com/python/cpython/commit/c9ce983ae1a361f431a0303aeb6f4b8e1d674275
commit: c9ce983ae1a361f431a0303aeb6f4b8e1d674275
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2023-07-04T09:41:43Z
summary:
gh-106320: Remove private pylifecycle.h functions (#106400)
Remove private pylifecycle.h functions: move them to the internal C
API ( pycore_atexit.h, pycore_pylifecycle.h and pycore_signal.h). No
longer export most of these functions.
Move _testcapi.test_atexit() to _testinternalcapi.
files:
M Include/cpython/pylifecycle.h
M Include/internal/pycore_atexit.h
M Include/internal/pycore_pylifecycle.h
M Include/internal/pycore_signal.h
M Modules/_asynciomodule.c
M Modules/_io/bufferedio.c
M Modules/_posixsubprocess.c
M Modules/_randommodule.c
M Modules/_sqlite/connection.c
M Modules/_testcapimodule.c
M Modules/_testinternalcapi.c
M Modules/_xxinterpchannelsmodule.c
M Modules/getbuildinfo.c
M Modules/posixmodule.c
M Modules/readline.c
M Modules/signalmodule.c
M Python/_warnings.c
M Python/bootstrap_hash.c
M Python/preconfig.c
diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h
index 1ca9ee91a72b1..8af34b0564251 100644
--- a/Include/cpython/pylifecycle.h
+++ b/Include/cpython/pylifecycle.h
@@ -19,13 +19,13 @@ PyAPI_FUNC(PyStatus) Py_PreInitializeFromArgs(
Py_ssize_t argc,
wchar_t **argv);
-PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
-
/* Initialization and finalization */
PyAPI_FUNC(PyStatus) Py_InitializeFromConfig(
const PyConfig *config);
+
+// Python 3.8 provisional API (PEP 587)
PyAPI_FUNC(PyStatus) _Py_InitializeMain(void);
PyAPI_FUNC(int) Py_RunMain(void);
@@ -33,31 +33,8 @@ PyAPI_FUNC(int) Py_RunMain(void);
PyAPI_FUNC(void) _Py_NO_RETURN Py_ExitStatusException(PyStatus err);
-/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */
-PyAPI_FUNC(void) _Py_RestoreSignals(void);
-
PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *);
-PyAPI_FUNC(int) _Py_FdIsInteractive(FILE *fp, PyObject *filename);
-
-PyAPI_FUNC(const char *) _Py_gitidentifier(void);
-PyAPI_FUNC(const char *) _Py_gitversion(void);
-
-PyAPI_FUNC(int) _Py_IsFinalizing(void);
-PyAPI_FUNC(int) _Py_IsInterpreterFinalizing(PyInterpreterState *interp);
-
-/* Random */
-PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size);
-PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size);
-
-/* Legacy locale support */
-PyAPI_FUNC(int) _Py_CoerceLegacyLocale(int warn);
-PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn);
-PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category);
PyAPI_FUNC(PyStatus) Py_NewInterpreterFromConfig(
PyThreadState **tstate_p,
const PyInterpreterConfig *config);
-
-typedef void (*atexit_datacallbackfunc)(void *);
-PyAPI_FUNC(int) _Py_AtExit(
- PyInterpreterState *, atexit_datacallbackfunc, void *);
diff --git a/Include/internal/pycore_atexit.h b/Include/internal/pycore_atexit.h
index 63a2cd5d507d2..fc5cb6d882643 100644
--- a/Include/internal/pycore_atexit.h
+++ b/Include/internal/pycore_atexit.h
@@ -25,7 +25,8 @@ struct _atexit_runtime_state {
//###################
// interpreter atexit
-struct atexit_callback;
+typedef void (*atexit_datacallbackfunc)(void *);
+
typedef struct atexit_callback {
atexit_datacallbackfunc func;
void *data;
@@ -50,6 +51,10 @@ struct atexit_state {
int callback_len;
};
+PyAPI_FUNC(int) _Py_AtExit(
+ PyInterpreterState *interp,
+ atexit_datacallbackfunc func,
+ void *data);
#ifdef __cplusplus
}
diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h
index b07c2dba8de84..fb28652515909 100644
--- a/Include/internal/pycore_pylifecycle.h
+++ b/Include/internal/pycore_pylifecycle.h
@@ -23,7 +23,7 @@ extern PyStatus _PyUnicode_InitEncodings(PyThreadState *tstate);
extern int _PyUnicode_EnableLegacyWindowsFSEncoding(void);
#endif
-PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc);
+extern int _Py_IsLocaleCoercionTarget(const char *ctype_loc);
/* Various one-time initializers */
@@ -67,30 +67,49 @@ extern PyStatus _PyGILState_Init(PyInterpreterState *interp);
extern PyStatus _PyGILState_SetTstate(PyThreadState *tstate);
extern void _PyGILState_Fini(PyInterpreterState *interp);
-PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp);
+extern void _PyGC_DumpShutdownStats(PyInterpreterState *interp);
-PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv(
+extern PyStatus _Py_PreInitializeFromPyArgv(
const PyPreConfig *src_config,
const struct _PyArgv *args);
-PyAPI_FUNC(PyStatus) _Py_PreInitializeFromConfig(
+extern PyStatus _Py_PreInitializeFromConfig(
const PyConfig *config,
const struct _PyArgv *args);
-PyAPI_FUNC(wchar_t *) _Py_GetStdlibDir(void);
+extern wchar_t * _Py_GetStdlibDir(void);
-PyAPI_FUNC(int) _Py_HandleSystemExit(int *exitcode_p);
+extern int _Py_HandleSystemExit(int *exitcode_p);
-PyAPI_FUNC(PyObject*) _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable);
+extern PyObject* _PyErr_WriteUnraisableDefaultHook(PyObject *unraisable);
-PyAPI_FUNC(void) _PyErr_Print(PyThreadState *tstate);
-PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception,
+extern void _PyErr_Print(PyThreadState *tstate);
+extern void _PyErr_Display(PyObject *file, PyObject *exception,
PyObject *value, PyObject *tb);
-PyAPI_FUNC(void) _PyErr_DisplayException(PyObject *file, PyObject *exc);
+extern void _PyErr_DisplayException(PyObject *file, PyObject *exc);
-PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate);
+extern void _PyThreadState_DeleteCurrent(PyThreadState *tstate);
extern void _PyAtExit_Call(PyInterpreterState *interp);
+extern int _Py_IsCoreInitialized(void);
+
+extern int _Py_FdIsInteractive(FILE *fp, PyObject *filename);
+
+extern const char* _Py_gitidentifier(void);
+extern const char* _Py_gitversion(void);
+
+extern int _Py_IsFinalizing(void);
+PyAPI_FUNC(int) _Py_IsInterpreterFinalizing(PyInterpreterState *interp);
+
+/* Random */
+extern int _PyOS_URandom(void *buffer, Py_ssize_t size);
+PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size);
+
+/* Legacy locale support */
+extern int _Py_CoerceLegacyLocale(int warn);
+extern int _Py_LegacyLocaleDetected(int warn);
+PyAPI_FUNC(char*) _Py_SetLocaleFromEnv(int category);
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/internal/pycore_signal.h b/Include/internal/pycore_signal.h
index ca3f69d09fc0c..1a454ba6f4e8f 100644
--- a/Include/internal/pycore_signal.h
+++ b/Include/internal/pycore_signal.h
@@ -11,10 +11,12 @@ extern "C" {
#endif
#include "pycore_atomic.h" // _Py_atomic_address
-
#include <signal.h> // NSIG
+/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */
+PyAPI_FUNC(void) _Py_RestoreSignals(void);
+
#ifdef _SIG_MAXSIG
// gh-91145: On FreeBSD, <signal.h> defines NSIG as 32: it doesn't include
// realtime signals: [SIGRTMIN,SIGRTMAX]. Use _SIG_MAXSIG instead. For
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 05f94ef9ed281..3843f9c45d723 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -3,10 +3,11 @@
#endif
#include "Python.h"
+#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_pyerrors.h" // _PyErr_ClearExcState()
+#include "pycore_pylifecycle.h" // _Py_IsInterpreterFinalizing()
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_runtime_init.h" // _Py_ID()
-#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "structmember.h" // PyMemberDef
#include <stddef.h> // offsetof()
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index 4d120d4e8af3a..e58e87926f673 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -11,6 +11,7 @@
#include "pycore_call.h" // _PyObject_CallNoArgs()
#include "pycore_object.h"
#include "pycore_pyerrors.h" // _Py_FatalErrorFormat()
+#include "pycore_pylifecycle.h" // _Py_IsInterpreterFinalizing()
#include "structmember.h" // PyMemberDef
#include "_iomodule.h"
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index 6caa4b8852911..ac2b0d4f55468 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -6,6 +6,7 @@
#include "Python.h"
#include "pycore_fileutils.h"
#include "pycore_pystate.h"
+#include "pycore_signal.h" // _Py_RestoreSignals()
#if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE)
# define _GNU_SOURCE
#endif
@@ -739,8 +740,9 @@ child_exec(char *const exec_array[],
if (child_umask >= 0)
umask(child_umask); /* umask() always succeeds. */
- if (restore_signals)
+ if (restore_signals) {
_Py_RestoreSignals();
+ }
#ifdef VFORK_USABLE
if (child_sigmask) {
diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c
index fda5ef267fb47..7daa1f9327966 100644
--- a/Modules/_randommodule.c
+++ b/Modules/_randommodule.c
@@ -72,6 +72,7 @@
#include "Python.h"
#include "pycore_moduleobject.h" // _PyModule_GetState()
+#include "pycore_pylifecycle.h" // _PyOS_URandomNonblock()
#include "pycore_runtime.h"
#ifdef HAVE_PROCESS_H
# include <process.h> // getpid()
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index d71cef14779e5..bab743674b666 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -34,6 +34,7 @@
#include "prepare_protocol.h"
#include "util.h"
#include "pycore_import.h" // _PyImport_GetModuleAttrString()
+#include "pycore_pylifecycle.h" // _Py_IsInterpreterFinalizing()
#include "pycore_weakref.h" // _PyWeakref_IS_DEAD()
#include <stdbool.h>
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index d1044b5445202..2baf453f71026 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -3293,37 +3293,6 @@ function_set_kw_defaults(PyObject *self, PyObject *args)
Py_RETURN_NONE;
}
-struct atexit_data {
- int called;
-};
-
-static void
-callback(void *data)
-{
- ((struct atexit_data *)data)->called += 1;
-}
-
-static PyObject *
-test_atexit(PyObject *self, PyObject *Py_UNUSED(args))
-{
- PyThreadState *oldts = PyThreadState_Swap(NULL);
- PyThreadState *tstate = Py_NewInterpreter();
-
- struct atexit_data data = {0};
- int res = _Py_AtExit(tstate->interp, callback, (void *)&data);
- Py_EndInterpreter(tstate);
- PyThreadState_Swap(oldts);
- if (res < 0) {
- return NULL;
- }
- if (data.called == 0) {
- PyErr_SetString(PyExc_RuntimeError, "atexit callback not called");
- return NULL;
- }
- Py_RETURN_NONE;
-}
-
-
static PyObject *
check_pyimport_addmodule(PyObject *self, PyObject *args)
{
@@ -3613,7 +3582,6 @@ static PyMethodDef TestMethods[] = {
{"function_set_defaults", function_set_defaults, METH_VARARGS, NULL},
{"function_get_kw_defaults", function_get_kw_defaults, METH_O, NULL},
{"function_set_kw_defaults", function_set_kw_defaults, METH_VARARGS, NULL},
- {"test_atexit", test_atexit, METH_NOARGS},
{"check_pyimport_addmodule", check_pyimport_addmodule, METH_VARARGS},
{"test_weakref_capi", test_weakref_capi, METH_NOARGS},
{NULL, NULL} /* sentinel */
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c
index 14f91e8da1716..84511d27e37f4 100644
--- a/Modules/_testinternalcapi.c
+++ b/Modules/_testinternalcapi.c
@@ -1264,6 +1264,38 @@ unicode_transformdecimalandspacetoascii(PyObject *self, PyObject *arg)
}
+struct atexit_data {
+ int called;
+};
+
+static void
+callback(void *data)
+{
+ ((struct atexit_data *)data)->called += 1;
+}
+
+static PyObject *
+test_atexit(PyObject *self, PyObject *Py_UNUSED(args))
+{
+ PyThreadState *oldts = PyThreadState_Swap(NULL);
+ PyThreadState *tstate = Py_NewInterpreter();
+
+ struct atexit_data data = {0};
+ int res = _Py_AtExit(tstate->interp, callback, (void *)&data);
+ Py_EndInterpreter(tstate);
+ PyThreadState_Swap(oldts);
+ if (res < 0) {
+ return NULL;
+ }
+
+ if (data.called == 0) {
+ PyErr_SetString(PyExc_RuntimeError, "atexit callback not called");
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+
static PyMethodDef module_functions[] = {
{"get_configs", get_configs, METH_NOARGS},
{"get_recursion_depth", get_recursion_depth, METH_NOARGS},
@@ -1316,6 +1348,7 @@ static PyMethodDef module_functions[] = {
{"_PyTraceMalloc_GetTraceback", tracemalloc_get_traceback, METH_VARARGS},
{"test_tstate_capi", test_tstate_capi, METH_NOARGS, NULL},
{"_PyUnicode_TransformDecimalAndSpaceToASCII", unicode_transformdecimalandspacetoascii, METH_O},
+ {"test_atexit", test_atexit, METH_NOARGS},
{NULL, NULL} /* sentinel */
};
diff --git a/Modules/_xxinterpchannelsmodule.c b/Modules/_xxinterpchannelsmodule.c
index 1d7e7f1d71af3..82472555ec7d6 100644
--- a/Modules/_xxinterpchannelsmodule.c
+++ b/Modules/_xxinterpchannelsmodule.c
@@ -1,9 +1,13 @@
-
/* interpreters module */
/* low-level access to interpreter primitives */
+#ifndef Py_BUILD_CORE_BUILTIN
+# define Py_BUILD_CORE_MODULE 1
+#endif
+
#include "Python.h"
#include "interpreteridobject.h"
+#include "pycore_atexit.h" // _Py_AtExit()
/*
diff --git a/Modules/getbuildinfo.c b/Modules/getbuildinfo.c
index a24750b76c09b..8d553d106c6ab 100644
--- a/Modules/getbuildinfo.c
+++ b/Modules/getbuildinfo.c
@@ -1,4 +1,9 @@
+#ifndef Py_BUILD_CORE_BUILTIN
+# define Py_BUILD_CORE_MODULE 1
+#endif
+
#include "Python.h"
+#include "pycore_pylifecycle.h" // _Py_gitidentifier()
#ifndef DONT_HAVE_STDIO_H
#include <stdio.h>
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index b9f42476e6b82..aef802c232c6c 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -19,6 +19,7 @@
#include "pycore_initconfig.h" // _PyStatus_EXCEPTION()
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_object.h" // _PyObject_LookupSpecial()
+#include "pycore_pylifecycle.h" // _PyOS_URandom()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_signal.h" // Py_NSIG
diff --git a/Modules/readline.c b/Modules/readline.c
index ff7075c6822e2..a592919692cb8 100644
--- a/Modules/readline.c
+++ b/Modules/readline.c
@@ -4,8 +4,13 @@
* recently, it was largely rewritten by Guido van Rossum.
*/
+#ifndef Py_BUILD_CORE_BUILTIN
+# define Py_BUILD_CORE_MODULE 1
+#endif
+
/* Standard definitions */
#include "Python.h"
+#include "pycore_pylifecycle.h" // _Py_SetLocaleFromEnv()
#include <errno.h>
#include <signal.h>
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 00ea4343735da..3adb2e8dfe58d 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -13,7 +13,7 @@
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_pyerrors.h" // _PyErr_SetString()
#include "pycore_pystate.h" // _PyThreadState_GET()
-#include "pycore_signal.h" // Py_NSIG
+#include "pycore_signal.h" // _Py_RestoreSignals()
#ifndef MS_WINDOWS
# include "posixmodule.h"
diff --git a/Python/_warnings.c b/Python/_warnings.c
index e4941f7b068d3..e0580f01d9361 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -1,10 +1,11 @@
#include "Python.h"
+#include "pycore_frame.h"
#include "pycore_initconfig.h"
#include "pycore_interp.h" // PyInterpreterState.warnings
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_pyerrors.h"
+#include "pycore_pylifecycle.h" // _Py_IsInterpreterFinalizing()
#include "pycore_pystate.h" // _PyThreadState_GET()
-#include "pycore_frame.h"
#include "clinic/_warnings.c.h"
#define MODULE_NAME "_warnings"
diff --git a/Python/bootstrap_hash.c b/Python/bootstrap_hash.c
index 587063ef1ab29..ef693e5df1fcc 100644
--- a/Python/bootstrap_hash.c
+++ b/Python/bootstrap_hash.c
@@ -1,6 +1,7 @@
#include "Python.h"
-#include "pycore_initconfig.h"
#include "pycore_fileutils.h" // _Py_fstat_noraise()
+#include "pycore_initconfig.h"
+#include "pycore_pylifecycle.h" // _PyOS_URandomNonblock()
#include "pycore_runtime.h" // _PyRuntime
#ifdef MS_WINDOWS
diff --git a/Python/preconfig.c b/Python/preconfig.c
index 77a86d651eb0f..5b26c75de8b3a 100644
--- a/Python/preconfig.c
+++ b/Python/preconfig.c
@@ -2,6 +2,7 @@
#include "pycore_fileutils.h" // DECODE_LOCALE_ERR
#include "pycore_getopt.h" // _PyOS_GetOpt()
#include "pycore_initconfig.h" // _PyArgv
+#include "pycore_pylifecycle.h" // _Py_LegacyLocaleDetected()
#include "pycore_pymem.h" // _PyMem_GetAllocatorName()
#include "pycore_runtime.h" // _PyRuntime_Initialize()
More information about the Python-checkins
mailing list