blob: fc4ee06f144f3aa05ec862c84d2de95cd71435b4 [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
570 Every call to Py_InitializeCore, Py_Initialize or Py_InitializeEx
571 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 Stinner0c90d6f2018-08-05 12:31:59 +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 return _Py_INIT_OK();
597}
598
599
Eric Snow1abcf672017-05-23 21:46:51 -0700600/* Begin interpreter initialization
601 *
602 * On return, the first thread and interpreter state have been created,
603 * but the compiler, signal handling, multithreading and
604 * multiple interpreter support, and codec infrastructure are not yet
605 * available.
606 *
607 * The import system will support builtin and frozen modules only.
608 * The only supported io is writing to sys.stderr
609 *
610 * If any operation invoked by this function fails, a fatal error is
611 * issued and the function does not return.
612 *
613 * Any code invoked from this function should *not* assume it has access
614 * to the Python C API (unless the API is explicitly listed as being
615 * safe to call without calling Py_Initialize first)
616 */
617
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800618_PyInitError
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200619_Py_InitializeCore_impl(PyInterpreterState **interp_p,
620 const _PyCoreConfig *core_config)
Nick Coghland6009512014-11-20 21:39:37 +1000621{
622 PyInterpreterState *interp;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800623 _PyInitError err;
Nick Coghland6009512014-11-20 21:39:37 +1000624
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200625 /* bpo-34008: For backward compatibility reasons, calling Py_Main() after
626 Py_Initialize() ignores the new configuration. */
627 if (_PyRuntime.core_initialized) {
628 PyThreadState *tstate = PyThreadState_GET();
629 if (!tstate) {
630 return _Py_INIT_ERR("no thread state found");
631 }
632
633 interp = tstate->interp;
634 if (interp == NULL) {
635 return _Py_INIT_ERR("no main interpreter found");
636 }
637 *interp_p = interp;
638
639 return _Py_Initialize_ReconfigureCore(interp, core_config);
640 }
641
642
643 _PyCoreConfig_SetGlobalConfig(core_config);
644
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800645 err = _PyRuntime_Initialize();
646 if (_Py_INIT_FAILED(err)) {
647 return err;
648 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600649
Victor Stinner31e99082017-12-20 23:41:38 +0100650 if (core_config->allocator != NULL) {
651 if (_PyMem_SetupAllocators(core_config->allocator) < 0) {
652 return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator");
653 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800654 }
655
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600656 if (_PyRuntime.initialized) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800657 return _Py_INIT_ERR("main interpreter already initialized");
Eric Snow1abcf672017-05-23 21:46:51 -0700658 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600659 if (_PyRuntime.core_initialized) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800660 return _Py_INIT_ERR("runtime core already initialized");
Eric Snow1abcf672017-05-23 21:46:51 -0700661 }
662
663 /* Py_Finalize leaves _Py_Finalizing set in order to help daemon
664 * threads behave a little more gracefully at interpreter shutdown.
665 * We clobber it here so the new interpreter can start with a clean
666 * slate.
667 *
668 * However, this may still lead to misbehaviour if there are daemon
669 * threads still hanging around from a previous Py_Initialize/Finalize
670 * pair :(
671 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600672 _PyRuntime.finalizing = NULL;
673
Nick Coghlan6ea41862017-06-11 13:16:15 +1000674#ifndef MS_WINDOWS
Victor Stinner94540602017-12-16 04:54:22 +0100675 _emit_stderr_warning_for_legacy_locale(core_config);
Nick Coghlan6ea41862017-06-11 13:16:15 +1000676#endif
Nick Coghland6009512014-11-20 21:39:37 +1000677
Victor Stinnerda273412017-12-15 01:46:02 +0100678 err = _Py_HashRandomization_Init(core_config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800679 if (_Py_INIT_FAILED(err)) {
680 return err;
681 }
682
Victor Stinnerda273412017-12-15 01:46:02 +0100683 if (!core_config->use_hash_seed || core_config->hash_seed) {
Eric Snow1abcf672017-05-23 21:46:51 -0700684 /* Random or non-zero hash seed */
685 Py_HashRandomizationFlag = 1;
686 }
Nick Coghland6009512014-11-20 21:39:37 +1000687
Victor Stinnera7368ac2017-11-15 18:11:45 -0800688 err = _PyInterpreterState_Enable(&_PyRuntime);
689 if (_Py_INIT_FAILED(err)) {
690 return err;
691 }
692
Nick Coghland6009512014-11-20 21:39:37 +1000693 interp = PyInterpreterState_New();
Victor Stinnerda273412017-12-15 01:46:02 +0100694 if (interp == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800695 return _Py_INIT_ERR("can't make main interpreter");
Victor Stinnerda273412017-12-15 01:46:02 +0100696 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200697 *interp_p = interp;
Victor Stinnerda273412017-12-15 01:46:02 +0100698
699 if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
700 return _Py_INIT_ERR("failed to copy core config");
701 }
Nick Coghland6009512014-11-20 21:39:37 +1000702
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200703 PyThreadState *tstate = PyThreadState_New(interp);
Nick Coghland6009512014-11-20 21:39:37 +1000704 if (tstate == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800705 return _Py_INIT_ERR("can't make first thread");
Nick Coghland6009512014-11-20 21:39:37 +1000706 (void) PyThreadState_Swap(tstate);
707
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000708 /* We can't call _PyEval_FiniThreads() in Py_FinalizeEx because
Nick Coghland6009512014-11-20 21:39:37 +1000709 destroying the GIL might fail when it is being referenced from
710 another running thread (see issue #9901).
711 Instead we destroy the previously created GIL here, which ensures
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000712 that we can call Py_Initialize / Py_FinalizeEx multiple times. */
Nick Coghland6009512014-11-20 21:39:37 +1000713 _PyEval_FiniThreads();
Victor Stinner2914bb32018-01-29 11:57:45 +0100714
Nick Coghland6009512014-11-20 21:39:37 +1000715 /* Auto-thread-state API */
716 _PyGILState_Init(interp, tstate);
Nick Coghland6009512014-11-20 21:39:37 +1000717
Victor Stinner2914bb32018-01-29 11:57:45 +0100718 /* Create the GIL */
719 PyEval_InitThreads();
720
Nick Coghland6009512014-11-20 21:39:37 +1000721 _Py_ReadyTypes();
722
723 if (!_PyFrame_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800724 return _Py_INIT_ERR("can't init frames");
Nick Coghland6009512014-11-20 21:39:37 +1000725
726 if (!_PyLong_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800727 return _Py_INIT_ERR("can't init longs");
Nick Coghland6009512014-11-20 21:39:37 +1000728
729 if (!PyByteArray_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800730 return _Py_INIT_ERR("can't init bytearray");
Nick Coghland6009512014-11-20 21:39:37 +1000731
732 if (!_PyFloat_Init())
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800733 return _Py_INIT_ERR("can't init float");
Nick Coghland6009512014-11-20 21:39:37 +1000734
Eric Snowd393c1b2017-09-14 12:18:12 -0600735 PyObject *modules = PyDict_New();
736 if (modules == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800737 return _Py_INIT_ERR("can't make modules dictionary");
Eric Snowd393c1b2017-09-14 12:18:12 -0600738 interp->modules = modules;
739
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200740 PyObject *sysmod;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800741 err = _PySys_BeginInit(&sysmod);
742 if (_Py_INIT_FAILED(err)) {
743 return err;
744 }
745
Eric Snowd393c1b2017-09-14 12:18:12 -0600746 interp->sysdict = PyModule_GetDict(sysmod);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800747 if (interp->sysdict == NULL) {
748 return _Py_INIT_ERR("can't initialize sys dict");
749 }
750
Eric Snowd393c1b2017-09-14 12:18:12 -0600751 Py_INCREF(interp->sysdict);
752 PyDict_SetItemString(interp->sysdict, "modules", modules);
753 _PyImport_FixupBuiltin(sysmod, "sys", modules);
Nick Coghland6009512014-11-20 21:39:37 +1000754
755 /* Init Unicode implementation; relies on the codec registry */
756 if (_PyUnicode_Init() < 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800757 return _Py_INIT_ERR("can't initialize unicode");
Eric Snow1abcf672017-05-23 21:46:51 -0700758
Nick Coghland6009512014-11-20 21:39:37 +1000759 if (_PyStructSequence_Init() < 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800760 return _Py_INIT_ERR("can't initialize structseq");
Nick Coghland6009512014-11-20 21:39:37 +1000761
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200762 PyObject *bimod = _PyBuiltin_Init();
Nick Coghland6009512014-11-20 21:39:37 +1000763 if (bimod == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800764 return _Py_INIT_ERR("can't initialize builtins modules");
Eric Snowd393c1b2017-09-14 12:18:12 -0600765 _PyImport_FixupBuiltin(bimod, "builtins", modules);
Nick Coghland6009512014-11-20 21:39:37 +1000766 interp->builtins = PyModule_GetDict(bimod);
767 if (interp->builtins == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800768 return _Py_INIT_ERR("can't initialize builtins dict");
Nick Coghland6009512014-11-20 21:39:37 +1000769 Py_INCREF(interp->builtins);
770
771 /* initialize builtin exceptions */
772 _PyExc_Init(bimod);
773
Nick Coghland6009512014-11-20 21:39:37 +1000774 /* Set up a preliminary stderr printer until we have enough
775 infrastructure for the io module in place. */
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200776 PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
Nick Coghland6009512014-11-20 21:39:37 +1000777 if (pstderr == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800778 return _Py_INIT_ERR("can't set preliminary stderr");
Nick Coghland6009512014-11-20 21:39:37 +1000779 _PySys_SetObjectId(&PyId_stderr, pstderr);
780 PySys_SetObject("__stderr__", pstderr);
781 Py_DECREF(pstderr);
782
Victor Stinner672b6ba2017-12-06 17:25:50 +0100783 err = _PyImport_Init(interp);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800784 if (_Py_INIT_FAILED(err)) {
785 return err;
786 }
Nick Coghland6009512014-11-20 21:39:37 +1000787
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800788 err = _PyImportHooks_Init();
789 if (_Py_INIT_FAILED(err)) {
790 return err;
791 }
Nick Coghland6009512014-11-20 21:39:37 +1000792
793 /* Initialize _warnings. */
Victor Stinner5d862462017-12-19 11:35:58 +0100794 if (_PyWarnings_Init() == NULL) {
Victor Stinner1f151112017-11-23 10:43:14 +0100795 return _Py_INIT_ERR("can't initialize warnings");
796 }
Nick Coghland6009512014-11-20 21:39:37 +1000797
Yury Selivanovf23746a2018-01-22 19:11:18 -0500798 if (!_PyContext_Init())
799 return _Py_INIT_ERR("can't init context");
800
Eric Snow1abcf672017-05-23 21:46:51 -0700801 /* This call sets up builtin and frozen import support */
802 if (!interp->core_config._disable_importlib) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800803 err = initimport(interp, sysmod);
804 if (_Py_INIT_FAILED(err)) {
805 return err;
806 }
Eric Snow1abcf672017-05-23 21:46:51 -0700807 }
808
809 /* Only when we get here is the runtime core fully initialized */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600810 _PyRuntime.core_initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800811 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -0700812}
813
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200814
815_PyInitError
816_Py_InitializeCore(PyInterpreterState **interp_p,
817 const _PyCoreConfig *src_config)
818{
819 assert(src_config != NULL);
820
821 PyMemAllocatorEx old_alloc;
822 _PyInitError err;
823
824 /* Copy the configuration, since _PyCoreConfig_Read() modifies it
825 (and the input configuration is read only). */
826 _PyCoreConfig config = _PyCoreConfig_INIT;
827
Victor Stinner98c49c62018-08-29 01:13:29 +0200828#ifndef MS_WINDOWS
829 /* Set up the LC_CTYPE locale, so we can obtain the locale's charset
830 without having to switch locales. */
831 _Py_SetLocaleFromEnv(LC_CTYPE);
832#endif
833
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200834 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
835 if (_PyCoreConfig_Copy(&config, src_config) >= 0) {
836 err = _PyCoreConfig_Read(&config);
837 }
838 else {
839 err = _Py_INIT_ERR("failed to copy core config");
840 }
841 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
842
843 if (_Py_INIT_FAILED(err)) {
844 goto done;
845 }
846
847 err = _Py_InitializeCore_impl(interp_p, &config);
848
849done:
850 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
851 _PyCoreConfig_Clear(&config);
852 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
853
854 return err;
855}
856
Miss Islington (bot)03ec4df2018-07-20 17:16:22 -0700857/* Py_Initialize() has already been called: update the main interpreter
858 configuration. Example of bpo-34008: Py_Main() called after
859 Py_Initialize(). */
860static _PyInitError
861_Py_ReconfigureMainInterpreter(PyInterpreterState *interp,
862 const _PyMainInterpreterConfig *config)
863{
864 if (config->argv != NULL) {
865 int res = PyDict_SetItemString(interp->sysdict, "argv", config->argv);
866 if (res < 0) {
867 return _Py_INIT_ERR("fail to set sys.argv");
868 }
869 }
870 return _Py_INIT_OK();
871}
872
Eric Snowc7ec9982017-05-23 23:00:52 -0700873/* Update interpreter state based on supplied configuration settings
874 *
875 * After calling this function, most of the restrictions on the interpreter
876 * are lifted. The only remaining incomplete settings are those related
877 * to the main module (sys.argv[0], __main__ metadata)
878 *
879 * Calling this when the interpreter is not initializing, is already
880 * initialized or without a valid current thread state is a fatal error.
881 * Other errors should be reported as normal Python exceptions with a
882 * non-zero return code.
883 */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800884_PyInitError
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200885_Py_InitializeMainInterpreter(PyInterpreterState *interp,
886 const _PyMainInterpreterConfig *config)
Eric Snow1abcf672017-05-23 21:46:51 -0700887{
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800888 _PyInitError err;
Eric Snow1abcf672017-05-23 21:46:51 -0700889
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600890 if (!_PyRuntime.core_initialized) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800891 return _Py_INIT_ERR("runtime core not initialized");
Eric Snowc7ec9982017-05-23 23:00:52 -0700892 }
Eric Snowc7ec9982017-05-23 23:00:52 -0700893
Eric Snow1abcf672017-05-23 21:46:51 -0700894 /* Now finish configuring the main interpreter */
Victor Stinnerda273412017-12-15 01:46:02 +0100895 if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) {
896 return _Py_INIT_ERR("failed to copy main interpreter config");
897 }
Eric Snowc7ec9982017-05-23 23:00:52 -0700898
Miss Islington (bot)03ec4df2018-07-20 17:16:22 -0700899 if (_PyRuntime.initialized) {
900 return _Py_ReconfigureMainInterpreter(interp, config);
901 }
902
Eric Snow1abcf672017-05-23 21:46:51 -0700903 if (interp->core_config._disable_importlib) {
904 /* Special mode for freeze_importlib: run with no import system
905 *
906 * This means anything which needs support from extension modules
907 * or pure Python code in the standard library won't work.
908 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600909 _PyRuntime.initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800910 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -0700911 }
Victor Stinner9316ee42017-11-25 03:17:57 +0100912
Victor Stinner33c377e2017-12-05 15:12:41 +0100913 if (_PyTime_Init() < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800914 return _Py_INIT_ERR("can't initialize time");
Victor Stinner33c377e2017-12-05 15:12:41 +0100915 }
Victor Stinner13019fd2015-04-03 13:10:54 +0200916
Victor Stinner41264f12017-12-15 02:05:29 +0100917 if (_PySys_EndInit(interp->sysdict, &interp->config) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800918 return _Py_INIT_ERR("can't finish initializing sys");
Victor Stinnerda273412017-12-15 01:46:02 +0100919 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800920
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800921 err = initexternalimport(interp);
922 if (_Py_INIT_FAILED(err)) {
923 return err;
924 }
Nick Coghland6009512014-11-20 21:39:37 +1000925
926 /* initialize the faulthandler module */
Victor Stinnera7368ac2017-11-15 18:11:45 -0800927 err = _PyFaulthandler_Init(interp->core_config.faulthandler);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800928 if (_Py_INIT_FAILED(err)) {
929 return err;
930 }
Nick Coghland6009512014-11-20 21:39:37 +1000931
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800932 err = initfsencoding(interp);
933 if (_Py_INIT_FAILED(err)) {
934 return err;
935 }
Nick Coghland6009512014-11-20 21:39:37 +1000936
Victor Stinner1f151112017-11-23 10:43:14 +0100937 if (interp->config.install_signal_handlers) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800938 err = initsigs(); /* Signal handling stuff, including initintr() */
939 if (_Py_INIT_FAILED(err)) {
940 return err;
941 }
942 }
Nick Coghland6009512014-11-20 21:39:37 +1000943
Victor Stinnera7368ac2017-11-15 18:11:45 -0800944 if (_PyTraceMalloc_Init(interp->core_config.tracemalloc) < 0)
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800945 return _Py_INIT_ERR("can't initialize tracemalloc");
Nick Coghland6009512014-11-20 21:39:37 +1000946
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800947 err = add_main_module(interp);
948 if (_Py_INIT_FAILED(err)) {
949 return err;
950 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800951
Victor Stinner91106cd2017-12-13 12:29:09 +0100952 err = init_sys_streams(interp);
Victor Stinnera7368ac2017-11-15 18:11:45 -0800953 if (_Py_INIT_FAILED(err)) {
954 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800955 }
Nick Coghland6009512014-11-20 21:39:37 +1000956
957 /* Initialize warnings. */
Victor Stinner5d862462017-12-19 11:35:58 +0100958 if (interp->config.warnoptions != NULL &&
959 PyList_Size(interp->config.warnoptions) > 0)
960 {
Nick Coghland6009512014-11-20 21:39:37 +1000961 PyObject *warnings_module = PyImport_ImportModule("warnings");
962 if (warnings_module == NULL) {
963 fprintf(stderr, "'import warnings' failed; traceback:\n");
964 PyErr_Print();
965 }
966 Py_XDECREF(warnings_module);
967 }
968
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600969 _PyRuntime.initialized = 1;
Eric Snow1abcf672017-05-23 21:46:51 -0700970
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800971 if (!Py_NoSiteFlag) {
972 err = initsite(); /* Module site */
973 if (_Py_INIT_FAILED(err)) {
974 return err;
975 }
976 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800977 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +1000978}
979
Eric Snowc7ec9982017-05-23 23:00:52 -0700980#undef _INIT_DEBUG_PRINT
981
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200982
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800983_PyInitError
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200984_Py_InitializeFromConfig(const _PyCoreConfig *config)
Eric Snow1abcf672017-05-23 21:46:51 -0700985{
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200986 _Py_Initialize_ReadEnvVarsNoAlloc();
Miss Islington (bot)3747dd12018-06-22 10:33:48 -0700987
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200988 PyInterpreterState *interp;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800989 _PyInitError err;
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200990 err = _Py_InitializeCore(&interp, config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800991 if (_Py_INIT_FAILED(err)) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200992 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800993 }
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200994 config = &interp->core_config;
Victor Stinnerbc8ac6b2017-11-30 18:03:55 +0100995
Victor Stinner9cfc0022017-12-20 19:36:46 +0100996 _PyMainInterpreterConfig main_config = _PyMainInterpreterConfig_INIT;
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200997 err = _PyMainInterpreterConfig_Read(&main_config, config);
Victor Stinner9cfc0022017-12-20 19:36:46 +0100998 if (!_Py_INIT_FAILED(err)) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +0200999 err = _Py_InitializeMainInterpreter(interp, &main_config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001000 }
Victor Stinner9cfc0022017-12-20 19:36:46 +01001001 _PyMainInterpreterConfig_Clear(&main_config);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001002 if (_Py_INIT_FAILED(err)) {
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001003 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001004 }
1005
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001006 return _Py_INIT_OK();
Eric Snow1abcf672017-05-23 21:46:51 -07001007}
1008
1009
1010void
Nick Coghland6009512014-11-20 21:39:37 +10001011Py_InitializeEx(int install_sigs)
1012{
Victor Stinner0c90d6f2018-08-05 12:31:59 +02001013 if (_PyRuntime.initialized) {
1014 /* bpo-33932: Calling Py_Initialize() twice does nothing. */
1015 return;
1016 }
1017
1018 _PyInitError err;
1019 _PyCoreConfig config = _PyCoreConfig_INIT;
1020 config.install_signal_handlers = install_sigs;
1021
1022 err = _Py_InitializeFromConfig(&config);
1023 _PyCoreConfig_Clear(&config);
1024
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001025 if (_Py_INIT_FAILED(err)) {
1026 _Py_FatalInitError(err);
1027 }
Nick Coghland6009512014-11-20 21:39:37 +10001028}
1029
1030void
1031Py_Initialize(void)
1032{
1033 Py_InitializeEx(1);
1034}
1035
1036
1037#ifdef COUNT_ALLOCS
1038extern void dump_counts(FILE*);
1039#endif
1040
1041/* Flush stdout and stderr */
1042
1043static int
1044file_is_closed(PyObject *fobj)
1045{
1046 int r;
1047 PyObject *tmp = PyObject_GetAttrString(fobj, "closed");
1048 if (tmp == NULL) {
1049 PyErr_Clear();
1050 return 0;
1051 }
1052 r = PyObject_IsTrue(tmp);
1053 Py_DECREF(tmp);
1054 if (r < 0)
1055 PyErr_Clear();
1056 return r > 0;
1057}
1058
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001059static int
Nick Coghland6009512014-11-20 21:39:37 +10001060flush_std_files(void)
1061{
1062 PyObject *fout = _PySys_GetObjectId(&PyId_stdout);
1063 PyObject *ferr = _PySys_GetObjectId(&PyId_stderr);
1064 PyObject *tmp;
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001065 int status = 0;
Nick Coghland6009512014-11-20 21:39:37 +10001066
1067 if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
Victor Stinner3466bde2016-09-05 18:16:01 -07001068 tmp = _PyObject_CallMethodId(fout, &PyId_flush, NULL);
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001069 if (tmp == NULL) {
Nick Coghland6009512014-11-20 21:39:37 +10001070 PyErr_WriteUnraisable(fout);
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001071 status = -1;
1072 }
Nick Coghland6009512014-11-20 21:39:37 +10001073 else
1074 Py_DECREF(tmp);
1075 }
1076
1077 if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
Victor Stinner3466bde2016-09-05 18:16:01 -07001078 tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL);
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001079 if (tmp == NULL) {
Nick Coghland6009512014-11-20 21:39:37 +10001080 PyErr_Clear();
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001081 status = -1;
1082 }
Nick Coghland6009512014-11-20 21:39:37 +10001083 else
1084 Py_DECREF(tmp);
1085 }
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001086
1087 return status;
Nick Coghland6009512014-11-20 21:39:37 +10001088}
1089
1090/* Undo the effect of Py_Initialize().
1091
1092 Beware: if multiple interpreter and/or thread states exist, these
1093 are not wiped out; only the current thread and interpreter state
1094 are deleted. But since everything else is deleted, those other
1095 interpreter and thread states should no longer be used.
1096
1097 (XXX We should do better, e.g. wipe out all interpreters and
1098 threads.)
1099
1100 Locking: as above.
1101
1102*/
1103
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001104int
1105Py_FinalizeEx(void)
Nick Coghland6009512014-11-20 21:39:37 +10001106{
1107 PyInterpreterState *interp;
1108 PyThreadState *tstate;
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001109 int status = 0;
Nick Coghland6009512014-11-20 21:39:37 +10001110
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001111 if (!_PyRuntime.initialized)
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001112 return status;
Nick Coghland6009512014-11-20 21:39:37 +10001113
1114 wait_for_thread_shutdown();
1115
Marcel Plch776407f2017-12-20 11:17:58 +01001116 /* Get current thread state and interpreter pointer */
1117 tstate = PyThreadState_GET();
1118 interp = tstate->interp;
1119
Nick Coghland6009512014-11-20 21:39:37 +10001120 /* The interpreter is still entirely intact at this point, and the
1121 * exit funcs may be relying on that. In particular, if some thread
1122 * or exit func is still waiting to do an import, the import machinery
1123 * expects Py_IsInitialized() to return true. So don't say the
1124 * interpreter is uninitialized until after the exit funcs have run.
1125 * Note that Threading.py uses an exit func to do a join on all the
1126 * threads created thru it, so this also protects pending imports in
1127 * the threads created via Threading.
1128 */
Nick Coghland6009512014-11-20 21:39:37 +10001129
Marcel Plch776407f2017-12-20 11:17:58 +01001130 call_py_exitfuncs(interp);
Nick Coghland6009512014-11-20 21:39:37 +10001131
Victor Stinnerda273412017-12-15 01:46:02 +01001132 /* Copy the core config, PyInterpreterState_Delete() free
1133 the core config memory */
Victor Stinner5d862462017-12-19 11:35:58 +01001134#ifdef Py_REF_DEBUG
Victor Stinnerda273412017-12-15 01:46:02 +01001135 int show_ref_count = interp->core_config.show_ref_count;
Victor Stinner5d862462017-12-19 11:35:58 +01001136#endif
1137#ifdef Py_TRACE_REFS
Victor Stinnerda273412017-12-15 01:46:02 +01001138 int dump_refs = interp->core_config.dump_refs;
Victor Stinner5d862462017-12-19 11:35:58 +01001139#endif
1140#ifdef WITH_PYMALLOC
Victor Stinnerda273412017-12-15 01:46:02 +01001141 int malloc_stats = interp->core_config.malloc_stats;
Victor Stinner5d862462017-12-19 11:35:58 +01001142#endif
Victor Stinner6bf992a2017-12-06 17:26:10 +01001143
Nick Coghland6009512014-11-20 21:39:37 +10001144 /* Remaining threads (e.g. daemon threads) will automatically exit
1145 after taking the GIL (in PyEval_RestoreThread()). */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001146 _PyRuntime.finalizing = tstate;
1147 _PyRuntime.initialized = 0;
1148 _PyRuntime.core_initialized = 0;
Nick Coghland6009512014-11-20 21:39:37 +10001149
Victor Stinnere0deff32015-03-24 13:46:18 +01001150 /* Flush sys.stdout and sys.stderr */
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001151 if (flush_std_files() < 0) {
1152 status = -1;
1153 }
Nick Coghland6009512014-11-20 21:39:37 +10001154
1155 /* Disable signal handling */
1156 PyOS_FiniInterrupts();
1157
1158 /* Collect garbage. This may call finalizers; it's nice to call these
1159 * before all modules are destroyed.
1160 * XXX If a __del__ or weakref callback is triggered here, and tries to
1161 * XXX import a module, bad things can happen, because Python no
1162 * XXX longer believes it's initialized.
1163 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
1164 * XXX is easy to provoke that way. I've also seen, e.g.,
1165 * XXX Exception exceptions.ImportError: 'No module named sha'
1166 * XXX in <function callback at 0x008F5718> ignored
1167 * XXX but I'm unclear on exactly how that one happens. In any case,
1168 * XXX I haven't seen a real-life report of either of these.
1169 */
Łukasz Langafef7e942016-09-09 21:47:46 -07001170 _PyGC_CollectIfEnabled();
Nick Coghland6009512014-11-20 21:39:37 +10001171#ifdef COUNT_ALLOCS
1172 /* With COUNT_ALLOCS, it helps to run GC multiple times:
1173 each collection might release some types from the type
1174 list, so they become garbage. */
Łukasz Langafef7e942016-09-09 21:47:46 -07001175 while (_PyGC_CollectIfEnabled() > 0)
Nick Coghland6009512014-11-20 21:39:37 +10001176 /* nothing */;
1177#endif
Eric Snowdae02762017-09-14 00:35:58 -07001178
Nick Coghland6009512014-11-20 21:39:37 +10001179 /* Destroy all modules */
1180 PyImport_Cleanup();
1181
Victor Stinnere0deff32015-03-24 13:46:18 +01001182 /* Flush sys.stdout and sys.stderr (again, in case more was printed) */
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001183 if (flush_std_files() < 0) {
1184 status = -1;
1185 }
Nick Coghland6009512014-11-20 21:39:37 +10001186
1187 /* Collect final garbage. This disposes of cycles created by
1188 * class definitions, for example.
1189 * XXX This is disabled because it caused too many problems. If
1190 * XXX a __del__ or weakref callback triggers here, Python code has
1191 * XXX a hard time running, because even the sys module has been
1192 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
1193 * XXX One symptom is a sequence of information-free messages
1194 * XXX coming from threads (if a __del__ or callback is invoked,
1195 * XXX other threads can execute too, and any exception they encounter
1196 * XXX triggers a comedy of errors as subsystem after subsystem
1197 * XXX fails to find what it *expects* to find in sys to help report
1198 * XXX the exception and consequent unexpected failures). I've also
1199 * XXX seen segfaults then, after adding print statements to the
1200 * XXX Python code getting called.
1201 */
1202#if 0
Łukasz Langafef7e942016-09-09 21:47:46 -07001203 _PyGC_CollectIfEnabled();
Nick Coghland6009512014-11-20 21:39:37 +10001204#endif
1205
1206 /* Disable tracemalloc after all Python objects have been destroyed,
1207 so it is possible to use tracemalloc in objects destructor. */
1208 _PyTraceMalloc_Fini();
1209
1210 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
1211 _PyImport_Fini();
1212
1213 /* Cleanup typeobject.c's internal caches. */
1214 _PyType_Fini();
1215
1216 /* unload faulthandler module */
1217 _PyFaulthandler_Fini();
1218
1219 /* Debugging stuff */
1220#ifdef COUNT_ALLOCS
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +03001221 dump_counts(stderr);
Nick Coghland6009512014-11-20 21:39:37 +10001222#endif
1223 /* dump hash stats */
1224 _PyHash_Fini();
1225
Eric Snowdae02762017-09-14 00:35:58 -07001226#ifdef Py_REF_DEBUG
Victor Stinnerda273412017-12-15 01:46:02 +01001227 if (show_ref_count) {
Victor Stinner25420fe2017-11-20 18:12:22 -08001228 _PyDebug_PrintTotalRefs();
1229 }
Eric Snowdae02762017-09-14 00:35:58 -07001230#endif
Nick Coghland6009512014-11-20 21:39:37 +10001231
1232#ifdef Py_TRACE_REFS
1233 /* Display all objects still alive -- this can invoke arbitrary
1234 * __repr__ overrides, so requires a mostly-intact interpreter.
1235 * Alas, a lot of stuff may still be alive now that will be cleaned
1236 * up later.
1237 */
Victor Stinnerda273412017-12-15 01:46:02 +01001238 if (dump_refs) {
Nick Coghland6009512014-11-20 21:39:37 +10001239 _Py_PrintReferences(stderr);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001240 }
Nick Coghland6009512014-11-20 21:39:37 +10001241#endif /* Py_TRACE_REFS */
1242
1243 /* Clear interpreter state and all thread states. */
1244 PyInterpreterState_Clear(interp);
1245
1246 /* Now we decref the exception classes. After this point nothing
1247 can raise an exception. That's okay, because each Fini() method
1248 below has been checked to make sure no exceptions are ever
1249 raised.
1250 */
1251
1252 _PyExc_Fini();
1253
1254 /* Sundry finalizers */
1255 PyMethod_Fini();
1256 PyFrame_Fini();
1257 PyCFunction_Fini();
1258 PyTuple_Fini();
1259 PyList_Fini();
1260 PySet_Fini();
1261 PyBytes_Fini();
1262 PyByteArray_Fini();
1263 PyLong_Fini();
1264 PyFloat_Fini();
1265 PyDict_Fini();
1266 PySlice_Fini();
1267 _PyGC_Fini();
Eric Snow6b4be192017-05-22 21:36:03 -07001268 _Py_HashRandomization_Fini();
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +03001269 _PyArg_Fini();
Yury Selivanoveb636452016-09-08 22:01:51 -07001270 PyAsyncGen_Fini();
Yury Selivanovf23746a2018-01-22 19:11:18 -05001271 _PyContext_Fini();
Nick Coghland6009512014-11-20 21:39:37 +10001272
1273 /* Cleanup Unicode implementation */
1274 _PyUnicode_Fini();
1275
1276 /* reset file system default encoding */
1277 if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
1278 PyMem_RawFree((char*)Py_FileSystemDefaultEncoding);
1279 Py_FileSystemDefaultEncoding = NULL;
1280 }
1281
1282 /* XXX Still allocated:
1283 - various static ad-hoc pointers to interned strings
1284 - int and float free list blocks
1285 - whatever various modules and libraries allocate
1286 */
1287
1288 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
1289
1290 /* Cleanup auto-thread-state */
Nick Coghland6009512014-11-20 21:39:37 +10001291 _PyGILState_Fini();
Nick Coghland6009512014-11-20 21:39:37 +10001292
1293 /* Delete current thread. After this, many C API calls become crashy. */
1294 PyThreadState_Swap(NULL);
Victor Stinner8a1be612016-03-14 22:07:55 +01001295
Nick Coghland6009512014-11-20 21:39:37 +10001296 PyInterpreterState_Delete(interp);
1297
1298#ifdef Py_TRACE_REFS
1299 /* Display addresses (& refcnts) of all objects still alive.
1300 * An address can be used to find the repr of the object, printed
1301 * above by _Py_PrintReferences.
1302 */
Victor Stinnerda273412017-12-15 01:46:02 +01001303 if (dump_refs) {
Nick Coghland6009512014-11-20 21:39:37 +10001304 _Py_PrintReferenceAddresses(stderr);
Victor Stinner6bf992a2017-12-06 17:26:10 +01001305 }
Nick Coghland6009512014-11-20 21:39:37 +10001306#endif /* Py_TRACE_REFS */
Victor Stinner34be8072016-03-14 12:04:26 +01001307#ifdef WITH_PYMALLOC
Victor Stinnerda273412017-12-15 01:46:02 +01001308 if (malloc_stats) {
Victor Stinner6bf992a2017-12-06 17:26:10 +01001309 _PyObject_DebugMallocStats(stderr);
Victor Stinner34be8072016-03-14 12:04:26 +01001310 }
Nick Coghland6009512014-11-20 21:39:37 +10001311#endif
1312
1313 call_ll_exitfuncs();
Victor Stinner9316ee42017-11-25 03:17:57 +01001314
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001315 _PyRuntime_Finalize();
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001316 return status;
1317}
1318
1319void
1320Py_Finalize(void)
1321{
1322 Py_FinalizeEx();
Nick Coghland6009512014-11-20 21:39:37 +10001323}
1324
1325/* Create and initialize a new interpreter and thread, and return the
1326 new thread. This requires that Py_Initialize() has been called
1327 first.
1328
1329 Unsuccessful initialization yields a NULL pointer. Note that *no*
1330 exception information is available even in this case -- the
1331 exception information is held in the thread, and there is no
1332 thread.
1333
1334 Locking: as above.
1335
1336*/
1337
Victor Stinnera7368ac2017-11-15 18:11:45 -08001338static _PyInitError
1339new_interpreter(PyThreadState **tstate_p)
Nick Coghland6009512014-11-20 21:39:37 +10001340{
1341 PyInterpreterState *interp;
1342 PyThreadState *tstate, *save_tstate;
1343 PyObject *bimod, *sysmod;
Victor Stinner9316ee42017-11-25 03:17:57 +01001344 _PyInitError err;
Nick Coghland6009512014-11-20 21:39:37 +10001345
Victor Stinnera7368ac2017-11-15 18:11:45 -08001346 if (!_PyRuntime.initialized) {
1347 return _Py_INIT_ERR("Py_Initialize must be called first");
1348 }
Nick Coghland6009512014-11-20 21:39:37 +10001349
Victor Stinner8a1be612016-03-14 22:07:55 +01001350 /* Issue #10915, #15751: The GIL API doesn't work with multiple
1351 interpreters: disable PyGILState_Check(). */
1352 _PyGILState_check_enabled = 0;
1353
Nick Coghland6009512014-11-20 21:39:37 +10001354 interp = PyInterpreterState_New();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001355 if (interp == NULL) {
1356 *tstate_p = NULL;
1357 return _Py_INIT_OK();
1358 }
Nick Coghland6009512014-11-20 21:39:37 +10001359
1360 tstate = PyThreadState_New(interp);
1361 if (tstate == NULL) {
1362 PyInterpreterState_Delete(interp);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001363 *tstate_p = NULL;
1364 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001365 }
1366
1367 save_tstate = PyThreadState_Swap(tstate);
1368
Eric Snow1abcf672017-05-23 21:46:51 -07001369 /* Copy the current interpreter config into the new interpreter */
Victor Stinnerda273412017-12-15 01:46:02 +01001370 _PyCoreConfig *core_config;
1371 _PyMainInterpreterConfig *config;
Eric Snow1abcf672017-05-23 21:46:51 -07001372 if (save_tstate != NULL) {
Victor Stinnerda273412017-12-15 01:46:02 +01001373 core_config = &save_tstate->interp->core_config;
1374 config = &save_tstate->interp->config;
Eric Snow1abcf672017-05-23 21:46:51 -07001375 } else {
1376 /* No current thread state, copy from the main interpreter */
1377 PyInterpreterState *main_interp = PyInterpreterState_Main();
Victor Stinnerda273412017-12-15 01:46:02 +01001378 core_config = &main_interp->core_config;
1379 config = &main_interp->config;
1380 }
1381
1382 if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
1383 return _Py_INIT_ERR("failed to copy core config");
1384 }
1385 if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) {
1386 return _Py_INIT_ERR("failed to copy main interpreter config");
Eric Snow1abcf672017-05-23 21:46:51 -07001387 }
1388
Nick Coghland6009512014-11-20 21:39:37 +10001389 /* XXX The following is lax in error checking */
Eric Snowd393c1b2017-09-14 12:18:12 -06001390 PyObject *modules = PyDict_New();
Victor Stinnera7368ac2017-11-15 18:11:45 -08001391 if (modules == NULL) {
1392 return _Py_INIT_ERR("can't make modules dictionary");
1393 }
Eric Snowd393c1b2017-09-14 12:18:12 -06001394 interp->modules = modules;
Nick Coghland6009512014-11-20 21:39:37 +10001395
Eric Snowd393c1b2017-09-14 12:18:12 -06001396 sysmod = _PyImport_FindBuiltin("sys", modules);
1397 if (sysmod != NULL) {
1398 interp->sysdict = PyModule_GetDict(sysmod);
1399 if (interp->sysdict == NULL)
1400 goto handle_error;
1401 Py_INCREF(interp->sysdict);
1402 PyDict_SetItemString(interp->sysdict, "modules", modules);
Victor Stinner41264f12017-12-15 02:05:29 +01001403 _PySys_EndInit(interp->sysdict, &interp->config);
Eric Snowd393c1b2017-09-14 12:18:12 -06001404 }
1405
1406 bimod = _PyImport_FindBuiltin("builtins", modules);
Nick Coghland6009512014-11-20 21:39:37 +10001407 if (bimod != NULL) {
1408 interp->builtins = PyModule_GetDict(bimod);
1409 if (interp->builtins == NULL)
1410 goto handle_error;
1411 Py_INCREF(interp->builtins);
1412 }
1413
1414 /* initialize builtin exceptions */
1415 _PyExc_Init(bimod);
1416
Nick Coghland6009512014-11-20 21:39:37 +10001417 if (bimod != NULL && sysmod != NULL) {
1418 PyObject *pstderr;
1419
Nick Coghland6009512014-11-20 21:39:37 +10001420 /* Set up a preliminary stderr printer until we have enough
1421 infrastructure for the io module in place. */
1422 pstderr = PyFile_NewStdPrinter(fileno(stderr));
Victor Stinnera7368ac2017-11-15 18:11:45 -08001423 if (pstderr == NULL) {
1424 return _Py_INIT_ERR("can't set preliminary stderr");
1425 }
Nick Coghland6009512014-11-20 21:39:37 +10001426 _PySys_SetObjectId(&PyId_stderr, pstderr);
1427 PySys_SetObject("__stderr__", pstderr);
1428 Py_DECREF(pstderr);
1429
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001430 err = _PyImportHooks_Init();
1431 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001432 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001433 }
Nick Coghland6009512014-11-20 21:39:37 +10001434
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001435 err = initimport(interp, sysmod);
1436 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001437 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001438 }
Nick Coghland6009512014-11-20 21:39:37 +10001439
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001440 err = initexternalimport(interp);
1441 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001442 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001443 }
Nick Coghland6009512014-11-20 21:39:37 +10001444
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001445 err = initfsencoding(interp);
1446 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001447 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001448 }
1449
Victor Stinner91106cd2017-12-13 12:29:09 +01001450 err = init_sys_streams(interp);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001451 if (_Py_INIT_FAILED(err)) {
1452 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001453 }
1454
1455 err = add_main_module(interp);
1456 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001457 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001458 }
1459
1460 if (!Py_NoSiteFlag) {
1461 err = initsite();
1462 if (_Py_INIT_FAILED(err)) {
Victor Stinnera7368ac2017-11-15 18:11:45 -08001463 return err;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001464 }
1465 }
Nick Coghland6009512014-11-20 21:39:37 +10001466 }
1467
Victor Stinnera7368ac2017-11-15 18:11:45 -08001468 if (PyErr_Occurred()) {
1469 goto handle_error;
1470 }
Nick Coghland6009512014-11-20 21:39:37 +10001471
Victor Stinnera7368ac2017-11-15 18:11:45 -08001472 *tstate_p = tstate;
1473 return _Py_INIT_OK();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001474
Nick Coghland6009512014-11-20 21:39:37 +10001475handle_error:
1476 /* Oops, it didn't work. Undo it all. */
1477
1478 PyErr_PrintEx(0);
1479 PyThreadState_Clear(tstate);
1480 PyThreadState_Swap(save_tstate);
1481 PyThreadState_Delete(tstate);
1482 PyInterpreterState_Delete(interp);
1483
Victor Stinnera7368ac2017-11-15 18:11:45 -08001484 *tstate_p = NULL;
1485 return _Py_INIT_OK();
1486}
1487
1488PyThreadState *
1489Py_NewInterpreter(void)
1490{
1491 PyThreadState *tstate;
1492 _PyInitError err = new_interpreter(&tstate);
1493 if (_Py_INIT_FAILED(err)) {
1494 _Py_FatalInitError(err);
1495 }
1496 return tstate;
1497
Nick Coghland6009512014-11-20 21:39:37 +10001498}
1499
1500/* Delete an interpreter and its last thread. This requires that the
1501 given thread state is current, that the thread has no remaining
1502 frames, and that it is its interpreter's only remaining thread.
1503 It is a fatal error to violate these constraints.
1504
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001505 (Py_FinalizeEx() doesn't have these constraints -- it zaps
Nick Coghland6009512014-11-20 21:39:37 +10001506 everything, regardless.)
1507
1508 Locking: as above.
1509
1510*/
1511
1512void
1513Py_EndInterpreter(PyThreadState *tstate)
1514{
1515 PyInterpreterState *interp = tstate->interp;
1516
1517 if (tstate != PyThreadState_GET())
1518 Py_FatalError("Py_EndInterpreter: thread is not current");
1519 if (tstate->frame != NULL)
1520 Py_FatalError("Py_EndInterpreter: thread still has a frame");
1521
1522 wait_for_thread_shutdown();
1523
Marcel Plch776407f2017-12-20 11:17:58 +01001524 call_py_exitfuncs(interp);
1525
Nick Coghland6009512014-11-20 21:39:37 +10001526 if (tstate != interp->tstate_head || tstate->next != NULL)
1527 Py_FatalError("Py_EndInterpreter: not the last thread");
1528
1529 PyImport_Cleanup();
1530 PyInterpreterState_Clear(interp);
1531 PyThreadState_Swap(NULL);
1532 PyInterpreterState_Delete(interp);
1533}
1534
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001535/* Add the __main__ module */
Nick Coghland6009512014-11-20 21:39:37 +10001536
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001537static _PyInitError
1538add_main_module(PyInterpreterState *interp)
Nick Coghland6009512014-11-20 21:39:37 +10001539{
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001540 PyObject *m, *d, *loader, *ann_dict;
Nick Coghland6009512014-11-20 21:39:37 +10001541 m = PyImport_AddModule("__main__");
1542 if (m == NULL)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001543 return _Py_INIT_ERR("can't create __main__ module");
1544
Nick Coghland6009512014-11-20 21:39:37 +10001545 d = PyModule_GetDict(m);
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001546 ann_dict = PyDict_New();
1547 if ((ann_dict == NULL) ||
1548 (PyDict_SetItemString(d, "__annotations__", ann_dict) < 0)) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001549 return _Py_INIT_ERR("Failed to initialize __main__.__annotations__");
Yury Selivanovf8cb8a12016-09-08 20:50:03 -07001550 }
1551 Py_DECREF(ann_dict);
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001552
Nick Coghland6009512014-11-20 21:39:37 +10001553 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
1554 PyObject *bimod = PyImport_ImportModule("builtins");
1555 if (bimod == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001556 return _Py_INIT_ERR("Failed to retrieve builtins module");
Nick Coghland6009512014-11-20 21:39:37 +10001557 }
1558 if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001559 return _Py_INIT_ERR("Failed to initialize __main__.__builtins__");
Nick Coghland6009512014-11-20 21:39:37 +10001560 }
1561 Py_DECREF(bimod);
1562 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001563
Nick Coghland6009512014-11-20 21:39:37 +10001564 /* Main is a little special - imp.is_builtin("__main__") will return
1565 * False, but BuiltinImporter is still the most appropriate initial
1566 * setting for its __loader__ attribute. A more suitable value will
1567 * be set if __main__ gets further initialized later in the startup
1568 * process.
1569 */
1570 loader = PyDict_GetItemString(d, "__loader__");
1571 if (loader == NULL || loader == Py_None) {
1572 PyObject *loader = PyObject_GetAttrString(interp->importlib,
1573 "BuiltinImporter");
1574 if (loader == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001575 return _Py_INIT_ERR("Failed to retrieve BuiltinImporter");
Nick Coghland6009512014-11-20 21:39:37 +10001576 }
1577 if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001578 return _Py_INIT_ERR("Failed to initialize __main__.__loader__");
Nick Coghland6009512014-11-20 21:39:37 +10001579 }
1580 Py_DECREF(loader);
1581 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001582 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001583}
1584
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001585static _PyInitError
Nick Coghland6009512014-11-20 21:39:37 +10001586initfsencoding(PyInterpreterState *interp)
1587{
1588 PyObject *codec;
1589
Steve Dowercc16be82016-09-08 10:35:16 -07001590#ifdef MS_WINDOWS
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001591 if (Py_LegacyWindowsFSEncodingFlag) {
Steve Dowercc16be82016-09-08 10:35:16 -07001592 Py_FileSystemDefaultEncoding = "mbcs";
1593 Py_FileSystemDefaultEncodeErrors = "replace";
1594 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001595 else {
Steve Dowercc16be82016-09-08 10:35:16 -07001596 Py_FileSystemDefaultEncoding = "utf-8";
1597 Py_FileSystemDefaultEncodeErrors = "surrogatepass";
1598 }
1599#else
Victor Stinner91106cd2017-12-13 12:29:09 +01001600 if (Py_FileSystemDefaultEncoding == NULL &&
1601 interp->core_config.utf8_mode)
1602 {
1603 Py_FileSystemDefaultEncoding = "utf-8";
1604 Py_HasFileSystemDefaultEncoding = 1;
1605 }
1606 else if (Py_FileSystemDefaultEncoding == NULL) {
Nick Coghland6009512014-11-20 21:39:37 +10001607 Py_FileSystemDefaultEncoding = get_locale_encoding();
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001608 if (Py_FileSystemDefaultEncoding == NULL) {
1609 return _Py_INIT_ERR("Unable to get the locale encoding");
1610 }
Nick Coghland6009512014-11-20 21:39:37 +10001611
1612 Py_HasFileSystemDefaultEncoding = 0;
1613 interp->fscodec_initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001614 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001615 }
Steve Dowercc16be82016-09-08 10:35:16 -07001616#endif
Nick Coghland6009512014-11-20 21:39:37 +10001617
1618 /* the encoding is mbcs, utf-8 or ascii */
1619 codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
1620 if (!codec) {
1621 /* Such error can only occurs in critical situations: no more
1622 * memory, import a module of the standard library failed,
1623 * etc. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001624 return _Py_INIT_ERR("unable to load the file system codec");
Nick Coghland6009512014-11-20 21:39:37 +10001625 }
1626 Py_DECREF(codec);
1627 interp->fscodec_initialized = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001628 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001629}
1630
1631/* Import the site module (not into __main__ though) */
1632
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001633static _PyInitError
Nick Coghland6009512014-11-20 21:39:37 +10001634initsite(void)
1635{
1636 PyObject *m;
1637 m = PyImport_ImportModule("site");
1638 if (m == NULL) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001639 return _Py_INIT_USER_ERR("Failed to import the site module");
Nick Coghland6009512014-11-20 21:39:37 +10001640 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08001641 Py_DECREF(m);
1642 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001643}
1644
Victor Stinner874dbe82015-09-04 17:29:57 +02001645/* Check if a file descriptor is valid or not.
1646 Return 0 if the file descriptor is invalid, return non-zero otherwise. */
1647static int
1648is_valid_fd(int fd)
1649{
Victor Stinner1c4670e2017-05-04 00:45:56 +02001650#ifdef __APPLE__
1651 /* bpo-30225: On macOS Tiger, when stdout is redirected to a pipe
1652 and the other side of the pipe is closed, dup(1) succeed, whereas
1653 fstat(1, &st) fails with EBADF. Prefer fstat() over dup() to detect
1654 such error. */
1655 struct stat st;
1656 return (fstat(fd, &st) == 0);
1657#else
Victor Stinner874dbe82015-09-04 17:29:57 +02001658 int fd2;
Steve Dower940f33a2016-09-08 11:21:54 -07001659 if (fd < 0)
Victor Stinner874dbe82015-09-04 17:29:57 +02001660 return 0;
1661 _Py_BEGIN_SUPPRESS_IPH
Victor Stinner449b2712015-09-29 13:59:50 +02001662 /* Prefer dup() over fstat(). fstat() can require input/output whereas
1663 dup() doesn't, there is a low risk of EMFILE/ENFILE at Python
1664 startup. */
Victor Stinner874dbe82015-09-04 17:29:57 +02001665 fd2 = dup(fd);
1666 if (fd2 >= 0)
1667 close(fd2);
1668 _Py_END_SUPPRESS_IPH
1669 return fd2 >= 0;
Victor Stinner1c4670e2017-05-04 00:45:56 +02001670#endif
Victor Stinner874dbe82015-09-04 17:29:57 +02001671}
1672
1673/* returns Py_None if the fd is not valid */
Nick Coghland6009512014-11-20 21:39:37 +10001674static PyObject*
1675create_stdio(PyObject* io,
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001676 int fd, int write_mode, const char* name,
1677 const char* encoding, const char* errors)
Nick Coghland6009512014-11-20 21:39:37 +10001678{
1679 PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
1680 const char* mode;
1681 const char* newline;
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001682 PyObject *line_buffering, *write_through;
Nick Coghland6009512014-11-20 21:39:37 +10001683 int buffering, isatty;
1684 _Py_IDENTIFIER(open);
1685 _Py_IDENTIFIER(isatty);
1686 _Py_IDENTIFIER(TextIOWrapper);
1687 _Py_IDENTIFIER(mode);
1688
Victor Stinner874dbe82015-09-04 17:29:57 +02001689 if (!is_valid_fd(fd))
1690 Py_RETURN_NONE;
1691
Nick Coghland6009512014-11-20 21:39:37 +10001692 /* stdin is always opened in buffered mode, first because it shouldn't
1693 make a difference in common use cases, second because TextIOWrapper
1694 depends on the presence of a read1() method which only exists on
1695 buffered streams.
1696 */
1697 if (Py_UnbufferedStdioFlag && write_mode)
1698 buffering = 0;
1699 else
1700 buffering = -1;
1701 if (write_mode)
1702 mode = "wb";
1703 else
1704 mode = "rb";
1705 buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi",
1706 fd, mode, buffering,
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001707 Py_None, Py_None, /* encoding, errors */
1708 Py_None, 0); /* newline, closefd */
Nick Coghland6009512014-11-20 21:39:37 +10001709 if (buf == NULL)
1710 goto error;
1711
1712 if (buffering) {
1713 _Py_IDENTIFIER(raw);
1714 raw = _PyObject_GetAttrId(buf, &PyId_raw);
1715 if (raw == NULL)
1716 goto error;
1717 }
1718 else {
1719 raw = buf;
1720 Py_INCREF(raw);
1721 }
1722
Steve Dower39294992016-08-30 21:22:36 -07001723#ifdef MS_WINDOWS
1724 /* Windows console IO is always UTF-8 encoded */
1725 if (PyWindowsConsoleIO_Check(raw))
1726 encoding = "utf-8";
1727#endif
1728
Nick Coghland6009512014-11-20 21:39:37 +10001729 text = PyUnicode_FromString(name);
1730 if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0)
1731 goto error;
Victor Stinner3466bde2016-09-05 18:16:01 -07001732 res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL);
Nick Coghland6009512014-11-20 21:39:37 +10001733 if (res == NULL)
1734 goto error;
1735 isatty = PyObject_IsTrue(res);
1736 Py_DECREF(res);
1737 if (isatty == -1)
1738 goto error;
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001739 if (Py_UnbufferedStdioFlag)
1740 write_through = Py_True;
1741 else
1742 write_through = Py_False;
1743 if (isatty && !Py_UnbufferedStdioFlag)
Nick Coghland6009512014-11-20 21:39:37 +10001744 line_buffering = Py_True;
1745 else
1746 line_buffering = Py_False;
1747
1748 Py_CLEAR(raw);
1749 Py_CLEAR(text);
1750
1751#ifdef MS_WINDOWS
1752 /* sys.stdin: enable universal newline mode, translate "\r\n" and "\r"
1753 newlines to "\n".
1754 sys.stdout and sys.stderr: translate "\n" to "\r\n". */
1755 newline = NULL;
1756#else
1757 /* sys.stdin: split lines at "\n".
1758 sys.stdout and sys.stderr: don't translate newlines (use "\n"). */
1759 newline = "\n";
1760#endif
1761
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001762 stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssOO",
Nick Coghland6009512014-11-20 21:39:37 +10001763 buf, encoding, errors,
Serhiy Storchaka77732be2017-10-04 20:25:40 +03001764 newline, line_buffering, write_through);
Nick Coghland6009512014-11-20 21:39:37 +10001765 Py_CLEAR(buf);
1766 if (stream == NULL)
1767 goto error;
1768
1769 if (write_mode)
1770 mode = "w";
1771 else
1772 mode = "r";
1773 text = PyUnicode_FromString(mode);
1774 if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0)
1775 goto error;
1776 Py_CLEAR(text);
1777 return stream;
1778
1779error:
1780 Py_XDECREF(buf);
1781 Py_XDECREF(stream);
1782 Py_XDECREF(text);
1783 Py_XDECREF(raw);
Nick Coghland6009512014-11-20 21:39:37 +10001784
Victor Stinner874dbe82015-09-04 17:29:57 +02001785 if (PyErr_ExceptionMatches(PyExc_OSError) && !is_valid_fd(fd)) {
1786 /* Issue #24891: the file descriptor was closed after the first
1787 is_valid_fd() check was called. Ignore the OSError and set the
1788 stream to None. */
1789 PyErr_Clear();
1790 Py_RETURN_NONE;
1791 }
1792 return NULL;
Nick Coghland6009512014-11-20 21:39:37 +10001793}
1794
1795/* Initialize sys.stdin, stdout, stderr and builtins.open */
Victor Stinnera7368ac2017-11-15 18:11:45 -08001796static _PyInitError
Victor Stinner91106cd2017-12-13 12:29:09 +01001797init_sys_streams(PyInterpreterState *interp)
Nick Coghland6009512014-11-20 21:39:37 +10001798{
1799 PyObject *iomod = NULL, *wrapper;
1800 PyObject *bimod = NULL;
1801 PyObject *m;
1802 PyObject *std = NULL;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001803 int fd;
Nick Coghland6009512014-11-20 21:39:37 +10001804 PyObject * encoding_attr;
Serhiy Storchaka4ae06c52017-12-12 13:55:04 +02001805 char *pythonioencoding = NULL;
1806 const char *encoding, *errors;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001807 _PyInitError res = _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10001808
1809 /* Hack to avoid a nasty recursion issue when Python is invoked
1810 in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
1811 if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) {
1812 goto error;
1813 }
1814 Py_DECREF(m);
1815
1816 if (!(m = PyImport_ImportModule("encodings.latin_1"))) {
1817 goto error;
1818 }
1819 Py_DECREF(m);
1820
1821 if (!(bimod = PyImport_ImportModule("builtins"))) {
1822 goto error;
1823 }
1824
1825 if (!(iomod = PyImport_ImportModule("io"))) {
1826 goto error;
1827 }
1828 if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
1829 goto error;
1830 }
1831
1832 /* Set builtins.open */
1833 if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
1834 Py_DECREF(wrapper);
1835 goto error;
1836 }
1837 Py_DECREF(wrapper);
1838
1839 encoding = _Py_StandardStreamEncoding;
1840 errors = _Py_StandardStreamErrors;
1841 if (!encoding || !errors) {
Victor Stinner91106cd2017-12-13 12:29:09 +01001842 char *opt = Py_GETENV("PYTHONIOENCODING");
1843 if (opt && opt[0] != '\0') {
Nick Coghland6009512014-11-20 21:39:37 +10001844 char *err;
Victor Stinner91106cd2017-12-13 12:29:09 +01001845 pythonioencoding = _PyMem_Strdup(opt);
Nick Coghland6009512014-11-20 21:39:37 +10001846 if (pythonioencoding == NULL) {
1847 PyErr_NoMemory();
1848 goto error;
1849 }
1850 err = strchr(pythonioencoding, ':');
1851 if (err) {
1852 *err = '\0';
1853 err++;
Serhiy Storchakafc435112016-04-10 14:34:13 +03001854 if (*err && !errors) {
Nick Coghland6009512014-11-20 21:39:37 +10001855 errors = err;
1856 }
1857 }
1858 if (*pythonioencoding && !encoding) {
1859 encoding = pythonioencoding;
1860 }
1861 }
Victor Stinner91106cd2017-12-13 12:29:09 +01001862 else if (interp->core_config.utf8_mode) {
1863 encoding = "utf-8";
1864 errors = "surrogateescape";
1865 }
1866
1867 if (!errors && !pythonioencoding) {
Nick Coghlan6ea41862017-06-11 13:16:15 +10001868 /* Choose the default error handler based on the current locale */
1869 errors = get_default_standard_stream_error_handler();
Serhiy Storchakafc435112016-04-10 14:34:13 +03001870 }
Nick Coghland6009512014-11-20 21:39:37 +10001871 }
1872
1873 /* Set sys.stdin */
1874 fd = fileno(stdin);
1875 /* Under some conditions stdin, stdout and stderr may not be connected
1876 * and fileno() may point to an invalid file descriptor. For example
1877 * GUI apps don't have valid standard streams by default.
1878 */
Victor Stinner874dbe82015-09-04 17:29:57 +02001879 std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
1880 if (std == NULL)
1881 goto error;
Nick Coghland6009512014-11-20 21:39:37 +10001882 PySys_SetObject("__stdin__", std);
1883 _PySys_SetObjectId(&PyId_stdin, std);
1884 Py_DECREF(std);
1885
1886 /* Set sys.stdout */
1887 fd = fileno(stdout);
Victor Stinner874dbe82015-09-04 17:29:57 +02001888 std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors);
1889 if (std == NULL)
1890 goto error;
Nick Coghland6009512014-11-20 21:39:37 +10001891 PySys_SetObject("__stdout__", std);
1892 _PySys_SetObjectId(&PyId_stdout, std);
1893 Py_DECREF(std);
1894
1895#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
1896 /* Set sys.stderr, replaces the preliminary stderr */
1897 fd = fileno(stderr);
Victor Stinner874dbe82015-09-04 17:29:57 +02001898 std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace");
1899 if (std == NULL)
1900 goto error;
Nick Coghland6009512014-11-20 21:39:37 +10001901
1902 /* Same as hack above, pre-import stderr's codec to avoid recursion
1903 when import.c tries to write to stderr in verbose mode. */
1904 encoding_attr = PyObject_GetAttrString(std, "encoding");
1905 if (encoding_attr != NULL) {
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02001906 const char *std_encoding = PyUnicode_AsUTF8(encoding_attr);
Nick Coghland6009512014-11-20 21:39:37 +10001907 if (std_encoding != NULL) {
1908 PyObject *codec_info = _PyCodec_Lookup(std_encoding);
1909 Py_XDECREF(codec_info);
1910 }
1911 Py_DECREF(encoding_attr);
1912 }
1913 PyErr_Clear(); /* Not a fatal error if codec isn't available */
1914
1915 if (PySys_SetObject("__stderr__", std) < 0) {
1916 Py_DECREF(std);
1917 goto error;
1918 }
1919 if (_PySys_SetObjectId(&PyId_stderr, std) < 0) {
1920 Py_DECREF(std);
1921 goto error;
1922 }
1923 Py_DECREF(std);
1924#endif
1925
Victor Stinnera7368ac2017-11-15 18:11:45 -08001926 goto done;
Nick Coghland6009512014-11-20 21:39:37 +10001927
Victor Stinnera7368ac2017-11-15 18:11:45 -08001928error:
1929 res = _Py_INIT_ERR("can't initialize sys standard streams");
1930
Victor Stinner31e99082017-12-20 23:41:38 +01001931 /* Use the same allocator than Py_SetStandardStreamEncoding() */
1932 PyMemAllocatorEx old_alloc;
Victor Stinnera7368ac2017-11-15 18:11:45 -08001933done:
Victor Stinner31e99082017-12-20 23:41:38 +01001934 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1935
Nick Coghland6009512014-11-20 21:39:37 +10001936 /* We won't need them anymore. */
1937 if (_Py_StandardStreamEncoding) {
1938 PyMem_RawFree(_Py_StandardStreamEncoding);
1939 _Py_StandardStreamEncoding = NULL;
1940 }
1941 if (_Py_StandardStreamErrors) {
1942 PyMem_RawFree(_Py_StandardStreamErrors);
1943 _Py_StandardStreamErrors = NULL;
1944 }
Victor Stinner31e99082017-12-20 23:41:38 +01001945
1946 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1947
Nick Coghland6009512014-11-20 21:39:37 +10001948 PyMem_Free(pythonioencoding);
1949 Py_XDECREF(bimod);
1950 Py_XDECREF(iomod);
Victor Stinnera7368ac2017-11-15 18:11:45 -08001951 return res;
Nick Coghland6009512014-11-20 21:39:37 +10001952}
1953
1954
Victor Stinner10dc4842015-03-24 12:01:30 +01001955static void
Victor Stinner791da1c2016-03-14 16:53:12 +01001956_Py_FatalError_DumpTracebacks(int fd)
Victor Stinner10dc4842015-03-24 12:01:30 +01001957{
Victor Stinner10dc4842015-03-24 12:01:30 +01001958 fputc('\n', stderr);
1959 fflush(stderr);
1960
1961 /* display the current Python stack */
Victor Stinner861d9ab2016-03-16 22:45:24 +01001962 _Py_DumpTracebackThreads(fd, NULL, NULL);
Victor Stinner10dc4842015-03-24 12:01:30 +01001963}
Victor Stinner791da1c2016-03-14 16:53:12 +01001964
1965/* Print the current exception (if an exception is set) with its traceback,
1966 or display the current Python stack.
1967
1968 Don't call PyErr_PrintEx() and the except hook, because Py_FatalError() is
1969 called on catastrophic cases.
1970
1971 Return 1 if the traceback was displayed, 0 otherwise. */
1972
1973static int
1974_Py_FatalError_PrintExc(int fd)
1975{
1976 PyObject *ferr, *res;
1977 PyObject *exception, *v, *tb;
1978 int has_tb;
1979
1980 if (PyThreadState_GET() == NULL) {
1981 /* The GIL is released: trying to acquire it is likely to deadlock,
1982 just give up. */
1983 return 0;
1984 }
1985
1986 PyErr_Fetch(&exception, &v, &tb);
1987 if (exception == NULL) {
1988 /* No current exception */
1989 return 0;
1990 }
1991
1992 ferr = _PySys_GetObjectId(&PyId_stderr);
1993 if (ferr == NULL || ferr == Py_None) {
1994 /* sys.stderr is not set yet or set to None,
1995 no need to try to display the exception */
1996 return 0;
1997 }
1998
1999 PyErr_NormalizeException(&exception, &v, &tb);
2000 if (tb == NULL) {
2001 tb = Py_None;
2002 Py_INCREF(tb);
2003 }
2004 PyException_SetTraceback(v, tb);
2005 if (exception == NULL) {
2006 /* PyErr_NormalizeException() failed */
2007 return 0;
2008 }
2009
2010 has_tb = (tb != Py_None);
2011 PyErr_Display(exception, v, tb);
2012 Py_XDECREF(exception);
2013 Py_XDECREF(v);
2014 Py_XDECREF(tb);
2015
2016 /* sys.stderr may be buffered: call sys.stderr.flush() */
Victor Stinner3466bde2016-09-05 18:16:01 -07002017 res = _PyObject_CallMethodId(ferr, &PyId_flush, NULL);
Victor Stinner791da1c2016-03-14 16:53:12 +01002018 if (res == NULL)
2019 PyErr_Clear();
2020 else
2021 Py_DECREF(res);
2022
2023 return has_tb;
2024}
2025
Nick Coghland6009512014-11-20 21:39:37 +10002026/* Print fatal error message and abort */
2027
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002028#ifdef MS_WINDOWS
2029static void
2030fatal_output_debug(const char *msg)
2031{
2032 /* buffer of 256 bytes allocated on the stack */
2033 WCHAR buffer[256 / sizeof(WCHAR)];
2034 size_t buflen = Py_ARRAY_LENGTH(buffer) - 1;
2035 size_t msglen;
2036
2037 OutputDebugStringW(L"Fatal Python error: ");
2038
2039 msglen = strlen(msg);
2040 while (msglen) {
2041 size_t i;
2042
2043 if (buflen > msglen) {
2044 buflen = msglen;
2045 }
2046
2047 /* Convert the message to wchar_t. This uses a simple one-to-one
2048 conversion, assuming that the this error message actually uses
2049 ASCII only. If this ceases to be true, we will have to convert. */
2050 for (i=0; i < buflen; ++i) {
2051 buffer[i] = msg[i];
2052 }
2053 buffer[i] = L'\0';
2054 OutputDebugStringW(buffer);
2055
2056 msg += buflen;
2057 msglen -= buflen;
2058 }
2059 OutputDebugStringW(L"\n");
2060}
2061#endif
2062
Benjamin Petersoncef88b92017-11-25 13:02:55 -08002063static void _Py_NO_RETURN
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002064fatal_error(const char *prefix, const char *msg, int status)
Nick Coghland6009512014-11-20 21:39:37 +10002065{
2066 const int fd = fileno(stderr);
Victor Stinner53345a42015-03-25 01:55:14 +01002067 static int reentrant = 0;
Victor Stinner53345a42015-03-25 01:55:14 +01002068
2069 if (reentrant) {
2070 /* Py_FatalError() caused a second fatal error.
2071 Example: flush_std_files() raises a recursion error. */
2072 goto exit;
2073 }
2074 reentrant = 1;
Nick Coghland6009512014-11-20 21:39:37 +10002075
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002076 fprintf(stderr, "Fatal Python error: ");
2077 if (prefix) {
2078 fputs(prefix, stderr);
2079 fputs(": ", stderr);
2080 }
2081 if (msg) {
2082 fputs(msg, stderr);
2083 }
2084 else {
2085 fprintf(stderr, "<message not set>");
2086 }
2087 fputs("\n", stderr);
Nick Coghland6009512014-11-20 21:39:37 +10002088 fflush(stderr); /* it helps in Windows debug build */
Victor Stinner10dc4842015-03-24 12:01:30 +01002089
Victor Stinnere0deff32015-03-24 13:46:18 +01002090 /* Print the exception (if an exception is set) with its traceback,
2091 * or display the current Python stack. */
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002092 if (!_Py_FatalError_PrintExc(fd)) {
Victor Stinner791da1c2016-03-14 16:53:12 +01002093 _Py_FatalError_DumpTracebacks(fd);
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002094 }
Victor Stinner10dc4842015-03-24 12:01:30 +01002095
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002096 /* The main purpose of faulthandler is to display the traceback.
2097 This function already did its best to display a traceback.
2098 Disable faulthandler to prevent writing a second traceback
2099 on abort(). */
Victor Stinner2025d782016-03-16 23:19:15 +01002100 _PyFaulthandler_Fini();
2101
Victor Stinner791da1c2016-03-14 16:53:12 +01002102 /* Check if the current Python thread hold the GIL */
2103 if (PyThreadState_GET() != NULL) {
2104 /* Flush sys.stdout and sys.stderr */
2105 flush_std_files();
2106 }
Victor Stinnere0deff32015-03-24 13:46:18 +01002107
Nick Coghland6009512014-11-20 21:39:37 +10002108#ifdef MS_WINDOWS
Victor Stinner8d5a3aa2017-10-04 09:50:12 -07002109 fatal_output_debug(msg);
Victor Stinner53345a42015-03-25 01:55:14 +01002110#endif /* MS_WINDOWS */
2111
2112exit:
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002113 if (status < 0) {
Victor Stinner53345a42015-03-25 01:55:14 +01002114#if defined(MS_WINDOWS) && defined(_DEBUG)
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002115 DebugBreak();
Nick Coghland6009512014-11-20 21:39:37 +10002116#endif
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002117 abort();
2118 }
2119 else {
2120 exit(status);
2121 }
2122}
2123
Victor Stinner19760862017-12-20 01:41:59 +01002124void _Py_NO_RETURN
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002125Py_FatalError(const char *msg)
2126{
2127 fatal_error(NULL, msg, -1);
2128}
2129
Victor Stinner19760862017-12-20 01:41:59 +01002130void _Py_NO_RETURN
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002131_Py_FatalInitError(_PyInitError err)
2132{
2133 /* On "user" error: exit with status 1.
2134 For all other errors, call abort(). */
2135 int status = err.user_err ? 1 : -1;
2136 fatal_error(err.prefix, err.msg, status);
Nick Coghland6009512014-11-20 21:39:37 +10002137}
2138
2139/* Clean up and exit */
2140
Victor Stinnerd7292b52016-06-17 12:29:00 +02002141# include "pythread.h"
Nick Coghland6009512014-11-20 21:39:37 +10002142
Nick Coghland6009512014-11-20 21:39:37 +10002143/* For the atexit module. */
Marcel Plch776407f2017-12-20 11:17:58 +01002144void _Py_PyAtExit(void (*func)(PyObject *), PyObject *module)
Nick Coghland6009512014-11-20 21:39:37 +10002145{
Marcel Plch776407f2017-12-20 11:17:58 +01002146 PyThreadState *ts;
2147 PyInterpreterState *is;
Victor Stinnerca719ac2017-12-20 18:00:19 +01002148
Marcel Plch776407f2017-12-20 11:17:58 +01002149 ts = PyThreadState_GET();
2150 is = ts->interp;
2151
Antoine Pitroufc5db952017-12-13 02:29:07 +01002152 /* Guard against API misuse (see bpo-17852) */
Marcel Plch776407f2017-12-20 11:17:58 +01002153 assert(is->pyexitfunc == NULL || is->pyexitfunc == func);
2154
2155 is->pyexitfunc = func;
2156 is->pyexitmodule = module;
Nick Coghland6009512014-11-20 21:39:37 +10002157}
2158
2159static void
Marcel Plch776407f2017-12-20 11:17:58 +01002160call_py_exitfuncs(PyInterpreterState *istate)
Nick Coghland6009512014-11-20 21:39:37 +10002161{
Marcel Plch776407f2017-12-20 11:17:58 +01002162 if (istate->pyexitfunc == NULL)
Nick Coghland6009512014-11-20 21:39:37 +10002163 return;
2164
Marcel Plch776407f2017-12-20 11:17:58 +01002165 (*istate->pyexitfunc)(istate->pyexitmodule);
Nick Coghland6009512014-11-20 21:39:37 +10002166 PyErr_Clear();
2167}
2168
2169/* Wait until threading._shutdown completes, provided
2170 the threading module was imported in the first place.
2171 The shutdown routine will wait until all non-daemon
2172 "threading" threads have completed. */
2173static void
2174wait_for_thread_shutdown(void)
2175{
Nick Coghland6009512014-11-20 21:39:37 +10002176 _Py_IDENTIFIER(_shutdown);
2177 PyObject *result;
Eric Snow3f9eee62017-09-15 16:35:20 -06002178 PyObject *threading = _PyImport_GetModuleId(&PyId_threading);
Nick Coghland6009512014-11-20 21:39:37 +10002179 if (threading == NULL) {
2180 /* threading not imported */
2181 PyErr_Clear();
2182 return;
2183 }
Victor Stinner3466bde2016-09-05 18:16:01 -07002184 result = _PyObject_CallMethodId(threading, &PyId__shutdown, NULL);
Nick Coghland6009512014-11-20 21:39:37 +10002185 if (result == NULL) {
2186 PyErr_WriteUnraisable(threading);
2187 }
2188 else {
2189 Py_DECREF(result);
2190 }
2191 Py_DECREF(threading);
Nick Coghland6009512014-11-20 21:39:37 +10002192}
2193
2194#define NEXITFUNCS 32
Nick Coghland6009512014-11-20 21:39:37 +10002195int Py_AtExit(void (*func)(void))
2196{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002197 if (_PyRuntime.nexitfuncs >= NEXITFUNCS)
Nick Coghland6009512014-11-20 21:39:37 +10002198 return -1;
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002199 _PyRuntime.exitfuncs[_PyRuntime.nexitfuncs++] = func;
Nick Coghland6009512014-11-20 21:39:37 +10002200 return 0;
2201}
2202
2203static void
2204call_ll_exitfuncs(void)
2205{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06002206 while (_PyRuntime.nexitfuncs > 0)
2207 (*_PyRuntime.exitfuncs[--_PyRuntime.nexitfuncs])();
Nick Coghland6009512014-11-20 21:39:37 +10002208
2209 fflush(stdout);
2210 fflush(stderr);
2211}
2212
2213void
2214Py_Exit(int sts)
2215{
Martin Panterb4ce1fc2015-11-30 03:18:29 +00002216 if (Py_FinalizeEx() < 0) {
2217 sts = 120;
2218 }
Nick Coghland6009512014-11-20 21:39:37 +10002219
2220 exit(sts);
2221}
2222
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002223static _PyInitError
Nick Coghland6009512014-11-20 21:39:37 +10002224initsigs(void)
2225{
2226#ifdef SIGPIPE
2227 PyOS_setsig(SIGPIPE, SIG_IGN);
2228#endif
2229#ifdef SIGXFZ
2230 PyOS_setsig(SIGXFZ, SIG_IGN);
2231#endif
2232#ifdef SIGXFSZ
2233 PyOS_setsig(SIGXFSZ, SIG_IGN);
2234#endif
2235 PyOS_InitInterrupts(); /* May imply initsignal() */
2236 if (PyErr_Occurred()) {
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002237 return _Py_INIT_ERR("can't import signal");
Nick Coghland6009512014-11-20 21:39:37 +10002238 }
Victor Stinnerf7e5b562017-11-15 15:48:08 -08002239 return _Py_INIT_OK();
Nick Coghland6009512014-11-20 21:39:37 +10002240}
2241
2242
2243/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
2244 *
2245 * All of the code in this function must only use async-signal-safe functions,
2246 * listed at `man 7 signal` or
2247 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2248 */
2249void
2250_Py_RestoreSignals(void)
2251{
2252#ifdef SIGPIPE
2253 PyOS_setsig(SIGPIPE, SIG_DFL);
2254#endif
2255#ifdef SIGXFZ
2256 PyOS_setsig(SIGXFZ, SIG_DFL);
2257#endif
2258#ifdef SIGXFSZ
2259 PyOS_setsig(SIGXFSZ, SIG_DFL);
2260#endif
2261}
2262
2263
2264/*
2265 * The file descriptor fd is considered ``interactive'' if either
2266 * a) isatty(fd) is TRUE, or
2267 * b) the -i flag was given, and the filename associated with
2268 * the descriptor is NULL or "<stdin>" or "???".
2269 */
2270int
2271Py_FdIsInteractive(FILE *fp, const char *filename)
2272{
2273 if (isatty((int)fileno(fp)))
2274 return 1;
2275 if (!Py_InteractiveFlag)
2276 return 0;
2277 return (filename == NULL) ||
2278 (strcmp(filename, "<stdin>") == 0) ||
2279 (strcmp(filename, "???") == 0);
2280}
2281
2282
Nick Coghland6009512014-11-20 21:39:37 +10002283/* Wrappers around sigaction() or signal(). */
2284
2285PyOS_sighandler_t
2286PyOS_getsig(int sig)
2287{
2288#ifdef HAVE_SIGACTION
2289 struct sigaction context;
2290 if (sigaction(sig, NULL, &context) == -1)
2291 return SIG_ERR;
2292 return context.sa_handler;
2293#else
2294 PyOS_sighandler_t handler;
2295/* Special signal handling for the secure CRT in Visual Studio 2005 */
2296#if defined(_MSC_VER) && _MSC_VER >= 1400
2297 switch (sig) {
2298 /* Only these signals are valid */
2299 case SIGINT:
2300 case SIGILL:
2301 case SIGFPE:
2302 case SIGSEGV:
2303 case SIGTERM:
2304 case SIGBREAK:
2305 case SIGABRT:
2306 break;
2307 /* Don't call signal() with other values or it will assert */
2308 default:
2309 return SIG_ERR;
2310 }
2311#endif /* _MSC_VER && _MSC_VER >= 1400 */
2312 handler = signal(sig, SIG_IGN);
2313 if (handler != SIG_ERR)
2314 signal(sig, handler);
2315 return handler;
2316#endif
2317}
2318
2319/*
2320 * All of the code in this function must only use async-signal-safe functions,
2321 * listed at `man 7 signal` or
2322 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2323 */
2324PyOS_sighandler_t
2325PyOS_setsig(int sig, PyOS_sighandler_t handler)
2326{
2327#ifdef HAVE_SIGACTION
2328 /* Some code in Modules/signalmodule.c depends on sigaction() being
2329 * used here if HAVE_SIGACTION is defined. Fix that if this code
2330 * changes to invalidate that assumption.
2331 */
2332 struct sigaction context, ocontext;
2333 context.sa_handler = handler;
2334 sigemptyset(&context.sa_mask);
2335 context.sa_flags = 0;
2336 if (sigaction(sig, &context, &ocontext) == -1)
2337 return SIG_ERR;
2338 return ocontext.sa_handler;
2339#else
2340 PyOS_sighandler_t oldhandler;
2341 oldhandler = signal(sig, handler);
2342#ifdef HAVE_SIGINTERRUPT
2343 siginterrupt(sig, 1);
2344#endif
2345 return oldhandler;
2346#endif
2347}
2348
2349#ifdef __cplusplus
2350}
2351#endif