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.

Merge pull request #14210 from gasche/weak_array_par-2

runtime: clean ephemeron data using relaxed atomic writes

authored by

Gabriel Scherer and committed by
GitHub
5bdf43c6 0fbf4a64

+9 -3
+4
Changes
··· 405 405 uses of libraries bundled with the compiler (unix,re,threads,dynlink) 406 406 (Florian Angeletti, report by Ali Caglayan, review by Gabriel Scherer) 407 407 408 + - #14210: fix TSan-reported data race in weak pointers runtime 409 + (Gabriel Scherer and Damien Doligez, report by Olivier Nicole, 410 + review by KC Sivaramakrishnan) 411 + 408 412 - #14213: Fix shadow-stack-related crashes with TSan 409 413 (Olivier Nicole, report by Nathan Taylor, review by Gabriel Scherer and 410 414 Stefan Muenzel)
+1
runtime/caml/weak.h
··· 75 75 76 76 #define Ephe_link(e) (*(Op_val(e) + CAML_EPHE_LINK_OFFSET)) 77 77 #define Ephe_data(e) (*(Op_val(e) + CAML_EPHE_DATA_OFFSET)) 78 + #define Ephe_data_addr(e) (Op_atomic_val(e) + CAML_EPHE_DATA_OFFSET) 78 79 79 80 value caml_ephe_await_key(value ephe, uintnat i); 80 81
+1
runtime/major_gc.c
··· 21 21 #include <stdbool.h> 22 22 23 23 #include "caml/addrmap.h" 24 + #include "caml/camlatomic.h" 24 25 #include "caml/config.h" 25 26 #include "caml/codefrag.h" 26 27 #include "caml/domain.h"
+1 -1
runtime/minor_gc.c
··· 758 758 } else { 759 759 /* collected */ 760 760 v = caml_ephe_none; 761 - Ephe_data(re->ephe) = caml_ephe_none; 761 + atomic_store_relaxed(Ephe_data_addr(re->ephe), caml_ephe_none); 762 762 } 763 763 atomic_store_release(Op_atomic_val(re->ephe) + re->offset, v); 764 764 }
+2 -2
runtime/weak.c
··· 139 139 if (Tag_val(elt) == Infix_tag) elt -= Infix_offset_val(elt); 140 140 if (is_unmarked(elt)) { 141 141 Field(e, offset) = caml_ephe_none; 142 - Field(e,CAML_EPHE_DATA_OFFSET) = caml_ephe_none; 142 + atomic_store_relaxed(Ephe_data_addr(e), caml_ephe_none); 143 143 } 144 144 } 145 145 } ··· 183 183 child = Ephe_data(v); 184 184 if (child != caml_ephe_none) { 185 185 if (release_data) { 186 - Field(v, CAML_EPHE_DATA_OFFSET) = caml_ephe_none; 186 + atomic_store_relaxed(Ephe_data_addr(v), caml_ephe_none); 187 187 } 188 188 #ifdef DEBUG 189 189 else if (Is_block (child) && !Is_young (child)) {