Title: Isolate the faulthandler Module Between Interpreters · Issue #101509 · python/cpython · GitHub
Open Graph Title: Isolate the faulthandler Module Between Interpreters · Issue #101509 · python/cpython
X Title: Isolate the faulthandler Module Between Interpreters · Issue #101509 · python/cpython
Description: (See gh-100227.) Currently the faulthandler module has some state in _PyRuntimeState, including objects, which is shared by all interpreters. Interpreters should be isolated from each other, for a variety of reasons (including the possib...
Open Graph Description: (See gh-100227.) Currently the faulthandler module has some state in _PyRuntimeState, including objects, which is shared by all interpreters. Interpreters should be isolated from each other, for a ...
X Description: (See gh-100227.) Currently the faulthandler module has some state in _PyRuntimeState, including objects, which is shared by all interpreters. Interpreters should be isolated from each other, for a ...
Opengraph URL: https://github.com/python/cpython/issues/101509
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Isolate the faulthandler Module Between Interpreters","articleBody":"(See gh-100227.)\r\n\r\nCurrently the faulthandler module has some state in `_PyRuntimeState`, including objects, which is shared by all interpreters. Interpreters should be isolated from each other, for a variety of reasons (including the possibility of a per-interpreter GIL). Isolating the module will involve moving some of the state to `PyInterpreterState` (and, under per-interpreter GIL, guarding other state with a global lock).\r\n\r\n----\r\n\r\nCode Analysis:\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e(expand)\u003c/summary\u003e\r\n\r\n## Signals\r\n\r\nThe module installs handlers for various signals.\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e(expand)\u003c/summary\u003e\r\n\r\n\u003cBR/\u003e\r\nfatal:\r\n\r\n* `SIGBUS` - bus error\r\n* `SIGILL` - illegal instruction\r\n* `SIGFPE` - floating point exception\r\n* `SIGABRT` - abort\r\n* `SIGSEGV` - segfault\r\n\r\n\"user\":\r\n\r\n* the 5 fatal signals\r\n* others (up to `Py_NSIG`)\r\n\r\nhandlers:\r\n\r\n* `faulthandler_fatal_error(signum)`\r\n* `faulthandler_exc_handler()` (on Windows)\r\n* `faulthandler_user()`\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n## State\r\n\r\n### Fields\r\n\r\nhttps://github.com/python/cpython/blob/main/Include/internal/pycore_faulthandler.h#L49-L86\r\nhttps://github.com/python/cpython/blob/main/Include/internal/pycore_runtime.h#L146\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003eraw\u003c/summary\u003e\r\n\r\nhttps://github.com/python/cpython/blob/62251c3da06eb4662502295697f39730565b1717/Include/internal/pycore_faulthandler.h#L49-L86\r\nhttps://github.com/python/cpython/blob/62251c3da06eb4662502295697f39730565b1717/Include/internal/pycore_faulthandler.h#L36-L46\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003etables:\u003c/summary\u003e\r\n\r\n\u003cBR/\u003e\r\n\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**type**\u003c/p\u003e | \u003cp align=\"center\"\u003e**\\#ifdef**\u003c/p\u003e | \u003cp align=\"center\"\u003e**notes**\u003c/p\u003e |\r\n| ---- | ---- | ---- | ---- |\r\n| `fatal_error` | | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `enabled` | `bool` | | \"is faulthandler enabled?\" |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `file` | **`PyObject *`** | | only for keeping `.fd` alive |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `fd` | `int` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `all_threads` | `bool` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `interp` | **`PyInterpreterState *`** | | show only its threads\u003cBR/\u003ethe one that enabled faulthandler |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `exc_handler` | `void *` | `MS_WINDOWS` | |\r\n| | | | |\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**type**\u003c/p\u003e | \u003cp align=\"center\"\u003e**\\#ifdef**\u003c/p\u003e | \u003cp align=\"center\"\u003e**notes**\u003c/p\u003e |\r\n| `thread` | --- | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `file` | *`PyObject *`* | | only for keeping `.fd` alive |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `fd` | `int` | | defaults to `sys.stderr` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `timeout_us` | `PY_TIMEOUT_T` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `repeat` | `bool` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `interp` | **`PyInterpreterState *`** | | show only its threads\u003cBR/\u003ethe one that requested the info |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `exit` | `bool` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `header` | `char *` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `header_len` | `size_t` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `cancel_event` | **`PyThread_type_lock`** | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `running` | **`PyThread_type_lock`** | | |\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**type**\u003c/p\u003e | \u003cp align=\"center\"\u003e**\\#ifdef**\u003c/p\u003e | \u003cp align=\"center\"\u003e**notes**\u003c/p\u003e |\r\n| `user_signals` | **`struct faulthandler_user_signal *`** | `FAULTHANDLER_USER` | a dynamically allocated array (`Py_NSIG`) |\r\n| `user_signals[signum]` | --- | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `enabled` | `bool` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `file` | `PyObject *` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `fd` | `int` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `all_threads` | `bool` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `chain` | `bool` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `previous` | `_Py_sighandler_t` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `interp` | **`PyInterpreterState *`** | | show only its threads\u003cBR/\u003ethe one that added the handler |\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**type**\u003c/p\u003e | \u003cp align=\"center\"\u003e**\\#ifdef**\u003c/p\u003e | \u003cp align=\"center\"\u003e**notes**\u003c/p\u003e |\r\n| `old_stack` | `stack_t` | `FAULTHANDLER_USE_ALT_STACK` | |\r\n| `stack` | `stack_t` | `FAULTHANDLER_USE_ALT_STACK` | |\r\n\r\n\u003c/details\u003e\r\n\r\n\r\n### Usage\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003esimple:\u003c/summary\u003e\r\n\r\n\u003cBR/\u003e\r\n\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**context**\u003c/p\u003e | \u003cp align=\"center\"\u003e**get**\u003c/p\u003e | \u003cp align=\"center\"\u003e**set**\u003c/p\u003e |\r\n| ---- | ---- | ---- | ---- |\r\n| `fatal_error` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `enabled` | module | `faulthandler_is_enabled()` | `faulthandler_disable_py()` |\r\n| | signal | `faulthandler_fatal_error()` | |\r\n| | internal | `faulthandler_enable()`\u003cBR/\u003e`faulthandler_disable()` | `faulthandler_enable()`\u003cBR/\u003e`faulthandler_disable()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `file` | module | `faulthandler_traverse()` | `faulthandler_py_enable()`\u003cBR/\u003e`faulthandler_traverse()` |\r\n| | internal | `faulthandler_disable()` | `faulthandler_disable()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `fd` | | module | | `faulthandler_py_enable()` |\r\n| | signal | `faulthandler_fatal_error()`\u003cBR/\u003e`faulthandler_exc_handler()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `all_threads` | module | | `faulthandler_py_enable()` |\r\n| | signal | `faulthandler_fatal_error()`\u003cBR/\u003e`faulthandler_exc_handler()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `interp` | module | | `faulthandler_py_enable()` |\r\n| | internal | `faulthandler_fatal_error()`\u003cBR/\u003e`faulthandler_exc_handler()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `exc_handler` | internal | `faulthandler_enable()`\u003cBR/\u003e`faulthandler_disable()` | `faulthandler_enable()`\u003cBR/\u003e`faulthandler_disable()` |\r\n| | | |\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**context**\u003c/p\u003e | \u003cp align=\"center\"\u003e**get**\u003c/p\u003e | \u003cp align=\"center\"\u003e**set**\u003c/p\u003e |\r\n| `thread` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `file` | module | `faulthandler_dump_traceback_later()`\u003cBR/\u003e`faulthandler_traverse()` | `faulthandler_dump_traceback_later()`\u003cBR/\u003e`faulthandler_traverse()` |\r\n| | internal | `cancel_dump_traceback_later()` | `cancel_dump_traceback_later()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `fd` |\r\n module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `timeout_us` | module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `repeat` | module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `interp` | module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `exit` | module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `header` | module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| | internal | `cancel_dump_traceback_later()` | `cancel_dump_traceback_later()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `header_len` | module | | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `cancel_event` | module | `faulthandler_dump_traceback_later()` | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| | internal | `cancel_dump_traceback_later()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `running` | module | `faulthandler_dump_traceback_later()` | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` | |\r\n| | internal | `cancel_dump_traceback_later()` | |\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**context**\u003c/p\u003e | \u003cp align=\"center\"\u003e**get**\u003c/p\u003e | \u003cp align=\"center\"\u003e**set**\u003c/p\u003e |\r\n| `user_signals` | module | `faulthandler_register_py()`\u003cBR/\u003e`faulthandler_unregister_py()` | `faulthandler_register_py()`\u003cBR/\u003e`faulthandler_traverse()` |\r\n| | C-API | `_PyFaulthandler_Fini()` | `_PyFaulthandler_Fini()` |\r\n| | signal | `faulthandler_user()` | |\r\n| `user_signals[signum]` | | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `enabled` | module | `faulthandler_register_py()` | `faulthandler_register_py()` |\r\n| | signal | `faulthandler_user()` | |\r\n| | internal | `faulthandler_unregister()` | `faulthandler_unregister()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `file` | module | `faulthandler_register_py()`\u003cBR/\u003e`faulthandler_traverse()` | `faulthandler_register_py()`\u003cBR/\u003e`faulthandler_traverse()` |\r\n| | internal | `faulthandler_unregister()` | `faulthandler_unregister()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `fd` | module | | `faulthandler_register_py()` |\r\n| | signal | `faulthandler_user()` | |\r\n| | internal | | `faulthandler_unregister()` |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `all_threads` | module | | `faulthandler_register_py()` |\r\n| | signal | `faulthandler_user()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `chain` | module | | `faulthandler_register_py()` |\r\n| | signal | `faulthandler_user()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `previous` | module | | `faulthandler_register_py()` |\r\n| | signal | `faulthandler_user()` | |\r\n| | internal | `faulthandler_unregister()` | |\r\n| \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;. `interp` | module | | `faulthandler_register_py()` |\r\n| | signal | `faulthandler_user()` | |\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**context**\u003c/p\u003e | \u003cp align=\"center\"\u003e**get**\u003c/p\u003e | \u003cp align=\"center\"\u003e**set**\u003c/p\u003e |\r\n| `stack` | C-API | `_PyFaulthandler_Init()`\u003cBR/\u003e`_PyFaulthandler_Fini()` | |\r\n| | internal | `faulthandler_enable()`\u003cBR/\u003e`faulthandler_register()`\u003cBR/\u003e`faulthandler_allocate_stack()` | |\r\n| `old_stack` | C-API | `_PyFaulthandler_Fini()` | |\r\n\r\n\u003c/details\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003emodify data in complex fields:\u003c/summary\u003e\r\n\r\n\u003cBR/\u003e\r\n\r\n| \u003cp align=\"center\"\u003e**name**\u003c/p\u003e | \u003cp align=\"center\"\u003e**context**\u003c/p\u003e | \u003cp align=\"center\"\u003e**calls**\u003c/p\u003e |\r\n| ---- | ---- | ---- |\r\n| `fatal_error .fd` | signal | `faulthandler_fatal_error()` -\u003e `faulthandler_dump_traceback()`\u003cBR/\u003e`faulthandler_fatal_error()` -\u003e `_Py_DumpExtensionModules()`\u003cBR/\u003e`faulthandler_exc_handler()`\u003cBR/\u003e`faulthandler_exc_handler()` -\u003e `_Py_DumpHexadecimal()`\u003cBR/\u003e`faulthandler_exc_handler()` -\u003e `faulthandler_dump_traceback()` |\r\n| `thread.fd` | thread | `faulthandler_thread()` -\u003e `_Py_write_noraise()`\u003cBR/\u003e`faulthandler_thread()` -\u003e `_Py_DumpTracebackThreads()` |\r\n| `thread .cancel_event` | module | `faulthandler_dump_traceback_later()` |\r\n| | C-API | `_PyFaulthandler_Fini()` |\r\n| | thread | `faulthandler_thread()` |\r\n| | internal | `cancel_dump_traceback_later()` |\r\n| `thread .running` | module | `faulthandler_dump_traceback_later()` |\r\n| | thread | `faulthandler_thread()` |\r\n| | internal | `cancel_dump_traceback_later()` |\r\n| `user_signals[signum] .fd` | signal | `faulthandler_user()` -\u003e `faulthandler_dump_traceback()` |\r\n| `stack` | C-API | `_PyFaulthandler_Init()`\u003cBR/\u003e`_PyFaulthandler_Fini()` |\r\n| | internal | `faulthandler_allocate_stack()` |\r\n| `old_stack` | internal | `faulthandler_allocate_stack()` -\u003e `sigaltstack()` |\r\n\r\n\u003c/details\u003e\r\n\r\n\u003c/details\u003e","author":{"url":"https://github.com/ericsnowcurrently","@type":"Person","name":"ericsnowcurrently"},"datePublished":"2023-02-01T22:37:12.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/101509/cpython/issues/101509"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:95e83049-d5d6-a477-313a-ff283e0a72fc |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | C844:31E362:276E3C:34B237:69697968 |
| html-safe-nonce | 6ee4a1d6ffcdc536392dce3afdd6113cd07d932a526ea07ee2ff5da1fa51f50f |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDODQ0OjMxRTM2MjoyNzZFM0M6MzRCMjM3OjY5Njk3OTY4IiwidmlzaXRvcl9pZCI6IjEzMjM1NTAwNDcyNjA0NzM3MDQiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 824a3a4a6f58cdfe3d8bbfccc91fb1023f89c0065a4ece8ac8101a660b4ead9d |
| hovercard-subject-tag | issue:1566956108 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/101509/issue_layout |
| twitter:image | https://opengraph.githubassets.com/1ee4482f0c6676b3dfc539ba442415a44c02dbcfa5eb522ae4b9a06d7084eeab/python/cpython/issues/101509 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/1ee4482f0c6676b3dfc539ba442415a44c02dbcfa5eb522ae4b9a06d7084eeab/python/cpython/issues/101509 |
| og:image:alt | (See gh-100227.) Currently the faulthandler module has some state in _PyRuntimeState, including objects, which is shared by all interpreters. Interpreters should be isolated from each other, for a ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | ericsnowcurrently |
| hostname | github.com |
| expected-hostname | github.com |
| None | c6f193beb8ff08443adc07685d75302ab8aaf0a135f6e251c3ff3112c8deb881 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 212e3e3d3298bf5b313830edfd2399e869f7ea76 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width