The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Make object stat counters atomic (#13880)

In a codebase where a lot of object were being created in parallel,
thread sanitizer reported races, which seem to be from these counters.

authored by

Dimitris Mostrous and committed by
GitHub
af77a8a9 aef1937e

+14 -8
+3
Changes
··· 488 488 Cmm to prevent bugs linked to incorrect handling of coeffects. 489 489 (Vincent Laviron, review by Gabriel Scherer) 490 490 491 + - #13880: Make object stat counters atomic 492 + (Dimitris Mostrous, review by Gabriel Scherer and Nicolás Ojeda Bär) 493 + 491 494 OCaml 5.3.0 (8 January 2025) 492 495 ---------------------------- 493 496
+2
stdlib/.depend
··· 163 163 stdlib__Map.cmi \ 164 164 stdlib__List.cmi \ 165 165 stdlib__Char.cmi \ 166 + stdlib__Atomic.cmi \ 166 167 stdlib__Array.cmi \ 167 168 camlinternalOO.cmi 168 169 camlinternalOO.cmx : \ ··· 172 173 stdlib__Map.cmx \ 173 174 stdlib__List.cmx \ 174 175 stdlib__Char.cmx \ 176 + stdlib__Atomic.cmx \ 175 177 stdlib__Array.cmx \ 176 178 camlinternalOO.cmi 177 179 camlinternalOO.cmi : \
+9 -8
stdlib/camlinternalOO.ml
··· 113 113 initializers = []; 114 114 size = 0 } 115 115 116 - let table_count = ref 0 116 + let table_count = Atomic.make 0 117 117 118 118 (* dummy_met should be a pointer, so use an atom *) 119 119 let dummy_met : item = Obj.obj (Obj.new_block 0 0) ··· 125 125 fit_size ((n+1)/2) * 2 126 126 127 127 let new_table pub_labels = 128 - incr table_count; 128 + Atomic.incr table_count; 129 129 let len = Array.length pub_labels in 130 130 let methods = Array.make (len*2+2) dummy_met in 131 131 methods.(0) <- Obj.magic len; ··· 154 154 155 155 (**** Classes ****) 156 156 157 - let method_count = ref 0 158 - let inst_var_count = ref 0 157 + let method_count = Atomic.make 0 158 + let inst_var_count = Atomic.make 0 159 159 160 160 (* type t *) 161 161 type meth = item ··· 178 178 Array.map (get_method_label table) names 179 179 180 180 let set_method table label element = 181 - incr method_count; 181 + Atomic.incr method_count; 182 182 if Labs.find label table.methods_by_label then 183 183 put table label element 184 184 else ··· 309 309 table 310 310 311 311 let init_class table = 312 - inst_var_count := !inst_var_count + table.size - 1; 312 + ignore (Atomic.fetch_and_add inst_var_count (table.size - 1)); 313 313 table.initializers <- List.rev table.initializers; 314 314 resize table (3 + Obj.magic table.methods.(1) * 16 / Sys.word_size) 315 315 ··· 608 608 { classes: int; methods: int; inst_vars: int; } 609 609 610 610 let stats () = 611 - { classes = !table_count; 612 - methods = !method_count; inst_vars = !inst_var_count; } 611 + { classes = Atomic.get table_count; 612 + methods = Atomic.get method_count; 613 + inst_vars = Atomic.get inst_var_count; }