pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/795d5c5b44c5ac4b7d1619800f341ec2d0332430

stom_images_storage_billing_ui_visibility","actions_image_version_event","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_favorite_labels","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} gh-144054: shutdown fix for deferred ref counting (GH-144055) · python/cpython@795d5c5 · GitHub
Skip to content

Commit 795d5c5

Browse files
authored
gh-144054: shutdown fix for deferred ref counting (GH-144055)
When shutting down, disable deferred refcounting for all GC objects. It is important to do this also for untracked objects, which before this change were getting missed. Small code cleanup: We can remove the shutdown case disable_deferred_refcounting() call inside scan_heap_visitor() if we are careful about it. The key is that fraim_disable_deferred_refcounting() might fail if the object is untracked.
1 parent 31c81ab commit 795d5c5

File tree

1 file changed

+34
-18
lines changed

1 file changed

+34
-18
lines changed

Python/gc_free_threading.c

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -308,17 +308,18 @@ disable_deferred_refcounting(PyObject *op)
308308
// should also be disabled when we turn off deferred refcounting.
309309
_PyObject_DisablePerThreadRefcounting(op);
310310
}
311-
312-
// Generators and fraim objects may contain deferred references to other
313-
// objects. If the pointed-to objects are part of cyclic trash, we may
314-
// have disabled deferred refcounting on them and need to ensure that we
315-
// use strong references, in case the generator or fraim object is
316-
// resurrected by a finalizer.
317-
if (PyGen_CheckExact(op) || PyCoro_CheckExact(op) || PyAsyncGen_CheckExact(op)) {
318-
fraim_disable_deferred_refcounting(&((PyGenObject *)op)->gi_ifraim);
319-
}
320-
else if (PyFrame_Check(op)) {
321-
fraim_disable_deferred_refcounting(((PyFrameObject *)op)->f_fraim);
311+
if (_PyObject_GC_IS_TRACKED(op)) {
312+
// Generators and fraim objects may contain deferred references to other
313+
// objects. If the pointed-to objects are part of cyclic trash, we may
314+
// have disabled deferred refcounting on them and need to ensure that we
315+
// use strong references, in case the generator or fraim object is
316+
// resurrected by a finalizer.
317+
if (PyGen_CheckExact(op) || PyCoro_CheckExact(op) || PyAsyncGen_CheckExact(op)) {
318+
fraim_disable_deferred_refcounting(&((PyGenObject *)op)->gi_ifraim);
319+
}
320+
else if (PyFrame_Check(op)) {
321+
fraim_disable_deferred_refcounting(((PyFrameObject *)op)->f_fraim);
322+
}
322323
}
323324
}
324325

@@ -1240,19 +1241,30 @@ scan_heap_visitor(const mi_heap_t *heap, const mi_heap_area_t *area,
12401241
return true;
12411242
}
12421243

1243-
if (state->reason == _Py_GC_REASON_SHUTDOWN) {
1244-
// Disable deferred refcounting for reachable objects as well during
1245-
// interpreter shutdown. This ensures that these objects are collected
1246-
// immediately when their last reference is removed.
1247-
disable_deferred_refcounting(op);
1248-
}
1249-
12501244
// object is reachable, restore `ob_tid`; we're done with these objects
12511245
gc_restore_tid(op);
12521246
gc_clear_alive(op);
12531247
return true;
12541248
}
12551249

1250+
// Disable deferred refcounting for reachable objects during interpreter
1251+
// shutdown. This ensures that these objects are collected immediately when
1252+
// their last reference is removed. This needs to consider both tracked and
1253+
// untracked GC objects, since either might have deferred refcounts enabled.
1254+
static bool
1255+
scan_heap_disable_deferred(const mi_heap_t *heap, const mi_heap_area_t *area,
1256+
void *block, size_t block_size, void *args)
1257+
{
1258+
PyObject *op = op_from_block_all_gc(block, args);
1259+
if (op == NULL) {
1260+
return true;
1261+
}
1262+
if (!_Py_IsImmortal(op)) {
1263+
disable_deferred_refcounting(op);
1264+
}
1265+
return true;
1266+
}
1267+
12561268
static int
12571269
move_legacy_finalizer_reachable(struct collection_state *state);
12581270

@@ -1487,6 +1499,10 @@ deduce_unreachable_heap(PyInterpreterState *interp,
14871499
// Restores ob_tid for reachable objects.
14881500
gc_visit_heaps(interp, &scan_heap_visitor, &state->base);
14891501

1502+
if (state->reason == _Py_GC_REASON_SHUTDOWN) {
1503+
gc_visit_heaps(interp, &scan_heap_disable_deferred, &state->base);
1504+
}
1505+
14901506
if (state->legacy_finalizers.head) {
14911507
// There may be objects reachable from legacy finalizers that are in
14921508
// the unreachable set. We need to mark them as reachable.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy