mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-117657: TSAN fix race on gstate->young.count (#118313)
				
					
				
			This commit is contained in:
		
							parent
							
								
									79688b5b0e
								
							
						
					
					
						commit
						2ba1aed596
					
				
					 2 changed files with 13 additions and 13 deletions
				
			
		|  | @ -1044,9 +1044,20 @@ record_deallocation(PyThreadState *tstate) | |||
| } | ||||
| 
 | ||||
| static void | ||||
| gc_collect_internal(PyInterpreterState *interp, struct collection_state *state) | ||||
| gc_collect_internal(PyInterpreterState *interp, struct collection_state *state, int generation) | ||||
| { | ||||
|     _PyEval_StopTheWorld(interp); | ||||
| 
 | ||||
|     // update collection and allocation counters
 | ||||
|     if (generation+1 < NUM_GENERATIONS) { | ||||
|         state->gcstate->old[generation].count += 1; | ||||
|     } | ||||
| 
 | ||||
|     state->gcstate->young.count = 0; | ||||
|     for (int i = 1; i <= generation; ++i) { | ||||
|         state->gcstate->old[i-1].count = 0; | ||||
|     } | ||||
| 
 | ||||
|     // merge refcounts for all queued objects
 | ||||
|     merge_all_queued_objects(interp, state); | ||||
|     process_delayed_frees(interp); | ||||
|  | @ -1115,7 +1126,6 @@ gc_collect_internal(PyInterpreterState *interp, struct collection_state *state) | |||
| static Py_ssize_t | ||||
| gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason) | ||||
| { | ||||
|     int i; | ||||
|     Py_ssize_t m = 0; /* # objects collected */ | ||||
|     Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */ | ||||
|     PyTime_t t1 = 0;   /* initialize to prevent a compiler warning */ | ||||
|  | @ -1161,15 +1171,6 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason) | |||
|         PyDTrace_GC_START(generation); | ||||
|     } | ||||
| 
 | ||||
|     /* update collection and allocation counters */ | ||||
|     if (generation+1 < NUM_GENERATIONS) { | ||||
|         gcstate->old[generation].count += 1; | ||||
|     } | ||||
|     gcstate->young.count = 0; | ||||
|     for (i = 1; i <= generation; i++) { | ||||
|         gcstate->old[i-1].count = 0; | ||||
|     } | ||||
| 
 | ||||
|     PyInterpreterState *interp = tstate->interp; | ||||
| 
 | ||||
|     struct collection_state state = { | ||||
|  | @ -1177,7 +1178,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyGC_Reason reason) | |||
|         .gcstate = gcstate, | ||||
|     }; | ||||
| 
 | ||||
|     gc_collect_internal(interp, &state); | ||||
|     gc_collect_internal(interp, &state, generation); | ||||
| 
 | ||||
|     m = state.collected; | ||||
|     n = state.uncollectable; | ||||
|  |  | |||
|  | @ -27,7 +27,6 @@ race:_PyObject_GC_TRACK | |||
| race:_PyParkingLot_Park | ||||
| race:_PyType_HasFeature | ||||
| race:assign_version_tag | ||||
| race:gc_collect_main | ||||
| race:gc_restore_tid | ||||
| race:initialize_new_array | ||||
| race:insertdict | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alex Turner
						Alex Turner