)]}'
{
  "commit": "fee2527dfa05dc9157e71a6d3a9d57bc42efcde4",
  "tree": "851d6e82623fb73547b803ec9e09b5c41e5dafc6",
  "parents": [
    "0057e4945d3a77b7027c5970148e5addaf65ef1b"
  ],
  "author": {
    "name": "Xuehai Pan",
    "email": "XuehaiPan@pku.edu.cn",
    "time": "Sat Dec 27 02:59:11 2025 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Dec 26 13:59:11 2025 -0500"
  },
  "message": "Fix concurrency consistency for `internals_pp_manager` under multiple-interpreters (#5947)\n\n* Add per-interpreter storage for `gil_safe_call_once_and_store`\n\n* Disable thread local cache for `internals_pp_manager`\n\n* Disable thread local cache for `internals_pp_manager` for multi-interpreter only\n\n* Use anonymous namespace to separate these type_ids from other tests with the same class names.\n\n* style: pre-commit fixes\n\n* Revert internals_pp_manager changes\n\n* This is the crux of fix for the subinterpreter_before_main failure.\n\nThe pre_init needs to check if it is in a subinterpreter or not. But in 3.13+ this static initializer runs in the main interpreter.  So we need to check this later, during the exec phase.\n\n* Continue to do the ensure in both places, there might be a reason it was where it was...\n\nShould not hurt anything to do it extra times here.\n\n* Change get_num_interpreters_seen to a boolean flag instead.\n\nThe count was not used, it was just checked for \u003e 1, we now accomplish this by setting the flag.\n\n* Spelling typo\n\n* Work around older python versions, only need this check for newish versions\n\n* Add more comments for test case\n\n* Add more comments for test case\n\n* Stop traceback propagation\n\n* Re-enable subinterpreter support on ubuntu 3.14 builds\n\nWas disabled in e4873e8\n\n* As suggested, don\u0027t use an anonymous namespace.\n\n* Typo in test assert format string\n\n* Use a more appropriate function name\n\n* Fix mod_per_interpreter_gil* output directory on Windows/MSVC\n\nOn Windows with MSVC (multi-configuration generators), CMake uses\nconfig-specific properties like LIBRARY_OUTPUT_DIRECTORY_DEBUG when\nset, otherwise falls back to LIBRARY_OUTPUT_DIRECTORY/\u003cConfig\u003e/.\n\nThe main test modules (pybind11_tests, etc.) correctly set both\nLIBRARY_OUTPUT_DIRECTORY and the config-specific variants (lines\n517-528), so they output directly to tests/.\n\nHowever, the mod_per_interpreter_gil* modules only copied the base\nLIBRARY_OUTPUT_DIRECTORY property, causing them to be placed in\ntests/Debug/ instead of tests/.\n\nThis mismatch caused test_import_in_subinterpreter_concurrently and\nrelated tests to fail with ModuleNotFoundError on Windows Python 3.14,\nbecause the test code sets sys.path based on pybind11_tests.__file__\n(which is in tests/) but tries to import mod_per_interpreter_gil_with_singleton\n(which ended up in tests/Debug/).\n\nThis bug was previously masked by @pytest.mark.xfail decorators on\nthese tests. Now that the underlying \"Duplicate C++ type registration\"\nissue is fixed and the xfails are removed, this path issue surfaced.\n\nThe fix mirrors the same pattern used for main test targets: also set\nLIBRARY_OUTPUT_DIRECTORY_\u003cCONFIG\u003e for each configuration type.\n\n* Remove unneeded `pytest.importorskip`\n\n* Remove comment\n\n---------\n\nCo-authored-by: b-pass \u003cb-pass@users.noreply.github.com\u003e\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f5569e3a92727fe7b70dcb21854b8694599320d4",
      "old_mode": 33188,
      "old_path": ".github/workflows/ci.yml",
      "new_id": "22c1f489c4bee65da1631737c3c6c1774163e9e6",
      "new_mode": 33188,
      "new_path": ".github/workflows/ci.yml"
    },
    {
      "type": "modify",
      "old_id": "ce9014a7e96d8655a3aa4e10703726ed1a55126b",
      "old_mode": 33188,
      "old_path": "include/pybind11/detail/common.h",
      "new_id": "4406adf5b65ac89e0ce8e23a94389f9320ea38d3",
      "new_mode": 33188,
      "new_path": "include/pybind11/detail/common.h"
    },
    {
      "type": "modify",
      "old_id": "95c1f2dfc146f44e46a3446cfc027de51ed0932c",
      "old_mode": 33188,
      "old_path": "include/pybind11/detail/internals.h",
      "new_id": "a92f196b1f0fd6625be4a316003adabd556034d3",
      "new_mode": 33188,
      "new_path": "include/pybind11/detail/internals.h"
    },
    {
      "type": "modify",
      "old_id": "a820bfbfc335922794209a36eb324ca9b7c5528f",
      "old_mode": 33188,
      "old_path": "include/pybind11/embed.h",
      "new_id": "c05887c33d714a45bfb074efe56393b288a53c4d",
      "new_mode": 33188,
      "new_path": "include/pybind11/embed.h"
    },
    {
      "type": "modify",
      "old_id": "3c8ed84dfca5caff2dd04c370d714fd75a85a97f",
      "old_mode": 33188,
      "old_path": "include/pybind11/gil_safe_call_once.h",
      "new_id": "770ed49998b14bbb945aa7677ada2d3531776184",
      "new_mode": 33188,
      "new_path": "include/pybind11/gil_safe_call_once.h"
    },
    {
      "type": "modify",
      "old_id": "aaf5204570809dd01784e73deb7aee3cec1086b2",
      "old_mode": 33188,
      "old_path": "include/pybind11/subinterpreter.h",
      "new_id": "c47787b6ef300c480742ca6066af858ab0dc641b",
      "new_mode": 33188,
      "new_path": "include/pybind11/subinterpreter.h"
    },
    {
      "type": "modify",
      "old_id": "3d618662f9ce5e52b610f4fdbb41167066621ca0",
      "old_mode": 33188,
      "old_path": "tests/CMakeLists.txt",
      "new_id": "15e18705bee72743dc8a38ef5e14471310931d29",
      "new_mode": 33188,
      "new_path": "tests/CMakeLists.txt"
    },
    {
      "type": "modify",
      "old_id": "874b93c77ff3561cc872a52c054ddafe9beebe22",
      "old_mode": 33188,
      "old_path": "tests/mod_per_interpreter_gil_with_singleton.cpp",
      "new_id": "90e2ec8389337810328e75c43f30f6d373fd2026",
      "new_mode": 33188,
      "new_path": "tests/mod_per_interpreter_gil_with_singleton.cpp"
    },
    {
      "type": "modify",
      "old_id": "f706e9282b09fe266fc0b56805bfdf3806323e20",
      "old_mode": 33188,
      "old_path": "tests/test_multiple_interpreters.py",
      "new_id": "aadf3d96bbd815bbd91743df721ab4b392bc7139",
      "new_mode": 33188,
      "new_path": "tests/test_multiple_interpreters.py"
    },
    {
      "type": "modify",
      "old_id": "b17b6fbc36c24c7f308135e70915db8c9dcbb53c",
      "old_mode": 33188,
      "old_path": "tests/test_with_catch/test_subinterpreter.cpp",
      "new_id": "e322e0fe90c4dca2d6afb7674576e17cd3e0b530",
      "new_mode": 33188,
      "new_path": "tests/test_with_catch/test_subinterpreter.cpp"
    }
  ]
}
