blob: 0729a5f83b52f7e7cc2759dfab4c60e75d419d4a [file] [log] [blame]
Nick Coghland6009512014-11-20 21:39:37 +10001/* Python interpreter top-level routines, including init/exit */
2
3#include "Python.h"
4
5#include "Python-ast.h"
6#undef Yield /* undefine macro conflicting with winbase.h */
Yury Selivanovf23746a2018-01-22 19:11:18 -05007#include "internal/context.h"
8#include "internal/hamt.h"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06009#include "internal/pystate.h"
Nick Coghland6009512014-11-20 21:39:37 +100010#include "grammar.h"
11#include "node.h"
12#include "token.h"
13#include "parsetok.h"
14#include "errcode.h"
15#include "code.h"
16#include "symtable.h"
17#include "ast.h"
18#include "marshal.h"
19#include "osdefs.h"
20#include <locale.h>
21
22#ifdef HAVE_SIGNAL_H
23#include <signal.h>
24#endif
25
26#ifdef MS_WINDOWS
27#include "malloc.h" /* for alloca */
28#endif
29
30#ifdef HAVE_LANGINFO_H
31#include <langinfo.h>
32#endif
33
34#ifdef MS_WINDOWS
35#undef BYTE
36#include "windows.h"
Steve Dower39294992016-08-30 21:22:36 -070037
38extern PyTypeObject PyWindowsConsoleIO_Type;
39#define PyWindowsConsoleIO_Check(op) (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type))
Nick Coghland6009512014-11-20 21:39:37 +100040#endif
41
42_Py_IDENTIFIER(flush);
43_Py_IDENTIFIER(name);
44_Py_IDENTIFIER(stdin);
45_Py_IDENTIFIER(stdout);
46_Py_IDENTIFIER(stderr);
Eric Snow3f9eee62017-09-15 16:35:20 -060047_Py_IDENTIFIER(threading);
Nick Coghland6009512014-11-20 21:39:37 +100048
49#ifdef __cplusplus
50extern "C" {
51#endif
52
Nick Coghland6009512014-11-20 21:39:37 +100053extern grammar _PyParser_Grammar; /* From graminit.c */
54
55/* Forward */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080056static _PyInitError add_main_module(PyInterpreterState *interp);
57static _PyInitError initfsencoding(PyInterpreterState *interp);
58static _PyInitError initsite(void);
Victor Stinner91106cd2017-12-13 12:29:09 +010059static _PyInitError init_sys_streams(PyInterpreterState *interp);
Victor Stinnerf7e5b562017-11-15 15:48:08 -080060static _PyInitError initsigs(void);
Marcel Plch776407f2017-12-20 11:17:58 +010061static void call_py_exitfuncs(PyInterpreterState *);
Nick Coghland6009512014-11-20 21:39:37 +100062static void wait_for_thread_shutdown(void);
63static void call_ll_exitfuncs(void);
64extern int _PyUnicode_Init(void);
65extern int _PyStructSequence_Init(void);
66extern void _PyUnicode_Fini(void);
67extern int _PyLong_Init(void);
68extern void PyLong_Fini(void);
Victor Stinnera7368ac2017-11-15 18:11:45 -080069extern _PyInitError _PyFaulthandler_Init(int enable);
Nick Coghland6009512014-11-20 21:39:37 +100070extern void _PyFaulthandler_Fini(void);
71extern void _PyHash_Fini(void);
Victor Stinnera7368ac2017-11-15 18:11:45 -080072extern int _PyTraceMalloc_Init(int enable);
Nick Coghland6009512014-11-20 21:39:37 +100073extern int _PyTraceMalloc_Fini(void);
Eric Snowc7ec9982017-05-23 23:00:52 -070074extern void _Py_ReadyTypes(void);
Nick Coghland6009512014-11-20 21:39:37 +100075
Nick Coghland6009512014-11-20 21:39:37 +100076extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
77extern void _PyGILState_Fini(void);
Nick Coghland6009512014-11-20 21:39:37 +100078
Victor Stinnerf7e5b562017-11-15 15:48:08 -080079_PyRuntimeState _PyRuntime = _PyRuntimeState_INIT;
Eric Snow2ebc5ce2017-09-07 23:51:28 -060080
Victor Stinnerf7e5b562017-11-15 15:48:08 -080081_PyInitError
Eric Snow2ebc5ce2017-09-07 23:51:28 -060082_PyRuntime_Initialize(void)
83{
84 /* XXX We only initialize once in the process, which aligns with
85 the static initialization of the former globals now found in
86 _PyRuntime. However, _PyRuntime *should* be initialized with
87 every Py_Initialize() call, but doing so breaks the runtime.
88 This is because the runtime state is not properly finalized
89 currently. */
90 static int initialized = 0;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080091 if (initialized) {
92 return _Py_INIT_OK();
93 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060094 initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080095
96 return _PyRuntimeState_Init(&_PyRuntime);
Eric Snow2ebc5ce2017-09-07 23:51:28 -060097}
98
99void
100_PyRuntime_Finalize(void)
101{
102 _PyRuntimeState_Fini(&_PyRuntime);
103}
104
105int
106_Py_IsFinalizing(void)
107{
108 return _PyRuntime.finalizing != NULL;
109}
110
Nick Coghland6009512014-11-20 21:39:37 +1000111/* Global configuration variable declarations are in pydebug.h */
112/* XXX (ncoghlan): move those declarations to pylifecycle.h? */
Benjamin Peterson0a37a302017-12-31 10:04:13 -0800113int Py_DebugFlag = 0; /* Needed by parser.c */
114int Py_VerboseFlag = 0; /* Needed by import.c */
115int Py_QuietFlag = 0; /* Needed by sysmodule.c */
116int Py_InteractiveFlag = 0; /* Needed by Py_FdIsInteractive() below */
117int Py_InspectFlag = 0; /* Needed to determine whether to exit at SystemExit */
Nick Coghland6009512014-11-20 21:39:37 +1000118int Py_OptimizeFlag = 0; /* Needed by compile.c */
Benjamin Peterson0a37a302017-12-31 10:04:13 -0800119int Py_NoSiteFlag = 0; /* Suppress 'import site' */
120int Py_BytesWarningFlag = 0; /* Warn on str(bytes) and str(buffer) */
121int Py_FrozenFlag = 0; /* Needed by getpath.c */
122int Py_IgnoreEnvironmentFlag = 0; /* e.g. PYTHONPATH, PYTHONHOME */
123int Py_DontWriteBytecodeFlag = 0; /* Suppress writing bytecode files (*.pyc) */
Nick Coghland6009512014-11-20 21:39:37 +1000124int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
125int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */
126int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */
127int Py_IsolatedFlag = 0; /* for -I, isolate from user's env */
Steve Dowercc16be82016-09-08 10:35:16 -0700128#ifdef MS_WINDOWS
129int Py_LegacyWindowsFSEncodingFlag = 0; /* Uses mbcs instead of utf-8 */
Steve Dower39294992016-08-30 21:22:36 -0700130int Py_LegacyWindowsStdioFlag = 0; /* Uses FileIO instead of WindowsConsoleIO */
Steve Dowercc16be82016-09-08 10:35:16 -0700131#endif
Nick Coghland6009512014-11-20 21:39:37 +1000132
Nick Coghland6009512014-11-20 21:39:37 +1000133/* Hack to force loading of object files */
134int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \
135 PyOS_mystrnicmp; /* Python/pystrcmp.o */
136
137/* PyModule_GetWarningsModule is no longer necessary as of 2.6
138since _warnings is builtin. This API should not be used. */
139PyObject *
140PyModule_GetWarningsModule(void)
141{
142 return PyImport_ImportModule("warnings");
143}
144
Eric Snowc7ec9982017-05-23 23:00:52 -0700145
Eric Snow1abcf672017-05-23 21:46:51 -0700146/* APIs to access the initialization flags
147 *
148 * Can be called prior to Py_Initialize.
149 */
Nick Coghland6009512014-11-20 21:39:37 +1000150
Eric Snow1abcf672017-05-23 21:46:51 -0700151int
152_Py_IsCoreInitialized(void)
153{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600154 return _PyRuntime.core_initialized;
Eric Snow1abcf672017-05-23 21:46:51 -0700155}
Nick Coghland6009512014-11-20 21:39:37 +1000156
157int
158Py_IsInitialized(void)
159{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600160 return _PyRuntime.initialized;
Nick Coghland6009512014-11-20 21:39:37 +1000161}
162
163/* Helper to allow an embedding application to override the normal
164 * mechanism that attempts to figure out an appropriate IO encoding
165 */
166
167static char *_Py_StandardStreamEncoding = NULL;
168static char *_Py_StandardStreamErrors = NULL;
169
170int
171Py_SetStandardStreamEncoding(const char *encoding, const char *errors)
172{
173 if (Py_IsInitialized()) {
174 /* This is too late to have any effect */
175 return -1;
176 }
Victor Stinner31e99082017-12-20 23:41:38 +0100177
178 int res = 0;
179
180 /* Py_SetStandardStreamEncoding() can be called before Py_Initialize(),
181 but Py_Initialize() can change the allocator. Use a known allocator
182 to be able to release the memory later. */
183 PyMemAllocatorEx old_alloc;
184 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
185
Nick Coghland6009512014-11-20 21:39:37 +1000186 /* Can't call PyErr_NoMemory() on errors, as Python hasn't been
187 * initialised yet.
188 *
189 * However, the raw memory allocators are initialised appropriately
190 * as C static variables, so _PyMem_RawStrdup is OK even though
191 * Py_Initialize hasn't been called yet.
192 */
193 if (encoding) {
194 _Py_StandardStreamEncoding = _PyMem_RawStrdup(encoding);
195 if (!_Py_StandardStreamEncoding) {
Victor Stinner31e99082017-12-20 23:41:38 +0100196 res = -2;
197 goto done;
Nick Coghland6009512014-11-20 21:39:37 +1000198 }
199 }
200 if (errors) {
201 _Py_StandardStreamErrors = _PyMem_RawStrdup(errors);
202 if (!_Py_StandardStreamErrors) {
203 if (_Py_StandardStreamEncoding) {
204 PyMem_RawFree(_Py_StandardStreamEncoding);
205 }
Victor Stinner31e99082017-12-20 23:41:38 +0100206 res = -3;
207 goto done;
Nick Coghland6009512014-11-20 21:39:37 +1000208 }
209 }
Steve Dower39294992016-08-30 21:22:36 -0700210#ifdef MS_WINDOWS
211 if (_Py_StandardStreamEncoding) {
212 /* Overriding the stream encoding implies legacy streams */
213 Py_LegacyWindowsStdioFlag = 1;
214 }
215#endif
Victor Stinner31e99082017-12-20 23:41:38 +0100216
217done:
218 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
219
220 return res;
Nick Coghland6009512014-11-20 21:39:37 +1000221}
222
Nick Coghlan6ea41862017-06-11 13:16:15 +1000223
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000224/* Global initializations. Can be undone by Py_FinalizeEx(). Don't
225 call this twice without an intervening Py_FinalizeEx() call. When
Nick Coghland6009512014-11-20 21:39:37 +1000226 initializations fail, a fatal error is issued and the function does
227 not return. On return, the first thread and interpreter state have
228 been created.
229
230 Locking: you must hold the interpreter lock while calling this.
231 (If the lock has not yet been initialized, that's equivalent to
232 having the lock, but you cannot use multiple threads.)
233
234*/
235
Nick Coghland6009512014-11-20 21:39:37 +1000236static char*
237get_codec_name(const char *encoding)
238{
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200239 const char *name_utf8;
240 char *name_str;
Nick Coghland6009512014-11-20 21:39:37 +1000241 PyObject *codec, *name = NULL;
242
243 codec = _PyCodec_Lookup(encoding);
244 if (!codec)
245 goto error;
246
247 name = _PyObject_GetAttrId(codec, &PyId_name);
248 Py_CLEAR(codec);
249 if (!name)
250 goto error;
251
Serhiy Storchaka06515832016-11-20 09:13:07 +0200252 name_utf8 = PyUnicode_AsUTF8(name);
Nick Coghland6009512014-11-20 21:39:37 +1000253 if (name_utf8 == NULL)
254 goto error;
255 name_str = _PyMem_RawStrdup(name_utf8);
256 Py_DECREF(name);
257 if (name_str == NULL) {
258 PyErr_NoMemory();
259 return NULL;
260 }
261 return name_str;
262
263error:
264 Py_XDECREF(codec);
265 Py_XDECREF(name);
266 return NULL;
267}
268
269static char*
270get_locale_encoding(void)
271{
Benjamin Petersondb610e92017-09-08 14:30:07 -0700272#if defined(HAVE_LANGINFO_H) && defined(CODESET)
Nick Coghland6009512014-11-20 21:39:37 +1000273 char* codeset = nl_langinfo(CODESET);
274 if (!codeset || codeset[0] == '\0') {
275 PyErr_SetString(PyExc_ValueError, "CODESET is not set or empty");
276 return NULL;
277 }
278 return get_codec_name(codeset);
Stefan Krah144da4e2016-04-26 01:56:50 +0200279#elif defined(__ANDROID__)
280 return get_codec_name("UTF-8");
Nick Coghland6009512014-11-20 21:39:37 +1000281#else
282 PyErr_SetNone(PyExc_NotImplementedError);
283 return NULL;
284#endif
285}
286
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800287static _PyInitError
Eric Snow1abcf672017-05-23 21:46:51 -0700288initimport(PyInterpreterState *interp, PyObject *sysmod)
Nick Coghland6009512014-11-20 21:39:37 +1000289{
290 PyObject *importlib;
291 PyObject *impmod;
Nick Coghland6009512014-11-20 21:39:37 +1000292 PyObject *value;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800293 _PyInitError err;
Nick Coghland6009512014-11-20 21:39:37 +1000294
295 /* Import _importlib through its frozen version, _frozen_importlib. */
296 if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800297 return _Py_INIT_ERR("can't import _frozen_importlib");
Nick Coghland6009512014-11-20 21:39:37 +1000298 }
299 else if (Py_VerboseFlag) {
300 PySys_FormatStderr("import _frozen_importlib # frozen\n");
301 }
302 importlib = PyImport_AddModule("_frozen_importlib");
303 if (importlib == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800304 return _Py_INIT_ERR("couldn't get _frozen_importlib from sys.modules");
Nick Coghland6009512014-11-20 21:39:37 +1000305 }
306 interp->importlib = importlib;
307 Py_INCREF(interp->importlib);
308
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300309 interp->import_func = PyDict_GetItemString(interp->builtins, "__import__");
310 if (interp->import_func == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800311 return _Py_INIT_ERR("__import__ not found");
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300312 Py_INCREF(interp->import_func);
313
Victor Stinnercd6e6942015-09-18 09:11:57 +0200314 /* Import the _imp module */
Benjamin Petersonc65ef772018-01-29 11:33:57 -0800315 impmod = PyInit__imp();
Nick Coghland6009512014-11-20 21:39:37 +1000316 if (impmod == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800317 return _Py_INIT_ERR("can't import _imp");
Nick Coghland6009512014-11-20 21:39:37 +1000318 }
319 else if (Py_VerboseFlag) {
Victor Stinnercd6e6942015-09-18 09:11:57 +0200320 PySys_FormatStderr("import _imp # builtin\n");
Nick Coghland6009512014-11-20 21:39:37 +1000321 }
Eric Snow3f9eee62017-09-15 16:35:20 -0600322 if (_PyImport_SetModuleString("_imp", impmod) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800323 return _Py_INIT_ERR("can't save _imp to sys.modules");
Nick Coghland6009512014-11-20 21:39:37 +1000324 }
325
Victor Stinnercd6e6942015-09-18 09:11:57 +0200326 /* Install importlib as the implementation of import */
Nick Coghland6009512014-11-20 21:39:37 +1000327 value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod);
328 if (value == NULL) {
329 PyErr_Print();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800330 return _Py_INIT_ERR("importlib install failed");
Nick Coghland6009512014-11-20 21:39:37 +1000331 }
332 Py_DECREF(value);
333 Py_DECREF(impmod);
334
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800335 err = _PyImportZip_Init();
336 if (_Py_INIT_FAILED(err)) {
337 return err;
338 }
339
340 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +1000341}
342
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800343static _PyInitError
Eric Snow1abcf672017-05-23 21:46:51 -0700344initexternalimport(PyInterpreterState *interp)
345{
346 PyObject *value;
347 value = PyObject_CallMethod(interp->importlib,
348 "_install_external_importers", "");
349 if (value == NULL) {
350 PyErr_Print();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800351 return _Py_INIT_ERR("external importer setup failed");
Eric Snow1abcf672017-05-23 21:46:51 -0700352 }
Stéphane Wirtelab1cb802017-06-08 13:13:20 +0200353 Py_DECREF(value);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800354 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -0700355}
Nick Coghland6009512014-11-20 21:39:37 +1000356
Nick Coghlan6ea41862017-06-11 13:16:15 +1000357/* Helper functions to better handle the legacy C locale
358 *
359 * The legacy C locale assumes ASCII as the default text encoding, which
360 * causes problems not only for the CPython runtime, but also other
361 * components like GNU readline.
362 *
363 * Accordingly, when the CLI detects it, it attempts to coerce it to a
364 * more capable UTF-8 based alternative as follows:
365 *
366 * if (_Py_LegacyLocaleDetected()) {
367 * _Py_CoerceLegacyLocale();
368 * }
369 *
370 * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
371 *
372 * Locale coercion also impacts the default error handler for the standard
373 * streams: while the usual default is "strict", the default for the legacy
374 * C locale and for any of the coercion target locales is "surrogateescape".
375 */
376
377int
378_Py_LegacyLocaleDetected(void)
379{
380#ifndef MS_WINDOWS
381 /* On non-Windows systems, the C locale is considered a legacy locale */
Nick Coghlaneb817952017-06-18 12:29:42 +1000382 /* XXX (ncoghlan): some platforms (notably Mac OS X) don't appear to treat
383 * the POSIX locale as a simple alias for the C locale, so
384 * we may also want to check for that explicitly.
385 */
Nick Coghlan6ea41862017-06-11 13:16:15 +1000386 const char *ctype_loc = setlocale(LC_CTYPE, NULL);
387 return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
388#else
389 /* Windows uses code pages instead of locales, so no locale is legacy */
390 return 0;
391#endif
392}
393
Nick Coghlaneb817952017-06-18 12:29:42 +1000394static const char *_C_LOCALE_WARNING =
395 "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII "
396 "encoding), which may cause Unicode compatibility problems. Using C.UTF-8, "
397 "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
398 "locales is recommended.\n";
399
Nick Coghlaneb817952017-06-18 12:29:42 +1000400static void
Victor Stinner94540602017-12-16 04:54:22 +0100401_emit_stderr_warning_for_legacy_locale(const _PyCoreConfig *core_config)
Nick Coghlaneb817952017-06-18 12:29:42 +1000402{
Victor Stinner94540602017-12-16 04:54:22 +0100403 if (core_config->coerce_c_locale_warn) {
Nick Coghlaneb817952017-06-18 12:29:42 +1000404 if (_Py_LegacyLocaleDetected()) {
405 fprintf(stderr, "%s", _C_LOCALE_WARNING);
406 }
407 }
408}
409
Nick Coghlan6ea41862017-06-11 13:16:15 +1000410typedef struct _CandidateLocale {
411 const char *locale_name; /* The locale to try as a coercion target */
412} _LocaleCoercionTarget;
413
414static _LocaleCoercionTarget _TARGET_LOCALES[] = {
415 {"C.UTF-8"},
416 {"C.utf8"},
Nick Coghlan18974c32017-06-30 00:48:14 +1000417 {"UTF-8"},
Nick Coghlan6ea41862017-06-11 13:16:15 +1000418 {NULL}
419};
420
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +0200421static const char *
Nick Coghlan6ea41862017-06-11 13:16:15 +1000422get_default_standard_stream_error_handler(void)
423{
424 const char *ctype_loc = setlocale(LC_CTYPE, NULL);
425 if (ctype_loc != NULL) {
426 /* "surrogateescape" is the default in the legacy C locale */
427 if (strcmp(ctype_loc, "C") == 0) {
428 return "surrogateescape";
429 }
430
431#ifdef PY_COERCE_C_LOCALE
432 /* "surrogateescape" is the default in locale coercion target locales */
433 const _LocaleCoercionTarget *target = NULL;
434 for (target = _TARGET_LOCALES; target->locale_name; target++) {
435 if (strcmp(ctype_loc, target->locale_name) == 0) {
436 return "surrogateescape";
437 }
438 }
439#endif
440 }
441
442 /* Otherwise return NULL to request the typical default error handler */
443 return NULL;
444}
445
446#ifdef PY_COERCE_C_LOCALE
Victor Stinner94540602017-12-16 04:54:22 +0100447static const char C_LOCALE_COERCION_WARNING[] =
Nick Coghlan6ea41862017-06-11 13:16:15 +1000448 "Python detected LC_CTYPE=C: LC_CTYPE coerced to %.20s (set another locale "
449 "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";
450
451static void
Victor Stinner94540602017-12-16 04:54:22 +0100452_coerce_default_locale_settings(const _PyCoreConfig *config, const _LocaleCoercionTarget *target)
Nick Coghlan6ea41862017-06-11 13:16:15 +1000453{
454 const char *newloc = target->locale_name;
455
456 /* Reset locale back to currently configured defaults */
xdegaye1588be62017-11-12 12:45:59 +0100457 _Py_SetLocaleFromEnv(LC_ALL);
Nick Coghlan6ea41862017-06-11 13:16:15 +1000458
459 /* Set the relevant locale environment variable */
460 if (setenv("LC_CTYPE", newloc, 1)) {
461 fprintf(stderr,
462 "Error setting LC_CTYPE, skipping C locale coercion\n");
463 return;
464 }
Victor Stinner94540602017-12-16 04:54:22 +0100465 if (config->coerce_c_locale_warn) {
466 fprintf(stderr, C_LOCALE_COERCION_WARNING, newloc);
Nick Coghlaneb817952017-06-18 12:29:42 +1000467 }
Nick Coghlan6ea41862017-06-11 13:16:15 +1000468
469 /* Reconfigure with the overridden environment variables */
xdegaye1588be62017-11-12 12:45:59 +0100470 _Py_SetLocaleFromEnv(LC_ALL);
Nick Coghlan6ea41862017-06-11 13:16:15 +1000471}
472#endif
473
474void
Victor Stinner94540602017-12-16 04:54:22 +0100475_Py_CoerceLegacyLocale(const _PyCoreConfig *config)
Nick Coghlan6ea41862017-06-11 13:16:15 +1000476{
477#ifdef PY_COERCE_C_LOCALE
Victor Stinner94540602017-12-16 04:54:22 +0100478 const char *locale_override = getenv("LC_ALL");
479 if (locale_override == NULL || *locale_override == '\0') {
480 /* LC_ALL is also not set (or is set to an empty string) */
481 const _LocaleCoercionTarget *target = NULL;
482 for (target = _TARGET_LOCALES; target->locale_name; target++) {
483 const char *new_locale = setlocale(LC_CTYPE,
484 target->locale_name);
485 if (new_locale != NULL) {
xdegaye1588be62017-11-12 12:45:59 +0100486#if !defined(__APPLE__) && !defined(__ANDROID__) && \
Victor Stinner94540602017-12-16 04:54:22 +0100487defined(HAVE_LANGINFO_H) && defined(CODESET)
488 /* Also ensure that nl_langinfo works in this locale */
489 char *codeset = nl_langinfo(CODESET);
490 if (!codeset || *codeset == '\0') {
491 /* CODESET is not set or empty, so skip coercion */
492 new_locale = NULL;
493 _Py_SetLocaleFromEnv(LC_CTYPE);
494 continue;
Nick Coghlan6ea41862017-06-11 13:16:15 +1000495 }
Victor Stinner94540602017-12-16 04:54:22 +0100496#endif
497 /* Successfully configured locale, so make it the default */
498 _coerce_default_locale_settings(config, target);
499 return;
Nick Coghlan6ea41862017-06-11 13:16:15 +1000500 }
501 }
502 }
503 /* No C locale warning here, as Py_Initialize will emit one later */
504#endif
505}
506
xdegaye1588be62017-11-12 12:45:59 +0100507/* _Py_SetLocaleFromEnv() is a wrapper around setlocale(category, "") to
508 * isolate the idiosyncrasies of different libc implementations. It reads the
509 * appropriate environment variable and uses its value to select the locale for
510 * 'category'. */
511char *
512_Py_SetLocaleFromEnv(int category)
513{
514#ifdef __ANDROID__
515 const char *locale;
516 const char **pvar;
517#ifdef PY_COERCE_C_LOCALE
518 const char *coerce_c_locale;
519#endif
520 const char *utf8_locale = "C.UTF-8";
521 const char *env_var_set[] = {
522 "LC_ALL",
523 "LC_CTYPE",
524 "LANG",
525 NULL,
526 };
527
528 /* Android setlocale(category, "") doesn't check the environment variables
529 * and incorrectly sets the "C" locale at API 24 and older APIs. We only
530 * check the environment variables listed in env_var_set. */
531 for (pvar=env_var_set; *pvar; pvar++) {
532 locale = getenv(*pvar);
533 if (locale != NULL && *locale != '\0') {
534 if (strcmp(locale, utf8_locale) == 0 ||
535 strcmp(locale, "en_US.UTF-8") == 0) {
536 return setlocale(category, utf8_locale);
537 }
538 return setlocale(category, "C");
539 }
540 }
541
542 /* Android uses UTF-8, so explicitly set the locale to C.UTF-8 if none of
543 * LC_ALL, LC_CTYPE, or LANG is set to a non-empty string.
544 * Quote from POSIX section "8.2 Internationalization Variables":
545 * "4. If the LANG environment variable is not set or is set to the empty
546 * string, the implementation-defined default locale shall be used." */
547
548#ifdef PY_COERCE_C_LOCALE
549 coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
550 if (coerce_c_locale == NULL || strcmp(coerce_c_locale, "0") != 0) {
551 /* Some other ported code may check the environment variables (e.g. in
552 * extension modules), so we make sure that they match the locale
553 * configuration */
554 if (setenv("LC_CTYPE", utf8_locale, 1)) {
555 fprintf(stderr, "Warning: failed setting the LC_CTYPE "
556 "environment variable to %s\n", utf8_locale);
557 }
558 }
559#endif
560 return setlocale(category, utf8_locale);
561#else /* __ANDROID__ */
562 return setlocale(category, "");
563#endif /* __ANDROID__ */
564}
565
Nick Coghlan6ea41862017-06-11 13:16:15 +1000566
Eric Snow1abcf672017-05-23 21:46:51 -0700567/* Global initializations. Can be undone by Py_Finalize(). Don't
568 call this twice without an intervening Py_Finalize() call.
569
Victor Stinner1dc6e392018-07-25 02:49:17 +0200570 Every call to _Py_InitializeCore, Py_Initialize or Py_InitializeEx
Eric Snow1abcf672017-05-23 21:46:51 -0700571 must have a corresponding call to Py_Finalize.
572
573 Locking: you must hold the interpreter lock while calling these APIs.
574 (If the lock has not yet been initialized, that's equivalent to
575 having the lock, but you cannot use multiple threads.)
576
577*/
578
Victor Stinner1dc6e392018-07-25 02:49:17 +0200579static _PyInitError
580_Py_Initialize_ReconfigureCore(PyInterpreterState *interp,
581 const _PyCoreConfig *core_config)
582{
583 if (core_config->allocator != NULL) {
584 const char *allocator = _PyMem_GetAllocatorsName();
585 if (allocator == NULL || strcmp(core_config->allocator, allocator) != 0) {
586 return _Py_INIT_USER_ERR("cannot modify memory allocator "
587 "after first Py_Initialize()");
588 }
589 }
590
591 _PyCoreConfig_SetGlobalConfig(core_config);
592
593 if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
594 return _Py_INIT_ERR("failed to copy core config");
595 }
596 core_config = &interp->core_config;
597
598 if (core_config->_install_importlib) {
599 _PyInitError err = _PyCoreConfig_SetPathConfig(core_config);
600 if (_Py_INIT_FAILED(err)) {
601 return err;
602 }
603 }
604 return _Py_INIT_OK();
605}
606
607
Eric Snow1abcf672017-05-23 21:46:51 -0700608/* Begin interpreter initialization
609 *
610 * On return, the first thread and interpreter state have been created,
611 * but the compiler, signal handling, multithreading and
612 * multiple interpreter support, and codec infrastructure are not yet
613 * available.
614 *
615 * The import system will support builtin and frozen modules only.
616 * The only supported io is writing to sys.stderr
617 *
618 * If any operation invoked by this function fails, a fatal error is
619 * issued and the function does not return.
620 *
621 * Any code invoked from this function should *not* assume it has access
622 * to the Python C API (unless the API is explicitly listed as being
623 * safe to call without calling Py_Initialize first)
Victor Stinner1dc6e392018-07-25 02:49:17 +0200624 *
625 * The caller is responsible to call _PyCoreConfig_Read().
Eric Snow1abcf672017-05-23 21:46:51 -0700626 */
627
Victor Stinner1dc6e392018-07-25 02:49:17 +0200628static _PyInitError
629_Py_InitializeCore_impl(PyInterpreterState **interp_p,
630 const _PyCoreConfig *core_config)
Nick Coghland6009512014-11-20 21:39:37 +1000631{
Victor Stinner1dc6e392018-07-25 02:49:17 +0200632 PyInterpreterState *interp;
633 _PyInitError err;
634
635 /* bpo-34008: For backward compatibility reasons, calling Py_Main() after
636 Py_Initialize() ignores the new configuration. */
637 if (_PyRuntime.core_initialized) {
638 PyThreadState *tstate = PyThreadState_GET();
639 if (!tstate) {
640 return _Py_INIT_ERR("failed to read thread state");
641 }
642
643 interp = tstate->interp;
644 if (interp == NULL) {
645 return _Py_INIT_ERR("can't make main interpreter");
646 }
647 *interp_p = interp;
648
649 return _Py_Initialize_ReconfigureCore(interp, core_config);
650 }
651
652 if (_PyRuntime.initialized) {
653 return _Py_INIT_ERR("main interpreter already initialized");
654 }
Victor Stinnerda273412017-12-15 01:46:02 +0100655
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200656 _PyCoreConfig_SetGlobalConfig(core_config);
Nick Coghland6009512014-11-20 21:39:37 +1000657
Victor Stinner1dc6e392018-07-25 02:49:17 +0200658 err = _PyRuntime_Initialize();
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800659 if (_Py_INIT_FAILED(err)) {
660 return err;
661 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600662
Victor Stinner31e99082017-12-20 23:41:38 +0100663 if (core_config->allocator != NULL) {
664 if (_PyMem_SetupAllocators(core_config->allocator) < 0) {
665 return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator");
666 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800667 }
668
Eric Snow1abcf672017-05-23 21:46:51 -0700669 /* Py_Finalize leaves _Py_Finalizing set in order to help daemon
670 * threads behave a little more gracefully at interpreter shutdown.
671 * We clobber it here so the new interpreter can start with a clean
672 * slate.
673 *
674 * However, this may still lead to misbehaviour if there are daemon
675 * threads still hanging around from a previous Py_Initialize/Finalize
676 * pair :(
677 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600678 _PyRuntime.finalizing = NULL;
679
Nick Coghlan6ea41862017-06-11 13:16:15 +1000680#ifndef MS_WINDOWS
Nick Coghland6009512014-11-20 21:39:37 +1000681 /* Set up the LC_CTYPE locale, so we can obtain
682 the locale's charset without having to switch
683 locales. */
xdegaye1588be62017-11-12 12:45:59 +0100684 _Py_SetLocaleFromEnv(LC_CTYPE);
Victor Stinner94540602017-12-16 04:54:22 +0100685 _emit_stderr_warning_for_legacy_locale(core_config);
Nick Coghlan6ea41862017-06-11 13:16:15 +1000686#endif
Nick Coghland6009512014-11-20 21:39:37 +1000687
Victor Stinnerda273412017-12-15 01:46:02 +0100688 err = _Py_HashRandomization_Init(core_config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800689 if (_Py_INIT_FAILED(err)) {
690 return err;
691 }
692
Victor Stinnera7368ac2017-11-15 18:11:45 -0800693 err = _PyInterpreterState_Enable(&_PyRuntime);
694 if (_Py_INIT_FAILED(err)) {
695 return err;
696 }
697
Victor Stinner1dc6e392018-07-25 02:49:17 +0200698 interp = PyInterpreterState_New();
Victor Stinnerda273412017-12-15 01:46:02 +0100699 if (interp == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800700 return _Py_INIT_ERR("can't make main interpreter");
Victor Stinnerda273412017-12-15 01:46:02 +0100701 }
Victor Stinner1dc6e392018-07-25 02:49:17 +0200702 *interp_p = interp;
Victor Stinnerda273412017-12-15 01:46:02 +0100703
704 if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
705 return _Py_INIT_ERR("failed to copy core config");
706 }
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200707 core_config = &interp->core_config;
Nick Coghland6009512014-11-20 21:39:37 +1000708
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200709 PyThreadState *tstate = PyThreadState_New(interp);
Nick Coghland6009512014-11-20 21:39:37 +1000710 if (tstate == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800711 return _Py_INIT_ERR("can't make first thread");
Nick Coghland6009512014-11-20 21:39:37 +1000712 (void) PyThreadState_Swap(tstate);
713
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000714 /* We can't call _PyEval_FiniThreads() in Py_FinalizeEx because
Nick Coghland6009512014-11-20 21:39:37 +1000715 destroying the GIL might fail when it is being referenced from
716 another running thread (see issue #9901).
717 Instead we destroy the previously created GIL here, which ensures
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000718 that we can call Py_Initialize / Py_FinalizeEx multiple times. */
Nick Coghland6009512014-11-20 21:39:37 +1000719 _PyEval_FiniThreads();
Victor Stinner2914bb32018-01-29 11:57:45 +0100720
Nick Coghland6009512014-11-20 21:39:37 +1000721 /* Auto-thread-state API */
722 _PyGILState_Init(interp, tstate);
Nick Coghland6009512014-11-20 21:39:37 +1000723
Victor Stinner2914bb32018-01-29 11:57:45 +0100724 /* Create the GIL */
725 PyEval_InitThreads();
726
Nick Coghland6009512014-11-20 21:39:37 +1000727 _Py_ReadyTypes();
728
Nick Coghland6009512014-11-20 21:39:37 +1000729 if (!_PyLong_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800730 return _Py_INIT_ERR("can't init longs");
Nick Coghland6009512014-11-20 21:39:37 +1000731
732 if (!PyByteArray_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800733 return _Py_INIT_ERR("can't init bytearray");
Nick Coghland6009512014-11-20 21:39:37 +1000734
735 if (!_PyFloat_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800736 return _Py_INIT_ERR("can't init float");
Nick Coghland6009512014-11-20 21:39:37 +1000737
Eric Snowd393c1b2017-09-14 12:18:12 -0600738 PyObject *modules = PyDict_New();
739 if (modules == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800740 return _Py_INIT_ERR("can't make modules dictionary");
Eric Snowd393c1b2017-09-14 12:18:12 -0600741 interp->modules = modules;
742
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200743 PyObject *sysmod;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800744 err = _PySys_BeginInit(&sysmod);
745 if (_Py_INIT_FAILED(err)) {
746 return err;
747 }
748
Eric Snowd393c1b2017-09-14 12:18:12 -0600749 interp->sysdict = PyModule_GetDict(sysmod);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800750 if (interp->sysdict == NULL) {
751 return _Py_INIT_ERR("can't initialize sys dict");
752 }
753
Eric Snowd393c1b2017-09-14 12:18:12 -0600754 Py_INCREF(interp->sysdict);
755 PyDict_SetItemString(interp->sysdict, "modules", modules);
756 _PyImport_FixupBuiltin(sysmod, "sys", modules);
Nick Coghland6009512014-11-20 21:39:37 +1000757
758 /* Init Unicode implementation; relies on the codec registry */
759 if (_PyUnicode_Init() < 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800760 return _Py_INIT_ERR("can't initialize unicode");
Eric Snow1abcf672017-05-23 21:46:51 -0700761
Nick Coghland6009512014-11-20 21:39:37 +1000762 if (_PyStructSequence_Init() < 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800763 return _Py_INIT_ERR("can't initialize structseq");
Nick Coghland6009512014-11-20 21:39:37 +1000764
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200765 PyObject *bimod = _PyBuiltin_Init();
Nick Coghland6009512014-11-20 21:39:37 +1000766 if (bimod == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800767 return _Py_INIT_ERR("can't initialize builtins modules");
Eric Snowd393c1b2017-09-14 12:18:12 -0600768 _PyImport_FixupBuiltin(bimod, "builtins", modules);
Nick Coghland6009512014-11-20 21:39:37 +1000769 interp->builtins = PyModule_GetDict(bimod);
770 if (interp->builtins == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800771 return _Py_INIT_ERR("can't initialize builtins dict");
Nick Coghland6009512014-11-20 21:39:37 +1000772 Py_INCREF(interp->builtins);
773
774 /* initialize builtin exceptions */
775 _PyExc_Init(bimod);
776
Nick Coghland6009512014-11-20 21:39:37 +1000777 /* Set up a preliminary stderr printer until we have enough
778 infrastructure for the io module in place. */
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200779 PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
Nick Coghland6009512014-11-20 21:39:37 +1000780 if (pstderr == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800781 return _Py_INIT_ERR("can't set preliminary stderr");
Nick Coghland6009512014-11-20 21:39:37 +1000782 _PySys_SetObjectId(&PyId_stderr, pstderr);
783 PySys_SetObject("__stderr__", pstderr);
784 Py_DECREF(pstderr);
785
Victor Stinner672b6ba2017-12-06 17:25:50 +0100786 err = _PyImport_Init(interp);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800787 if (_Py_INIT_FAILED(err)) {
788 return err;
789 }
Nick Coghland6009512014-11-20 21:39:37 +1000790
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800791 err = _PyImportHooks_Init();
792 if (_Py_INIT_FAILED(err)) {
793 return err;
794 }
Nick Coghland6009512014-11-20 21:39:37 +1000795
796 /* Initialize _warnings. */
Victor Stinner5d862462017-12-19 11:35:58 +0100797 if (_PyWarnings_Init() == NULL) {
Victor Stinner1f151112017-11-23 10:43:14 +0100798 return _Py_INIT_ERR("can't initialize warnings");
799 }
Nick Coghland6009512014-11-20 21:39:37 +1000800
Yury Selivanovf23746a2018-01-22 19:11:18 -0500801 if (!_PyContext_Init())
802 return _Py_INIT_ERR("can't init context");
803
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200804 if (core_config->_install_importlib) {
Victor Stinnerb1147e42018-07-21 02:06:16 +0200805 err = _PyCoreConfig_SetPathConfig(core_config);
806 if (_Py_INIT_FAILED(err)) {
807 return err;
808 }
809 }
810
Eric Snow1abcf672017-05-23 21:46:51 -0700811 /* This call sets up builtin and frozen import support */
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200812 if (core_config->_install_importlib) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800813 err = initimport(interp, sysmod);
814 if (_Py_INIT_FAILED(err)) {
815 return err;
816 }
Eric Snow1abcf672017-05-23 21:46:51 -0700817 }
818
819 /* Only when we get here is the runtime core fully initialized */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600820 _PyRuntime.core_initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800821 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -0700822}
823
Victor Stinner1dc6e392018-07-25 02:49:17 +0200824_PyInitError
825_Py_InitializeCore(PyInterpreterState **interp_p,
826 const _PyCoreConfig *src_config)
827{
828 assert(src_config != NULL);
829
830
831 PyMemAllocatorEx old_alloc;
832 _PyInitError err;
833
834 /* Copy the configuration, since _PyCoreConfig_Read() modifies it
835 (and the input configuration is read only). */
836 _PyCoreConfig config = _PyCoreConfig_INIT;
837
838 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
839 if (_PyCoreConfig_Copy(&config, src_config) >= 0) {
840 err = _PyCoreConfig_Read(&config);
841 }
842 else {
843 err = _Py_INIT_ERR("failed to copy core config");
844 }
845 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
846
847 if (_Py_INIT_FAILED(err)) {
848 goto done;
849 }
850
851 err = _Py_InitializeCore_impl(interp_p, &config);
852
853done:
854 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
855 _PyCoreConfig_Clear(&config);
856 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
857
858 return err;
859}
860
Victor Stinnerfb47bca2018-07-20 17:34:23 +0200861/* Py_Initialize() has already been called: update the main interpreter
862 configuration. Example of bpo-34008: Py_Main() called after
863 Py_Initialize(). */
864static _PyInitError
865_Py_ReconfigureMainInterpreter(PyInterpreterState *interp,
866 const _PyMainInterpreterConfig *config)
867{
868 if (config->argv != NULL) {
869 int res = PyDict_SetItemString(interp->sysdict, "argv", config->argv);
870 if (res < 0) {
871 return _Py_INIT_ERR("fail to set sys.argv");
872 }
873 }
874 return _Py_INIT_OK();
875}
876
Eric Snowc7ec9982017-05-23 23:00:52 -0700877/* Update interpreter state based on supplied configuration settings
878 *
879 * After calling this function, most of the restrictions on the interpreter
880 * are lifted. The only remaining incomplete settings are those related
881 * to the main module (sys.argv[0], __main__ metadata)
882 *
883 * Calling this when the interpreter is not initializing, is already
884 * initialized or without a valid current thread state is a fatal error.
885 * Other errors should be reported as normal Python exceptions with a
886 * non-zero return code.
887 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800888_PyInitError
Victor Stinner1dc6e392018-07-25 02:49:17 +0200889_Py_InitializeMainInterpreter(PyInterpreterState *interp,
890 const _PyMainInterpreterConfig *config)
Eric Snow1abcf672017-05-23 21:46:51 -0700891{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600892 if (!_PyRuntime.core_initialized) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800893 return _Py_INIT_ERR("runtime core not initialized");
Eric Snowc7ec9982017-05-23 23:00:52 -0700894 }
Eric Snowc7ec9982017-05-23 23:00:52 -0700895
Victor Stinner1dc6e392018-07-25 02:49:17 +0200896 /* Configure the main interpreter */
Victor Stinnerda273412017-12-15 01:46:02 +0100897 if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) {
898 return _Py_INIT_ERR("failed to copy main interpreter config");
899 }
Victor Stinner1dc6e392018-07-25 02:49:17 +0200900 config = &interp->config;
901 _PyCoreConfig *core_config = &interp->core_config;
Eric Snowc7ec9982017-05-23 23:00:52 -0700902
Victor Stinnerfb47bca2018-07-20 17:34:23 +0200903 if (_PyRuntime.initialized) {
904 return _Py_ReconfigureMainInterpreter(interp, config);
905 }
906
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200907 if (!core_config->_install_importlib) {
Eric Snow1abcf672017-05-23 21:46:51 -0700908 /* Special mode for freeze_importlib: run with no import system
909 *
910 * This means anything which needs support from extension modules
911 * or pure Python code in the standard library won't work.
912 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600913 _PyRuntime.initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800914 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -0700915 }
Victor Stinner9316ee42017-11-25 03:17:57 +0100916
Victor Stinner33c377e2017-12-05 15:12:41 +0100917 if (_PyTime_Init() < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800918 return _Py_INIT_ERR("can't initialize time");
Victor Stinner33c377e2017-12-05 15:12:41 +0100919 }
Victor Stinner13019fd2015-04-03 13:10:54 +0200920
Victor Stinner41264f12017-12-15 02:05:29 +0100921 if (_PySys_EndInit(interp->sysdict, &interp->config) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800922 return _Py_INIT_ERR("can't finish initializing sys");
Victor Stinnerda273412017-12-15 01:46:02 +0100923 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800924
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200925 _PyInitError err = initexternalimport(interp);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800926 if (_Py_INIT_FAILED(err)) {
927 return err;
928 }
Nick Coghland6009512014-11-20 21:39:37 +1000929
930 /* initialize the faulthandler module */
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200931 err = _PyFaulthandler_Init(core_config->faulthandler);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800932 if (_Py_INIT_FAILED(err)) {
933 return err;
934 }
Nick Coghland6009512014-11-20 21:39:37 +1000935
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800936 err = initfsencoding(interp);
937 if (_Py_INIT_FAILED(err)) {
938 return err;
939 }
Nick Coghland6009512014-11-20 21:39:37 +1000940
Victor Stinner1f151112017-11-23 10:43:14 +0100941 if (interp->config.install_signal_handlers) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800942 err = initsigs(); /* Signal handling stuff, including initintr() */
943 if (_Py_INIT_FAILED(err)) {
944 return err;
945 }
946 }
Nick Coghland6009512014-11-20 21:39:37 +1000947
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200948 if (_PyTraceMalloc_Init(core_config->tracemalloc) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800949 return _Py_INIT_ERR("can't initialize tracemalloc");
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200950 }
Nick Coghland6009512014-11-20 21:39:37 +1000951
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800952 err = add_main_module(interp);
953 if (_Py_INIT_FAILED(err)) {
954 return err;
955 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800956
Victor Stinner91106cd2017-12-13 12:29:09 +0100957 err = init_sys_streams(interp);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800958 if (_Py_INIT_FAILED(err)) {
959 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800960 }
Nick Coghland6009512014-11-20 21:39:37 +1000961
962 /* Initialize warnings. */
Victor Stinner5d862462017-12-19 11:35:58 +0100963 if (interp->config.warnoptions != NULL &&
964 PyList_Size(interp->config.warnoptions) > 0)
965 {
Nick Coghland6009512014-11-20 21:39:37 +1000966 PyObject *warnings_module = PyImport_ImportModule("warnings");
967 if (warnings_module == NULL) {
968 fprintf(stderr, "'import warnings' failed; traceback:\n");
969 PyErr_Print();
970 }
971 Py_XDECREF(warnings_module);
972 }
973
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600974 _PyRuntime.initialized = 1;
Eric Snow1abcf672017-05-23 21:46:51 -0700975
Victor Stinnerd19d8d52018-07-24 13:55:48 +0200976 if (core_config->site_import) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800977 err = initsite(); /* Module site */
978 if (_Py_INIT_FAILED(err)) {
979 return err;
980 }
981 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800982 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +1000983}
984
Eric Snowc7ec9982017-05-23 23:00:52 -0700985#undef _INIT_DEBUG_PRINT
986
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800987_PyInitError
Victor Stinner1dc6e392018-07-25 02:49:17 +0200988_Py_InitializeFromConfig(const _PyCoreConfig *config)
Eric Snow1abcf672017-05-23 21:46:51 -0700989{
Victor Stinner1dc6e392018-07-25 02:49:17 +0200990 PyInterpreterState *interp;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800991 _PyInitError err;
Victor Stinner1dc6e392018-07-25 02:49:17 +0200992 err = _Py_InitializeCore(&interp, config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800993 if (_Py_INIT_FAILED(err)) {
Victor Stinner1dc6e392018-07-25 02:49:17 +0200994 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800995 }
Victor Stinner1dc6e392018-07-25 02:49:17 +0200996 config = &interp->core_config;
Victor Stinnerbc8ac6b2017-11-30 18:03:55 +0100997
Victor Stinner9cfc0022017-12-20 19:36:46 +0100998 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
Victor Stinner1dc6e392018-07-25 02:49:17 +0200999 err = _PyMainInterpreterConfig_Read(&main_config, config);
Victor Stinner9cfc0022017-12-20 19:36:46 +01001000 if (!_Py_INIT_FAILED(err)) {
Victor Stinner1dc6e392018-07-25 02:49:17 +02001001 err = _Py_InitializeMainInterpreter(interp, &main_config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001002 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001003 _PyMainInterpreterConfig_Clear(&main_config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001004 if (_Py_INIT_FAILED(err)) {
Victor Stinner1dc6e392018-07-25 02:49:17 +02001005 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001006 }
Victor Stinner1dc6e392018-07-25 02:49:17 +02001007 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -07001008}
1009
1010
1011void
Nick Coghland6009512014-11-20 21:39:37 +10001012Py_InitializeEx(int install_sigs)
1013{
Victor Stinner1dc6e392018-07-25 02:49:17 +02001014 if (_PyRuntime.initialized) {
1015 /* bpo-33932: Calling Py_Initialize() twice does nothing. */
1016 return;
1017 }
1018
1019 _PyInitError err;
1020 _PyCoreConfig config = _PyCoreConfig_INIT;
1021 config.install_signal_handlers = install_sigs;
1022
1023 err = _Py_InitializeFromConfig(&config);
1024 _PyCoreConfig_Clear(&config);
1025
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001026 if (_Py_INIT_FAILED(err)) {
1027 _Py_FatalInitError(err);
1028 }
Nick Coghland6009512014-11-20 21:39:37 +10001029}
1030
1031void
1032Py_Initialize(void)
1033{
1034 Py_InitializeEx(1);
1035}
1036
1037
1038#ifdef COUNT_ALLOCS
1039extern void dump_counts(FILE*);
1040#endif
1041
1042/* Flush stdout and stderr */
1043
1044static int
1045file_is_closed(PyObject *fobj)
1046{
1047 int r;
1048 PyObject *tmp = PyObject_GetAttrString(fobj, "closed");
1049 if (tmp == NULL) {
1050 PyErr_Clear();
1051 return 0;
1052 }
1053 r = PyObject_IsTrue(tmp);
1054 Py_DECREF(tmp);
1055 if (r < 0)
1056 PyErr_Clear();
1057 return r > 0;
1058}
1059
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001060static int
Nick Coghland6009512014-11-20 21:39:37 +10001061flush_std_files(void)
1062{
1063 PyObject *fout = _PySys_GetObjectId(&PyId_stdout);
1064 PyObject *ferr = _PySys_GetObjectId(&PyId_stderr);
1065 PyObject *tmp;
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001066 int status = 0;
Nick Coghland6009512014-11-20 21:39:37 +10001067
1068 if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
Victor Stinner3466bde2016-09-05 18:16:01 -07001069 tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL);
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001070 if (tmp == NULL) {
Nick Coghland6009512014-11-20 21:39:37 +10001071 PyErr_WriteUnraisable(fout);
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001072 status = -1;
1073 }
Nick Coghland6009512014-11-20 21:39:37 +10001074 else
1075 Py_DECREF(tmp);
1076 }
1077
1078 if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
Victor Stinner3466bde2016-09-05 18:16:01 -07001079 tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL);
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001080 if (tmp == NULL) {
Nick Coghland6009512014-11-20 21:39:37 +10001081 PyErr_Clear();
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001082 status = -1;
1083 }
Nick Coghland6009512014-11-20 21:39:37 +10001084 else
1085 Py_DECREF(tmp);
1086 }
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001087
1088 return status;
Nick Coghland6009512014-11-20 21:39:37 +10001089}
1090
1091/* Undo the effect of Py_Initialize().
1092
1093 Beware: if multiple interpreter and/or thread states exist, these
1094 are not wiped out; only the current thread and interpreter state
1095 are deleted. But since everything else is deleted, those other
1096 interpreter and thread states should no longer be used.
1097
1098 (XXX We should do better, e.g. wipe out all interpreters and
1099 threads.)
1100
1101 Locking: as above.
1102
1103*/
1104
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001105int
1106Py_FinalizeEx(void)
Nick Coghland6009512014-11-20 21:39:37 +10001107{
1108 PyInterpreterState *interp;
1109 PyThreadState *tstate;
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001110 int status = 0;
Nick Coghland6009512014-11-20 21:39:37 +10001111
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001112 if (!_PyRuntime.initialized)
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001113 return status;
Nick Coghland6009512014-11-20 21:39:37 +10001114
1115 wait_for_thread_shutdown();
1116
Marcel Plch776407f2017-12-20 11:17:58 +01001117 /* Get current thread state and interpreter pointer */
1118 tstate = PyThreadState_GET();
1119 interp = tstate->interp;
1120
Nick Coghland6009512014-11-20 21:39:37 +10001121 /* The interpreter is still entirely intact at this point, and the
1122 * exit funcs may be relying on that. In particular, if some thread
1123 * or exit func is still waiting to do an import, the import machinery
1124 * expects Py_IsInitialized() to return true. So don't say the
1125 * interpreter is uninitialized until after the exit funcs have run.
1126 * Note that Threading.py uses an exit func to do a join on all the
1127 * threads created thru it, so this also protects pending imports in
1128 * the threads created via Threading.
1129 */
Nick Coghland6009512014-11-20 21:39:37 +10001130
Marcel Plch776407f2017-12-20 11:17:58 +01001131 call_py_exitfuncs(interp);
Nick Coghland6009512014-11-20 21:39:37 +10001132
Victor Stinnerda273412017-12-15 01:46:02 +01001133 /* Copy the core config, PyInterpreterState_Delete() free
1134 the core config memory */
Victor Stinner5d862462017-12-19 11:35:58 +01001135#ifdef Py_REF_DEBUG
Victor Stinnerda273412017-12-15 01:46:02 +01001136 int show_ref_count = interp->core_config.show_ref_count;
Victor Stinner5d862462017-12-19 11:35:58 +01001137#endif
1138#ifdef Py_TRACE_REFS
Victor Stinnerda273412017-12-15 01:46:02 +01001139 int dump_refs = interp->core_config.dump_refs;
Victor Stinner5d862462017-12-19 11:35:58 +01001140#endif
1141#ifdef WITH_PYMALLOC
Victor Stinnerda273412017-12-15 01:46:02 +01001142 int malloc_stats = interp->core_config.malloc_stats;
Victor Stinner5d862462017-12-19 11:35:58 +01001143#endif
Victor Stinner6bf992a2017-12-06 17:26:10 +01001144
Nick Coghland6009512014-11-20 21:39:37 +10001145 /* Remaining threads (e.g. daemon threads) will automatically exit
1146 after taking the GIL (in PyEval_RestoreThread()). */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001147 _PyRuntime.finalizing = tstate;
1148 _PyRuntime.initialized = 0;
1149 _PyRuntime.core_initialized = 0;
Nick Coghland6009512014-11-20 21:39:37 +10001150
Victor Stinnere0deff32015-03-24 13:46:18 +01001151 /* Flush sys.stdout and sys.stderr */
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001152 if (flush_std_files() < 0) {
1153 status = -1;
1154 }
Nick Coghland6009512014-11-20 21:39:37 +10001155
1156 /* Disable signal handling */
1157 PyOS_FiniInterrupts();
1158
1159 /* Collect garbage. This may call finalizers; it's nice to call these
1160 * before all modules are destroyed.
1161 * XXX If a __del__ or weakref callback is triggered here, and tries to
1162 * XXX import a module, bad things can happen, because Python no
1163 * XXX longer believes it's initialized.
1164 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
1165 * XXX is easy to provoke that way. I've also seen, e.g.,
1166 * XXX Exception exceptions.ImportError: 'No module named sha'
1167 * XXX in <function callback at 0x008F5718> ignored
1168 * XXX but I'm unclear on exactly how that one happens. In any case,
1169 * XXX I haven't seen a real-life report of either of these.
1170 */
Łukasz Langafef7e942016-09-09 21:47:46 -07001171 _PyGC_CollectIfEnabled();
Nick Coghland6009512014-11-20 21:39:37 +10001172#ifdef COUNT_ALLOCS
1173 /* With COUNT_ALLOCS, it helps to run GC multiple times:
1174 each collection might release some types from the type
1175 list, so they become garbage. */
Łukasz Langafef7e942016-09-09 21:47:46 -07001176 while (_PyGC_CollectIfEnabled() > 0)
Nick Coghland6009512014-11-20 21:39:37 +10001177 /* nothing */;
1178#endif
Eric Snowdae02762017-09-14 00:35:58 -07001179
Nick Coghland6009512014-11-20 21:39:37 +10001180 /* Destroy all modules */
1181 PyImport_Cleanup();
1182
Victor Stinnere0deff32015-03-24 13:46:18 +01001183 /* Flush sys.stdout and sys.stderr (again, in case more was printed) */
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001184 if (flush_std_files() < 0) {
1185 status = -1;
1186 }
Nick Coghland6009512014-11-20 21:39:37 +10001187
1188 /* Collect final garbage. This disposes of cycles created by
1189 * class definitions, for example.
1190 * XXX This is disabled because it caused too many problems. If
1191 * XXX a __del__ or weakref callback triggers here, Python code has
1192 * XXX a hard time running, because even the sys module has been
1193 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
1194 * XXX One symptom is a sequence of information-free messages
1195 * XXX coming from threads (if a __del__ or callback is invoked,
1196 * XXX other threads can execute too, and any exception they encounter
1197 * XXX triggers a comedy of errors as subsystem after subsystem
1198 * XXX fails to find what it *expects* to find in sys to help report
1199 * XXX the exception and consequent unexpected failures). I've also
1200 * XXX seen segfaults then, after adding print statements to the
1201 * XXX Python code getting called.
1202 */
1203#if 0
Łukasz Langafef7e942016-09-09 21:47:46 -07001204 _PyGC_CollectIfEnabled();
Nick Coghland6009512014-11-20 21:39:37 +10001205#endif
1206
1207 /* Disable tracemalloc after all Python objects have been destroyed,
1208 so it is possible to use tracemalloc in objects destructor. */
1209 _PyTraceMalloc_Fini();
1210
1211 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
1212 _PyImport_Fini();
1213
1214 /* Cleanup typeobject.c's internal caches. */
1215 _PyType_Fini();
1216
1217 /* unload faulthandler module */
1218 _PyFaulthandler_Fini();
1219
1220 /* Debugging stuff */
1221#ifdef COUNT_ALLOCS
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +03001222 dump_counts(stderr);
Nick Coghland6009512014-11-20 21:39:37 +10001223#endif
1224 /* dump hash stats */
1225 _PyHash_Fini();
1226
Eric Snowdae02762017-09-14 00:35:58 -07001227#ifdef Py_REF_DEBUG
Victor Stinnerda273412017-12-15 01:46:02 +01001228 if (show_ref_count) {
Victor Stinner25420fe2017-11-20 18:12:22 -08001229 _PyDebug_PrintTotalRefs();
1230 }
Eric Snowdae02762017-09-14 00:35:58 -07001231#endif
Nick Coghland6009512014-11-20 21:39:37 +10001232
1233#ifdef Py_TRACE_REFS
1234 /* Display all objects still alive -- this can invoke arbitrary
1235 * __repr__ overrides, so requires a mostly-intact interpreter.
1236 * Alas, a lot of stuff may still be alive now that will be cleaned
1237 * up later.
1238 */
Victor Stinnerda273412017-12-15 01:46:02 +01001239 if (dump_refs) {
Nick Coghland6009512014-11-20 21:39:37 +10001240 _Py_PrintReferences(stderr);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001241 }
Nick Coghland6009512014-11-20 21:39:37 +10001242#endif /* Py_TRACE_REFS */
1243
1244 /* Clear interpreter state and all thread states. */
1245 PyInterpreterState_Clear(interp);
1246
1247 /* Now we decref the exception classes. After this point nothing
1248 can raise an exception. That's okay, because each Fini() method
1249 below has been checked to make sure no exceptions are ever
1250 raised.
1251 */
1252
1253 _PyExc_Fini();
1254
1255 /* Sundry finalizers */
1256 PyMethod_Fini();
1257 PyFrame_Fini();
1258 PyCFunction_Fini();
1259 PyTuple_Fini();
1260 PyList_Fini();
1261 PySet_Fini();
1262 PyBytes_Fini();
1263 PyByteArray_Fini();
1264 PyLong_Fini();
1265 PyFloat_Fini();
1266 PyDict_Fini();
1267 PySlice_Fini();
1268 _PyGC_Fini();
Eric Snow6b4be192017-05-22 21:36:03 -07001269 _Py_HashRandomization_Fini();
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001270 _PyArg_Fini();
Yury Selivanoveb636452016-09-08 22:01:51 -07001271 PyAsyncGen_Fini();
Yury Selivanovf23746a2018-01-22 19:11:18 -05001272 _PyContext_Fini();
Nick Coghland6009512014-11-20 21:39:37 +10001273
1274 /* Cleanup Unicode implementation */
1275 _PyUnicode_Fini();
1276
1277 /* reset file system default encoding */
1278 if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
1279 PyMem_RawFree((char*)Py_FileSystemDefaultEncoding);
1280 Py_FileSystemDefaultEncoding = NULL;
1281 }
1282
1283 /* XXX Still allocated:
1284 - various static ad-hoc pointers to interned strings
1285 - int and float free list blocks
1286 - whatever various modules and libraries allocate
1287 */
1288
1289 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
1290
1291 /* Cleanup auto-thread-state */
Nick Coghland6009512014-11-20 21:39:37 +10001292 _PyGILState_Fini();
Nick Coghland6009512014-11-20 21:39:37 +10001293
1294 /* Delete current thread. After this, many C API calls become crashy. */
1295 PyThreadState_Swap(NULL);
Victor Stinner8a1be612016-03-14 22:07:55 +01001296
Nick Coghland6009512014-11-20 21:39:37 +10001297 PyInterpreterState_Delete(interp);
1298
1299#ifdef Py_TRACE_REFS
1300 /* Display addresses (& refcnts) of all objects still alive.
1301 * An address can be used to find the repr of the object, printed
1302 * above by _Py_PrintReferences.
1303 */
Victor Stinnerda273412017-12-15 01:46:02 +01001304 if (dump_refs) {
Nick Coghland6009512014-11-20 21:39:37 +10001305 _Py_PrintReferenceAddresses(stderr);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001306 }
Nick Coghland6009512014-11-20 21:39:37 +10001307#endif /* Py_TRACE_REFS */
Victor Stinner34be8072016-03-14 12:04:26 +01001308#ifdef WITH_PYMALLOC
Victor Stinnerda273412017-12-15 01:46:02 +01001309 if (malloc_stats) {
Victor Stinner6bf992a2017-12-06 17:26:10 +01001310 _PyObject_DebugMallocStats(stderr);
Victor Stinner34be8072016-03-14 12:04:26 +01001311 }
Nick Coghland6009512014-11-20 21:39:37 +10001312#endif
1313
1314 call_ll_exitfuncs();
Victor Stinner9316ee42017-11-25 03:17:57 +01001315
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001316 _PyRuntime_Finalize();
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001317 return status;
1318}
1319
1320void
1321Py_Finalize(void)
1322{
1323 Py_FinalizeEx();
Nick Coghland6009512014-11-20 21:39:37 +10001324}
1325
1326/* Create and initialize a new interpreter and thread, and return the
1327 new thread. This requires that Py_Initialize() has been called
1328 first.
1329
1330 Unsuccessful initialization yields a NULL pointer. Note that *no*
1331 exception information is available even in this case -- the
1332 exception information is held in the thread, and there is no
1333 thread.
1334
1335 Locking: as above.
1336
1337*/
1338
Victor Stinnera7368ac2017-11-15 18:11:45 -08001339static _PyInitError
1340new_interpreter(PyThreadState **tstate_p)
Nick Coghland6009512014-11-20 21:39:37 +10001341{
1342 PyInterpreterState *interp;
1343 PyThreadState *tstate, *save_tstate;
1344 PyObject *bimod, *sysmod;
Victor Stinner9316ee42017-11-25 03:17:57 +01001345 _PyInitError err;
Nick Coghland6009512014-11-20 21:39:37 +10001346
Victor Stinnera7368ac2017-11-15 18:11:45 -08001347 if (!_PyRuntime.initialized) {
1348 return _Py_INIT_ERR("Py_Initialize must be called first");
1349 }
Nick Coghland6009512014-11-20 21:39:37 +10001350
Victor Stinner8a1be612016-03-14 22:07:55 +01001351 /* Issue #10915, #15751: The GIL API doesn't work with multiple
1352 interpreters: disable PyGILState_Check(). */
1353 _PyGILState_check_enabled = 0;
1354
Nick Coghland6009512014-11-20 21:39:37 +10001355 interp = PyInterpreterState_New();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001356 if (interp == NULL) {
1357 *tstate_p = NULL;
1358 return _Py_INIT_OK();
1359 }
Nick Coghland6009512014-11-20 21:39:37 +10001360
1361 tstate = PyThreadState_New(interp);
1362 if (tstate == NULL) {
1363 PyInterpreterState_Delete(interp);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001364 *tstate_p = NULL;
1365 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001366 }
1367
1368 save_tstate = PyThreadState_Swap(tstate);
1369
Eric Snow1abcf672017-05-23 21:46:51 -07001370 /* Copy the current interpreter config into the new interpreter */
Victor Stinnerda273412017-12-15 01:46:02 +01001371 _PyCoreConfig *core_config;
1372 _PyMainInterpreterConfig *config;
Eric Snow1abcf672017-05-23 21:46:51 -07001373 if (save_tstate != NULL) {
Victor Stinnerda273412017-12-15 01:46:02 +01001374 core_config = &save_tstate->interp->core_config;
1375 config = &save_tstate->interp->config;
Eric Snow1abcf672017-05-23 21:46:51 -07001376 } else {
1377 /* No current thread state, copy from the main interpreter */
1378 PyInterpreterState *main_interp = PyInterpreterState_Main();
Victor Stinnerda273412017-12-15 01:46:02 +01001379 core_config = &main_interp->core_config;
1380 config = &main_interp->config;
1381 }
1382
1383 if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
1384 return _Py_INIT_ERR("failed to copy core config");
1385 }
Victor Stinnerd19d8d52018-07-24 13:55:48 +02001386 core_config = &interp->core_config;
Victor Stinnerda273412017-12-15 01:46:02 +01001387 if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) {
1388 return _Py_INIT_ERR("failed to copy main interpreter config");
Eric Snow1abcf672017-05-23 21:46:51 -07001389 }
1390
Nick Coghland6009512014-11-20 21:39:37 +10001391 /* XXX The following is lax in error checking */
Eric Snowd393c1b2017-09-14 12:18:12 -06001392 PyObject *modules = PyDict_New();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001393 if (modules == NULL) {
1394 return _Py_INIT_ERR("can't make modules dictionary");
1395 }
Eric Snowd393c1b2017-09-14 12:18:12 -06001396 interp->modules = modules;
Nick Coghland6009512014-11-20 21:39:37 +10001397
Eric Snowd393c1b2017-09-14 12:18:12 -06001398 sysmod = _PyImport_FindBuiltin("sys", modules);
1399 if (sysmod != NULL) {
1400 interp->sysdict = PyModule_GetDict(sysmod);
1401 if (interp->sysdict == NULL)
1402 goto handle_error;
1403 Py_INCREF(interp->sysdict);
1404 PyDict_SetItemString(interp->sysdict, "modules", modules);
Victor Stinner41264f12017-12-15 02:05:29 +01001405 _PySys_EndInit(interp->sysdict, &interp->config);
Eric Snowd393c1b2017-09-14 12:18:12 -06001406 }
1407
1408 bimod = _PyImport_FindBuiltin("builtins", modules);
Nick Coghland6009512014-11-20 21:39:37 +10001409 if (bimod != NULL) {
1410 interp->builtins = PyModule_GetDict(bimod);
1411 if (interp->builtins == NULL)
1412 goto handle_error;
1413 Py_INCREF(interp->builtins);
1414 }
1415
1416 /* initialize builtin exceptions */
1417 _PyExc_Init(bimod);
1418
Nick Coghland6009512014-11-20 21:39:37 +10001419 if (bimod != NULL && sysmod != NULL) {
1420 PyObject *pstderr;
1421
Nick Coghland6009512014-11-20 21:39:37 +10001422 /* Set up a preliminary stderr printer until we have enough
1423 infrastructure for the io module in place. */
1424 pstderr = PyFile_NewStdPrinter(fileno(stderr));
Victor Stinnera7368ac2017-11-15 18:11:45 -08001425 if (pstderr == NULL) {
1426 return _Py_INIT_ERR("can't set preliminary stderr");
1427 }
Nick Coghland6009512014-11-20 21:39:37 +10001428 _PySys_SetObjectId(&PyId_stderr, pstderr);
1429 PySys_SetObject("__stderr__", pstderr);
1430 Py_DECREF(pstderr);
1431
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001432 err = _PyImportHooks_Init();
1433 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001434 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001435 }
Nick Coghland6009512014-11-20 21:39:37 +10001436
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001437 err = initimport(interp, sysmod);
1438 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001439 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001440 }
Nick Coghland6009512014-11-20 21:39:37 +10001441
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001442 err = initexternalimport(interp);
1443 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001444 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001445 }
Nick Coghland6009512014-11-20 21:39:37 +10001446
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001447 err = initfsencoding(interp);
1448 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001449 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001450 }
1451
Victor Stinner91106cd2017-12-13 12:29:09 +01001452 err = init_sys_streams(interp);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001453 if (_Py_INIT_FAILED(err)) {
1454 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001455 }
1456
1457 err = add_main_module(interp);
1458 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001459 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001460 }
1461
Victor Stinnerd19d8d52018-07-24 13:55:48 +02001462 if (core_config->site_import) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001463 err = initsite();
1464 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001465 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001466 }
1467 }
Nick Coghland6009512014-11-20 21:39:37 +10001468 }
1469
Victor Stinnera7368ac2017-11-15 18:11:45 -08001470 if (PyErr_Occurred()) {
1471 goto handle_error;
1472 }
Nick Coghland6009512014-11-20 21:39:37 +10001473
Victor Stinnera7368ac2017-11-15 18:11:45 -08001474 *tstate_p = tstate;
1475 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001476
Nick Coghland6009512014-11-20 21:39:37 +10001477handle_error:
1478 /* Oops, it didn't work. Undo it all. */
1479
1480 PyErr_PrintEx(0);
1481 PyThreadState_Clear(tstate);
1482 PyThreadState_Swap(save_tstate);
1483 PyThreadState_Delete(tstate);
1484 PyInterpreterState_Delete(interp);
1485
Victor Stinnera7368ac2017-11-15 18:11:45 -08001486 *tstate_p = NULL;
1487 return _Py_INIT_OK();
1488}
1489
1490PyThreadState *
1491Py_NewInterpreter(void)
1492{
1493 PyThreadState *tstate;
1494 _PyInitError err = new_interpreter(&tstate);
1495 if (_Py_INIT_FAILED(err)) {
1496 _Py_FatalInitError(err);
1497 }
1498 return tstate;
1499
Nick Coghland6009512014-11-20 21:39:37 +10001500}
1501
1502/* Delete an interpreter and its last thread. This requires that the
1503 given thread state is current, that the thread has no remaining
1504 frames, and that it is its interpreter's only remaining thread.
1505 It is a fatal error to violate these constraints.
1506
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001507 (Py_FinalizeEx() doesn't have these constraints -- it zaps
Nick Coghland6009512014-11-20 21:39:37 +10001508 everything, regardless.)
1509
1510 Locking: as above.
1511
1512*/
1513
1514void
1515Py_EndInterpreter(PyThreadState *tstate)
1516{
1517 PyInterpreterState *interp = tstate->interp;
1518
1519 if (tstate != PyThreadState_GET())
1520 Py_FatalError("Py_EndInterpreter: thread is not current");
1521 if (tstate->frame != NULL)
1522 Py_FatalError("Py_EndInterpreter: thread still has a frame");
1523
1524 wait_for_thread_shutdown();
1525
Marcel Plch776407f2017-12-20 11:17:58 +01001526 call_py_exitfuncs(interp);
1527
Nick Coghland6009512014-11-20 21:39:37 +10001528 if (tstate != interp->tstate_head || tstate->next != NULL)
1529 Py_FatalError("Py_EndInterpreter: not the last thread");
1530
1531 PyImport_Cleanup();
1532 PyInterpreterState_Clear(interp);
1533 PyThreadState_Swap(NULL);
1534 PyInterpreterState_Delete(interp);
1535}
1536
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001537/* Add the __main__ module */
Nick Coghland6009512014-11-20 21:39:37 +10001538
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001539static _PyInitError
1540add_main_module(PyInterpreterState *interp)
Nick Coghland6009512014-11-20 21:39:37 +10001541{
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001542 PyObject *m, *d, *loader, *ann_dict;
Nick Coghland6009512014-11-20 21:39:37 +10001543 m = PyImport_AddModule("__main__");
1544 if (m == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001545 return _Py_INIT_ERR("can't create __main__ module");
1546
Nick Coghland6009512014-11-20 21:39:37 +10001547 d = PyModule_GetDict(m);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001548 ann_dict = PyDict_New();
1549 if ((ann_dict == NULL) ||
1550 (PyDict_SetItemString(d, "__annotations__", ann_dict) < 0)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001551 return _Py_INIT_ERR("Failed to initialize __main__.__annotations__");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001552 }
1553 Py_DECREF(ann_dict);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001554
Nick Coghland6009512014-11-20 21:39:37 +10001555 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
1556 PyObject *bimod = PyImport_ImportModule("builtins");
1557 if (bimod == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001558 return _Py_INIT_ERR("Failed to retrieve builtins module");
Nick Coghland6009512014-11-20 21:39:37 +10001559 }
1560 if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001561 return _Py_INIT_ERR("Failed to initialize __main__.__builtins__");
Nick Coghland6009512014-11-20 21:39:37 +10001562 }
1563 Py_DECREF(bimod);
1564 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001565
Nick Coghland6009512014-11-20 21:39:37 +10001566 /* Main is a little special - imp.is_builtin("__main__") will return
1567 * False, but BuiltinImporter is still the most appropriate initial
1568 * setting for its __loader__ attribute. A more suitable value will
1569 * be set if __main__ gets further initialized later in the startup
1570 * process.
1571 */
1572 loader = PyDict_GetItemString(d, "__loader__");
1573 if (loader == NULL || loader == Py_None) {
1574 PyObject *loader = PyObject_GetAttrString(interp->importlib,
1575 "BuiltinImporter");
1576 if (loader == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001577 return _Py_INIT_ERR("Failed to retrieve BuiltinImporter");
Nick Coghland6009512014-11-20 21:39:37 +10001578 }
1579 if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001580 return _Py_INIT_ERR("Failed to initialize __main__.__loader__");
Nick Coghland6009512014-11-20 21:39:37 +10001581 }
1582 Py_DECREF(loader);
1583 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001584 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001585}
1586
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001587static _PyInitError
Nick Coghland6009512014-11-20 21:39:37 +10001588initfsencoding(PyInterpreterState *interp)
1589{
1590 PyObject *codec;
1591
Steve Dowercc16be82016-09-08 10:35:16 -07001592#ifdef MS_WINDOWS
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001593 if (Py_LegacyWindowsFSEncodingFlag) {
Steve Dowercc16be82016-09-08 10:35:16 -07001594 Py_FileSystemDefaultEncoding = "mbcs";
1595 Py_FileSystemDefaultEncodeErrors = "replace";
1596 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001597 else {
Steve Dowercc16be82016-09-08 10:35:16 -07001598 Py_FileSystemDefaultEncoding = "utf-8";
1599 Py_FileSystemDefaultEncodeErrors = "surrogatepass";
1600 }
1601#else
Victor Stinner91106cd2017-12-13 12:29:09 +01001602 if (Py_FileSystemDefaultEncoding == NULL &&
1603 interp->core_config.utf8_mode)
1604 {
1605 Py_FileSystemDefaultEncoding = "utf-8";
1606 Py_HasFileSystemDefaultEncoding = 1;
1607 }
1608 else if (Py_FileSystemDefaultEncoding == NULL) {
Nick Coghland6009512014-11-20 21:39:37 +10001609 Py_FileSystemDefaultEncoding = get_locale_encoding();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001610 if (Py_FileSystemDefaultEncoding == NULL) {
1611 return _Py_INIT_ERR("Unable to get the locale encoding");
1612 }
Nick Coghland6009512014-11-20 21:39:37 +10001613
1614 Py_HasFileSystemDefaultEncoding = 0;
1615 interp->fscodec_initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001616 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001617 }
Steve Dowercc16be82016-09-08 10:35:16 -07001618#endif
Nick Coghland6009512014-11-20 21:39:37 +10001619
1620 /* the encoding is mbcs, utf-8 or ascii */
1621 codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
1622 if (!codec) {
1623 /* Such error can only occurs in critical situations: no more
1624 * memory, import a module of the standard library failed,
1625 * etc. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001626 return _Py_INIT_ERR("unable to load the file system codec");
Nick Coghland6009512014-11-20 21:39:37 +10001627 }
1628 Py_DECREF(codec);
1629 interp->fscodec_initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001630 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001631}
1632
1633/* Import the site module (not into __main__ though) */
1634
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001635static _PyInitError
Nick Coghland6009512014-11-20 21:39:37 +10001636initsite(void)
1637{
1638 PyObject *m;
1639 m = PyImport_ImportModule("site");
1640 if (m == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001641 return _Py_INIT_USER_ERR("Failed to import the site module");
Nick Coghland6009512014-11-20 21:39:37 +10001642 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001643 Py_DECREF(m);
1644 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001645}
1646
Victor Stinner874dbe82015-09-04 17:29:57 +02001647/* Check if a file descriptor is valid or not.
1648 Return 0 if the file descriptor is invalid, return non-zero otherwise. */
1649static int
1650is_valid_fd(int fd)
1651{
Victor Stinner1c4670e2017-05-04 00:45:56 +02001652#ifdef __APPLE__
1653 /* bpo-30225: On macOS Tiger, when stdout is redirected to a pipe
1654 and the other side of the pipe is closed, dup(1) succeed, whereas
1655 fstat(1, &st) fails with EBADF. Prefer fstat() over dup() to detect
1656 such error. */
1657 struct stat st;
1658 return (fstat(fd, &st) == 0);
1659#else
Victor Stinner874dbe82015-09-04 17:29:57 +02001660 int fd2;
Steve Dower940f33a2016-09-08 11:21:54 -07001661 if (fd < 0)
Victor Stinner874dbe82015-09-04 17:29:57 +02001662 return 0;
1663 _Py_BEGIN_SUPPRESS_IPH
Victor Stinner449b2712015-09-29 13:59:50 +02001664 /* Prefer dup() over fstat(). fstat() can require input/output whereas
1665 dup() doesn't, there is a low risk of EMFILE/ENFILE at Python
1666 startup. */
Victor Stinner874dbe82015-09-04 17:29:57 +02001667 fd2 = dup(fd);
1668 if (fd2 >= 0)
1669 close(fd2);
1670 _Py_END_SUPPRESS_IPH
1671 return fd2 >= 0;
Victor Stinner1c4670e2017-05-04 00:45:56 +02001672#endif
Victor Stinner874dbe82015-09-04 17:29:57 +02001673}
1674
1675/* returns Py_None if the fd is not valid */
Nick Coghland6009512014-11-20 21:39:37 +10001676static PyObject*
1677create_stdio(PyObject* io,
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001678 int fd, int write_mode, const char* name,
1679 const char* encoding, const char* errors)
Nick Coghland6009512014-11-20 21:39:37 +10001680{
1681 PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
1682 const char* mode;
1683 const char* newline;
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001684 PyObject *line_buffering, *write_through;
Nick Coghland6009512014-11-20 21:39:37 +10001685 int buffering, isatty;
1686 _Py_IDENTIFIER(open);
1687 _Py_IDENTIFIER(isatty);
1688 _Py_IDENTIFIER(TextIOWrapper);
1689 _Py_IDENTIFIER(mode);
1690
Victor Stinner874dbe82015-09-04 17:29:57 +02001691 if (!is_valid_fd(fd))
1692 Py_RETURN_NONE;
1693
Nick Coghland6009512014-11-20 21:39:37 +10001694 /* stdin is always opened in buffered mode, first because it shouldn't
1695 make a difference in common use cases, second because TextIOWrapper
1696 depends on the presence of a read1() method which only exists on
1697 buffered streams.
1698 */
1699 if (Py_UnbufferedStdioFlag && write_mode)
1700 buffering = 0;
1701 else
1702 buffering = -1;
1703 if (write_mode)
1704 mode = "wb";
1705 else
1706 mode = "rb";
1707 buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi",
1708 fd, mode, buffering,
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001709 Py_None, Py_None, /* encoding, errors */
1710 Py_None, 0); /* newline, closefd */
Nick Coghland6009512014-11-20 21:39:37 +10001711 if (buf == NULL)
1712 goto error;
1713
1714 if (buffering) {
1715 _Py_IDENTIFIER(raw);
1716 raw = _PyObject_GetAttrId(buf, &PyId_raw);
1717 if (raw == NULL)
1718 goto error;
1719 }
1720 else {
1721 raw = buf;
1722 Py_INCREF(raw);
1723 }
1724
Steve Dower39294992016-08-30 21:22:36 -07001725#ifdef MS_WINDOWS
1726 /* Windows console IO is always UTF-8 encoded */
1727 if (PyWindowsConsoleIO_Check(raw))
1728 encoding = "utf-8";
1729#endif
1730
Nick Coghland6009512014-11-20 21:39:37 +10001731 text = PyUnicode_FromString(name);
1732 if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0)
1733 goto error;
Victor Stinner3466bde2016-09-05 18:16:01 -07001734 res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL);
Nick Coghland6009512014-11-20 21:39:37 +10001735 if (res == NULL)
1736 goto error;
1737 isatty = PyObject_IsTrue(res);
1738 Py_DECREF(res);
1739 if (isatty == -1)
1740 goto error;
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001741 if (Py_UnbufferedStdioFlag)
1742 write_through = Py_True;
1743 else
1744 write_through = Py_False;
1745 if (isatty && !Py_UnbufferedStdioFlag)
Nick Coghland6009512014-11-20 21:39:37 +10001746 line_buffering = Py_True;
1747 else
1748 line_buffering = Py_False;
1749
1750 Py_CLEAR(raw);
1751 Py_CLEAR(text);
1752
1753#ifdef MS_WINDOWS
1754 /* sys.stdin: enable universal newline mode, translate "\r\n" and "\r"
1755 newlines to "\n".
1756 sys.stdout and sys.stderr: translate "\n" to "\r\n". */
1757 newline = NULL;
1758#else
1759 /* sys.stdin: split lines at "\n".
1760 sys.stdout and sys.stderr: don't translate newlines (use "\n"). */
1761 newline = "\n";
1762#endif
1763
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001764 stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssOO",
Nick Coghland6009512014-11-20 21:39:37 +10001765 buf, encoding, errors,
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001766 newline, line_buffering, write_through);
Nick Coghland6009512014-11-20 21:39:37 +10001767 Py_CLEAR(buf);
1768 if (stream == NULL)
1769 goto error;
1770
1771 if (write_mode)
1772 mode = "w";
1773 else
1774 mode = "r";
1775 text = PyUnicode_FromString(mode);
1776 if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0)
1777 goto error;
1778 Py_CLEAR(text);
1779 return stream;
1780
1781error:
1782 Py_XDECREF(buf);
1783 Py_XDECREF(stream);
1784 Py_XDECREF(text);
1785 Py_XDECREF(raw);
Nick Coghland6009512014-11-20 21:39:37 +10001786
Victor Stinner874dbe82015-09-04 17:29:57 +02001787 if (PyErr_ExceptionMatches(PyExc_OSError) && !is_valid_fd(fd)) {
1788 /* Issue #24891: the file descriptor was closed after the first
1789 is_valid_fd() check was called. Ignore the OSError and set the
1790 stream to None. */
1791 PyErr_Clear();
1792 Py_RETURN_NONE;
1793 }
1794 return NULL;
Nick Coghland6009512014-11-20 21:39:37 +10001795}
1796
1797/* Initialize sys.stdin, stdout, stderr and builtins.open */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001798static _PyInitError
Victor Stinner91106cd2017-12-13 12:29:09 +01001799init_sys_streams(PyInterpreterState *interp)
Nick Coghland6009512014-11-20 21:39:37 +10001800{
1801 PyObject *iomod = NULL, *wrapper;
1802 PyObject *bimod = NULL;
1803 PyObject *m;
1804 PyObject *std = NULL;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001805 int fd;
Nick Coghland6009512014-11-20 21:39:37 +10001806 PyObject * encoding_attr;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001807 char *pythonioencoding = NULL;
1808 const char *encoding, *errors;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001809 _PyInitError res = _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001810
1811 /* Hack to avoid a nasty recursion issue when Python is invoked
1812 in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
1813 if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) {
1814 goto error;
1815 }
1816 Py_DECREF(m);
1817
1818 if (!(m = PyImport_ImportModule("encodings.latin_1"))) {
1819 goto error;
1820 }
1821 Py_DECREF(m);
1822
1823 if (!(bimod = PyImport_ImportModule("builtins"))) {
1824 goto error;
1825 }
1826
1827 if (!(iomod = PyImport_ImportModule("io"))) {
1828 goto error;
1829 }
1830 if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
1831 goto error;
1832 }
1833
1834 /* Set builtins.open */
1835 if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
1836 Py_DECREF(wrapper);
1837 goto error;
1838 }
1839 Py_DECREF(wrapper);
1840
1841 encoding = _Py_StandardStreamEncoding;
1842 errors = _Py_StandardStreamErrors;
1843 if (!encoding || !errors) {
Victor Stinner91106cd2017-12-13 12:29:09 +01001844 char *opt = Py_GETENV("PYTHONIOENCODING");
1845 if (opt && opt[0] != '\0') {
Nick Coghland6009512014-11-20 21:39:37 +10001846 char *err;
Victor Stinner91106cd2017-12-13 12:29:09 +01001847 pythonioencoding = _PyMem_Strdup(opt);
Nick Coghland6009512014-11-20 21:39:37 +10001848 if (pythonioencoding == NULL) {
1849 PyErr_NoMemory();
1850 goto error;
1851 }
1852 err = strchr(pythonioencoding, ':');
1853 if (err) {
1854 *err = '\0';
1855 err++;
Serhiy Storchakafc435112016-04-10 14:34:13 +03001856 if (*err && !errors) {
Nick Coghland6009512014-11-20 21:39:37 +10001857 errors = err;
1858 }
1859 }
1860 if (*pythonioencoding && !encoding) {
1861 encoding = pythonioencoding;
1862 }
1863 }
Victor Stinner91106cd2017-12-13 12:29:09 +01001864 else if (interp->core_config.utf8_mode) {
1865 encoding = "utf-8";
1866 errors = "surrogateescape";
1867 }
1868
1869 if (!errors && !pythonioencoding) {
Nick Coghlan6ea41862017-06-11 13:16:15 +10001870 /* Choose the default error handler based on the current locale */
1871 errors = get_default_standard_stream_error_handler();
Serhiy Storchakafc435112016-04-10 14:34:13 +03001872 }
Nick Coghland6009512014-11-20 21:39:37 +10001873 }
1874
1875 /* Set sys.stdin */
1876 fd = fileno(stdin);
1877 /* Under some conditions stdin, stdout and stderr may not be connected
1878 * and fileno() may point to an invalid file descriptor. For example
1879 * GUI apps don't have valid standard streams by default.
1880 */
Victor Stinner874dbe82015-09-04 17:29:57 +02001881 std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
1882 if (std == NULL)
1883 goto error;
Nick Coghland6009512014-11-20 21:39:37 +10001884 PySys_SetObject("__stdin__", std);
1885 _PySys_SetObjectId(&PyId_stdin, std);
1886 Py_DECREF(std);
1887
1888 /* Set sys.stdout */
1889 fd = fileno(stdout);
Victor Stinner874dbe82015-09-04 17:29:57 +02001890 std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors);
1891 if (std == NULL)
1892 goto error;
Nick Coghland6009512014-11-20 21:39:37 +10001893 PySys_SetObject("__stdout__", std);
1894 _PySys_SetObjectId(&PyId_stdout, std);
1895 Py_DECREF(std);
1896
1897#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
1898 /* Set sys.stderr, replaces the preliminary stderr */
1899 fd = fileno(stderr);
Victor Stinner874dbe82015-09-04 17:29:57 +02001900 std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace");
1901 if (std == NULL)
1902 goto error;
Nick Coghland6009512014-11-20 21:39:37 +10001903
1904 /* Same as hack above, pre-import stderr's codec to avoid recursion
1905 when import.c tries to write to stderr in verbose mode. */
1906 encoding_attr = PyObject_GetAttrString(std, "encoding");
1907 if (encoding_attr != NULL) {
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001908 const char *std_encoding = PyUnicode_AsUTF8(encoding_attr);
Nick Coghland6009512014-11-20 21:39:37 +10001909 if (std_encoding != NULL) {
1910 PyObject *codec_info = _PyCodec_Lookup(std_encoding);
1911 Py_XDECREF(codec_info);
1912 }
1913 Py_DECREF(encoding_attr);
1914 }
1915 PyErr_Clear(); /* Not a fatal error if codec isn't available */
1916
1917 if (PySys_SetObject("__stderr__", std) < 0) {
1918 Py_DECREF(std);
1919 goto error;
1920 }
1921 if (_PySys_SetObjectId(&PyId_stderr, std) < 0) {
1922 Py_DECREF(std);
1923 goto error;
1924 }
1925 Py_DECREF(std);
1926#endif
1927
Victor Stinnera7368ac2017-11-15 18:11:45 -08001928 goto done;
Nick Coghland6009512014-11-20 21:39:37 +10001929
Victor Stinnera7368ac2017-11-15 18:11:45 -08001930error:
1931 res = _Py_INIT_ERR("can't initialize sys standard streams");
1932
Victor Stinner31e99082017-12-20 23:41:38 +01001933 /* Use the same allocator than Py_SetStandardStreamEncoding() */
1934 PyMemAllocatorEx old_alloc;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001935done:
Victor Stinner31e99082017-12-20 23:41:38 +01001936 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1937
Nick Coghland6009512014-11-20 21:39:37 +10001938 /* We won't need them anymore. */
1939 if (_Py_StandardStreamEncoding) {
1940 PyMem_RawFree(_Py_StandardStreamEncoding);
1941 _Py_StandardStreamEncoding = NULL;
1942 }
1943 if (_Py_StandardStreamErrors) {
1944 PyMem_RawFree(_Py_StandardStreamErrors);
1945 _Py_StandardStreamErrors = NULL;
1946 }
Victor Stinner31e99082017-12-20 23:41:38 +01001947
1948 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1949
Nick Coghland6009512014-11-20 21:39:37 +10001950 PyMem_Free(pythonioencoding);
1951 Py_XDECREF(bimod);
1952 Py_XDECREF(iomod);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001953 return res;
Nick Coghland6009512014-11-20 21:39:37 +10001954}
1955
1956
Victor Stinner10dc4842015-03-24 12:01:30 +01001957static void
Victor Stinner791da1c2016-03-14 16:53:12 +01001958_Py_FatalError_DumpTracebacks(int fd)
Victor Stinner10dc4842015-03-24 12:01:30 +01001959{
Victor Stinner10dc4842015-03-24 12:01:30 +01001960 fputc('\n', stderr);
1961 fflush(stderr);
1962
1963 /* display the current Python stack */
Victor Stinner861d9ab2016-03-16 22:45:24 +01001964 _Py_DumpTracebackThreads(fd, NULL, NULL);
Victor Stinner10dc4842015-03-24 12:01:30 +01001965}
Victor Stinner791da1c2016-03-14 16:53:12 +01001966
1967/* Print the current exception (if an exception is set) with its traceback,
1968 or display the current Python stack.
1969
1970 Don't call PyErr_PrintEx() and the except hook, because Py_FatalError() is
1971 called on catastrophic cases.
1972
1973 Return 1 if the traceback was displayed, 0 otherwise. */
1974
1975static int
1976_Py_FatalError_PrintExc(int fd)
1977{
1978 PyObject *ferr, *res;
1979 PyObject *exception, *v, *tb;
1980 int has_tb;
1981
1982 if (PyThreadState_GET() == NULL) {
1983 /* The GIL is released: trying to acquire it is likely to deadlock,
1984 just give up. */
1985 return 0;
1986 }
1987
1988 PyErr_Fetch(&exception, &v, &tb);
1989 if (exception == NULL) {
1990 /* No current exception */
1991 return 0;
1992 }
1993
1994 ferr = _PySys_GetObjectId(&PyId_stderr);
1995 if (ferr == NULL || ferr == Py_None) {
1996 /* sys.stderr is not set yet or set to None,
1997 no need to try to display the exception */
1998 return 0;
1999 }
2000
2001 PyErr_NormalizeException(&exception, &v, &tb);
2002 if (tb == NULL) {
2003 tb = Py_None;
2004 Py_INCREF(tb);
2005 }
2006 PyException_SetTraceback(v, tb);
2007 if (exception == NULL) {
2008 /* PyErr_NormalizeException() failed */
2009 return 0;
2010 }
2011
2012 has_tb = (tb != Py_None);
2013 PyErr_Display(exception, v, tb);
2014 Py_XDECREF(exception);
2015 Py_XDECREF(v);
2016 Py_XDECREF(tb);
2017
2018 /* sys.stderr may be buffered: call sys.stderr.flush() */
Victor Stinner3466bde2016-09-05 18:16:01 -07002019 res = _PyObject_CallMethodId(ferr, &PyId_flush, NULL);
Victor Stinner791da1c2016-03-14 16:53:12 +01002020 if (res == NULL)
2021 PyErr_Clear();
2022 else
2023 Py_DECREF(res);
2024
2025 return has_tb;
2026}
2027
Nick Coghland6009512014-11-20 21:39:37 +10002028/* Print fatal error message and abort */
2029
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002030#ifdef MS_WINDOWS
2031static void
2032fatal_output_debug(const char *msg)
2033{
2034 /* buffer of 256 bytes allocated on the stack */
2035 WCHAR buffer[256 / sizeof(WCHAR)];
2036 size_t buflen = Py_ARRAY_LENGTH(buffer) - 1;
2037 size_t msglen;
2038
2039 OutputDebugStringW(L"Fatal Python error: ");
2040
2041 msglen = strlen(msg);
2042 while (msglen) {
2043 size_t i;
2044
2045 if (buflen > msglen) {
2046 buflen = msglen;
2047 }
2048
2049 /* Convert the message to wchar_t. This uses a simple one-to-one
2050 conversion, assuming that the this error message actually uses
2051 ASCII only. If this ceases to be true, we will have to convert. */
2052 for (i=0; i < buflen; ++i) {
2053 buffer[i] = msg[i];
2054 }
2055 buffer[i] = L'\0';
2056 OutputDebugStringW(buffer);
2057
2058 msg += buflen;
2059 msglen -= buflen;
2060 }
2061 OutputDebugStringW(L"\n");
2062}
2063#endif
2064
Benjamin Petersoncef88b92017-11-25 13:02:55 -08002065static void _Py_NO_RETURN
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002066fatal_error(const char *prefix, const char *msg, int status)
Nick Coghland6009512014-11-20 21:39:37 +10002067{
2068 const int fd = fileno(stderr);
Victor Stinner53345a42015-03-25 01:55:14 +01002069 static int reentrant = 0;
Victor Stinner53345a42015-03-25 01:55:14 +01002070
2071 if (reentrant) {
2072 /* Py_FatalError() caused a second fatal error.
2073 Example: flush_std_files() raises a recursion error. */
2074 goto exit;
2075 }
2076 reentrant = 1;
Nick Coghland6009512014-11-20 21:39:37 +10002077
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002078 fprintf(stderr, "Fatal Python error: ");
2079 if (prefix) {
2080 fputs(prefix, stderr);
2081 fputs(": ", stderr);
2082 }
2083 if (msg) {
2084 fputs(msg, stderr);
2085 }
2086 else {
2087 fprintf(stderr, "<message not set>");
2088 }
2089 fputs("\n", stderr);
Nick Coghland6009512014-11-20 21:39:37 +10002090 fflush(stderr); /* it helps in Windows debug build */
Victor Stinner10dc4842015-03-24 12:01:30 +01002091
Victor Stinnere0deff32015-03-24 13:46:18 +01002092 /* Print the exception (if an exception is set) with its traceback,
2093 * or display the current Python stack. */
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002094 if (!_Py_FatalError_PrintExc(fd)) {
Victor Stinner791da1c2016-03-14 16:53:12 +01002095 _Py_FatalError_DumpTracebacks(fd);
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002096 }
Victor Stinner10dc4842015-03-24 12:01:30 +01002097
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002098 /* The main purpose of faulthandler is to display the traceback.
2099 This function already did its best to display a traceback.
2100 Disable faulthandler to prevent writing a second traceback
2101 on abort(). */
Victor Stinner2025d782016-03-16 23:19:15 +01002102 _PyFaulthandler_Fini();
2103
Victor Stinner791da1c2016-03-14 16:53:12 +01002104 /* Check if the current Python thread hold the GIL */
2105 if (PyThreadState_GET() != NULL) {
2106 /* Flush sys.stdout and sys.stderr */
2107 flush_std_files();
2108 }
Victor Stinnere0deff32015-03-24 13:46:18 +01002109
Nick Coghland6009512014-11-20 21:39:37 +10002110#ifdef MS_WINDOWS
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002111 fatal_output_debug(msg);
Victor Stinner53345a42015-03-25 01:55:14 +01002112#endif /* MS_WINDOWS */
2113
2114exit:
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002115 if (status < 0) {
Victor Stinner53345a42015-03-25 01:55:14 +01002116#if defined(MS_WINDOWS) && defined(_DEBUG)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002117 DebugBreak();
Nick Coghland6009512014-11-20 21:39:37 +10002118#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002119 abort();
2120 }
2121 else {
2122 exit(status);
2123 }
2124}
2125
Victor Stinner19760862017-12-20 01:41:59 +01002126void _Py_NO_RETURN
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002127Py_FatalError(const char *msg)
2128{
2129 fatal_error(NULL, msg, -1);
2130}
2131
Victor Stinner19760862017-12-20 01:41:59 +01002132void _Py_NO_RETURN
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002133_Py_FatalInitError(_PyInitError err)
2134{
2135 /* On "user" error: exit with status 1.
2136 For all other errors, call abort(). */
2137 int status = err.user_err ? 1 : -1;
2138 fatal_error(err.prefix, err.msg, status);
Nick Coghland6009512014-11-20 21:39:37 +10002139}
2140
2141/* Clean up and exit */
2142
Victor Stinnerd7292b52016-06-17 12:29:00 +02002143# include "pythread.h"
Nick Coghland6009512014-11-20 21:39:37 +10002144
Nick Coghland6009512014-11-20 21:39:37 +10002145/* For the atexit module. */
Marcel Plch776407f2017-12-20 11:17:58 +01002146void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module)
Nick Coghland6009512014-11-20 21:39:37 +10002147{
Marcel Plch776407f2017-12-20 11:17:58 +01002148 PyThreadState *ts;
2149 PyInterpreterState *is;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002150
Marcel Plch776407f2017-12-20 11:17:58 +01002151 ts = PyThreadState_GET();
2152 is = ts->interp;
2153
Antoine Pitroufc5db952017-12-13 02:29:07 +01002154 /* Guard against API misuse (see bpo-17852) */
Marcel Plch776407f2017-12-20 11:17:58 +01002155 assert(is->pyexitfunc == NULL || is->pyexitfunc == func);
2156
2157 is->pyexitfunc = func;
2158 is->pyexitmodule = module;
Nick Coghland6009512014-11-20 21:39:37 +10002159}
2160
2161static void
Marcel Plch776407f2017-12-20 11:17:58 +01002162call_py_exitfuncs(PyInterpreterState *istate)
Nick Coghland6009512014-11-20 21:39:37 +10002163{
Marcel Plch776407f2017-12-20 11:17:58 +01002164 if (istate->pyexitfunc == NULL)
Nick Coghland6009512014-11-20 21:39:37 +10002165 return;
2166
Marcel Plch776407f2017-12-20 11:17:58 +01002167 (*istate->pyexitfunc)(istate->pyexitmodule);
Nick Coghland6009512014-11-20 21:39:37 +10002168 PyErr_Clear();
2169}
2170
2171/* Wait until threading._shutdown completes, provided
2172 the threading module was imported in the first place.
2173 The shutdown routine will wait until all non-daemon
2174 "threading" threads have completed. */
2175static void
2176wait_for_thread_shutdown(void)
2177{
Nick Coghland6009512014-11-20 21:39:37 +10002178 _Py_IDENTIFIER(_shutdown);
2179 PyObject *result;
Eric Snow3f9eee62017-09-15 16:35:20 -06002180 PyObject *threading = _PyImport_GetModuleId(&PyId_threading);
Nick Coghland6009512014-11-20 21:39:37 +10002181 if (threading == NULL) {
2182 /* threading not imported */
2183 PyErr_Clear();
2184 return;
2185 }
Victor Stinner3466bde2016-09-05 18:16:01 -07002186 result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL);
Nick Coghland6009512014-11-20 21:39:37 +10002187 if (result == NULL) {
2188 PyErr_WriteUnraisable(threading);
2189 }
2190 else {
2191 Py_DECREF(result);
2192 }
2193 Py_DECREF(threading);
Nick Coghland6009512014-11-20 21:39:37 +10002194}
2195
2196#define NEXITFUNCS 32
Nick Coghland6009512014-11-20 21:39:37 +10002197int Py_AtExit(void (*func)(void))
2198{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002199 if (_PyRuntime.nexitfuncs >= NEXITFUNCS)
Nick Coghland6009512014-11-20 21:39:37 +10002200 return -1;
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002201 _PyRuntime.exitfuncs[_PyRuntime.nexitfuncs++] = func;
Nick Coghland6009512014-11-20 21:39:37 +10002202 return 0;
2203}
2204
2205static void
2206call_ll_exitfuncs(void)
2207{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002208 while (_PyRuntime.nexitfuncs > 0)
2209 (*_PyRuntime.exitfuncs[--_PyRuntime.nexitfuncs])();
Nick Coghland6009512014-11-20 21:39:37 +10002210
2211 fflush(stdout);
2212 fflush(stderr);
2213}
2214
2215void
2216Py_Exit(int sts)
2217{
Martin Panterb4ce1fc2015-11-30 03:18:29 +00002218 if (Py_FinalizeEx() < 0) {
2219 sts = 120;
2220 }
Nick Coghland6009512014-11-20 21:39:37 +10002221
2222 exit(sts);
2223}
2224
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002225static _PyInitError
Nick Coghland6009512014-11-20 21:39:37 +10002226initsigs(void)
2227{
2228#ifdef SIGPIPE
2229 PyOS_setsig(SIGPIPE, SIG_IGN);
2230#endif
2231#ifdef SIGXFZ
2232 PyOS_setsig(SIGXFZ, SIG_IGN);
2233#endif
2234#ifdef SIGXFSZ
2235 PyOS_setsig(SIGXFSZ, SIG_IGN);
2236#endif
2237 PyOS_InitInterrupts(); /* May imply initsignal() */
2238 if (PyErr_Occurred()) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002239 return _Py_INIT_ERR("can't import signal");
Nick Coghland6009512014-11-20 21:39:37 +10002240 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002241 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10002242}
2243
2244
2245/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
2246 *
2247 * All of the code in this function must only use async-signal-safe functions,
2248 * listed at `man 7 signal` or
2249 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2250 */
2251void
2252_Py_RestoreSignals(void)
2253{
2254#ifdef SIGPIPE
2255 PyOS_setsig(SIGPIPE, SIG_DFL);
2256#endif
2257#ifdef SIGXFZ
2258 PyOS_setsig(SIGXFZ, SIG_DFL);
2259#endif
2260#ifdef SIGXFSZ
2261 PyOS_setsig(SIGXFSZ, SIG_DFL);
2262#endif
2263}
2264
2265
2266/*
2267 * The file descriptor fd is considered ``interactive'' if either
2268 * a) isatty(fd) is TRUE, or
2269 * b) the -i flag was given, and the filename associated with
2270 * the descriptor is NULL or "<stdin>" or "???".
2271 */
2272int
2273Py_FdIsInteractive(FILE *fp, const char *filename)
2274{
2275 if (isatty((int)fileno(fp)))
2276 return 1;
2277 if (!Py_InteractiveFlag)
2278 return 0;
2279 return (filename == NULL) ||
2280 (strcmp(filename, "<stdin>") == 0) ||
2281 (strcmp(filename, "???") == 0);
2282}
2283
2284
Nick Coghland6009512014-11-20 21:39:37 +10002285/* Wrappers around sigaction() or signal(). */
2286
2287PyOS_sighandler_t
2288PyOS_getsig(int sig)
2289{
2290#ifdef HAVE_SIGACTION
2291 struct sigaction context;
2292 if (sigaction(sig, NULL, &context) == -1)
2293 return SIG_ERR;
2294 return context.sa_handler;
2295#else
2296 PyOS_sighandler_t handler;
2297/* Special signal handling for the secure CRT in Visual Studio 2005 */
2298#if defined(_MSC_VER) && _MSC_VER >= 1400
2299 switch (sig) {
2300 /* Only these signals are valid */
2301 case SIGINT:
2302 case SIGILL:
2303 case SIGFPE:
2304 case SIGSEGV:
2305 case SIGTERM:
2306 case SIGBREAK:
2307 case SIGABRT:
2308 break;
2309 /* Don't call signal() with other values or it will assert */
2310 default:
2311 return SIG_ERR;
2312 }
2313#endif /* _MSC_VER && _MSC_VER >= 1400 */
2314 handler = signal(sig, SIG_IGN);
2315 if (handler != SIG_ERR)
2316 signal(sig, handler);
2317 return handler;
2318#endif
2319}
2320
2321/*
2322 * All of the code in this function must only use async-signal-safe functions,
2323 * listed at `man 7 signal` or
2324 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2325 */
2326PyOS_sighandler_t
2327PyOS_setsig(int sig, PyOS_sighandler_t handler)
2328{
2329#ifdef HAVE_SIGACTION
2330 /* Some code in Modules/signalmodule.c depends on sigaction() being
2331 * used here if HAVE_SIGACTION is defined. Fix that if this code
2332 * changes to invalidate that assumption.
2333 */
2334 struct sigaction context, ocontext;
2335 context.sa_handler = handler;
2336 sigemptyset(&context.sa_mask);
2337 context.sa_flags = 0;
2338 if (sigaction(sig, &context, &ocontext) == -1)
2339 return SIG_ERR;
2340 return ocontext.sa_handler;
2341#else
2342 PyOS_sighandler_t oldhandler;
2343 oldhandler = signal(sig, handler);
2344#ifdef HAVE_SIGINTERRUPT
2345 siginterrupt(sig, 1);
2346#endif
2347 return oldhandler;
2348#endif
2349}
2350
2351#ifdef __cplusplus
2352}
2353#endif