summaryrefslogtreecommitdiffstats
path: root/Programs
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-08-17 20:04:08 (GMT)
committerGitHub <noreply@github.com>2024-08-17 20:04:08 (GMT)
commitd061ffea7b408861d0a9d311e92c363da284971d (patch)
tree669ad7db230f0d6e3004a36bab12f817f23a25b6 /Programs
parent40632b1f1da573f6d5e12453007474bcf70fba22 (diff)
downloadcpython-d061ffea7b408861d0a9d311e92c363da284971d.zip
cpython-d061ffea7b408861d0a9d311e92c363da284971d.tar.gz
cpython-d061ffea7b408861d0a9d311e92c363da284971d.tar.bz2
gh-123022: Fix crash with `Py_Initialize` in background thread (#123052)
Check that the current default heap is initialized in `_mi_os_get_aligned_hint` and `mi_os_claim_huge_pages`. The mimalloc function `_mi_os_get_aligned_hint` assumes that there is an initialized default heap. This is true for our main thread, but not for background threads. The problematic code path is usually called during initialization (i.e., `Py_Initialize`), but it may also be called if the program allocates large amounts of memory in total. The crash only affected the free-threaded build.
Diffstat (limited to 'Programs')
-rw-r--r--Programs/_testembed.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index 2c726c9..e341f0c 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -8,6 +8,7 @@
#include <Python.h>
#include "pycore_initconfig.h" // _PyConfig_InitCompatConfig()
#include "pycore_runtime.h" // _PyRuntime
+#include "pycore_pythread.h" // PyThread_start_joinable_thread()
#include "pycore_import.h" // _PyImport_FrozenBootstrap
#include <inttypes.h>
#include <stdio.h>
@@ -2022,6 +2023,22 @@ static int test_init_main_interpreter_settings(void)
return 0;
}
+static void do_init(void *unused)
+{
+ _testembed_Py_Initialize();
+ Py_Finalize();
+}
+
+static int test_init_in_background_thread(void)
+{
+ PyThread_handle_t handle;
+ PyThread_ident_t ident;
+ if (PyThread_start_joinable_thread(&do_init, NULL, &ident, &handle) < 0) {
+ return -1;
+ }
+ return PyThread_join_thread(handle);
+}
+
#ifndef MS_WINDOWS
#include "test_frozenmain.h" // M_test_frozenmain
@@ -2211,6 +2228,7 @@ static struct TestCase TestCases[] = {
{"test_get_argc_argv", test_get_argc_argv},
{"test_init_use_frozen_modules", test_init_use_frozen_modules},
{"test_init_main_interpreter_settings", test_init_main_interpreter_settings},
+ {"test_init_in_background_thread", test_init_in_background_thread},
// Audit
{"test_open_code_hook", test_open_code_hook},