@@ -23,21 +23,16 @@ struct
2323
2424 module TID = ThreadIdDomain. ThreadLifted
2525
26- module MHPplusLock = struct
27- module Locks = LockDomain. MustLockset
28-
29- include Printable. Prod (MHP ) (Locks )
30- let name () = " MHPplusLock"
31-
32- let mhp (mhp1 , l1 ) (mhp2 , l2 ) =
33- MHP. may_happen_in_parallel mhp1 mhp2 && Locks. is_empty (Locks. inter l1 l2)
34-
35- let tid ((mhp :MHP.t ), _ ) = mhp.tid
36-
37- let is_unique_thread (mhp , _ ) = MHP. is_unique_thread mhp
26+ (* Tracking TID separately, as there is no type-safe way to get it from MCPATuple *)
27+ module MCPAPlusTID = struct
28+ include Printable. Prod (MCPAccess. A ) (TID )
29+ let name () = " MCPAPlusTID"
3830 end
3931
40- module Waiters = SetDomain. ToppedSet (MHPplusLock ) (struct let topname = " All MHP" end )
32+ let part_access man : MCPAccess.A.t =
33+ Obj. obj (man.ask (PartAccess Point ))
34+
35+ module Waiters = SetDomain. ToppedSet (MCPAPlusTID ) (struct let topname = " All MHP" end )
4136 module Multiprocess = BoolDomain. MayBool
4237 module G = Lattice. Prod3 (Multiprocess ) (Capacity ) (Waiters )
4338
@@ -70,20 +65,20 @@ struct
7065 | BarrierWait barrier ->
7166 let ask = Analyses. ask_of_man man in
7267 let may, must = man.local in
68+ let mcpa = part_access man in
69+ let tid = ThreadId. get_current ask in
7370 let barriers = possible_vinfos ask barrier in
74- let mhp = MHP. current ask in
7571 let handle_one b =
7672 try
77- let locks = man.ask (Queries. MustLockset ) in
78- man.sideg b (Multiprocess. bot () , Capacity. bot () , Waiters. singleton (mhp, locks));
73+ man.sideg b (Multiprocess. bot () , Capacity. bot () , Waiters. singleton (mcpa, tid));
7974 let addr = ValueDomain.Addr. of_var b in
8075 let (multiprocess, capacity, waiters) = man.global b in
8176 let may = Barriers. add addr may in
8277 if multiprocess then
8378 (may, must)
8479 else
85- let relevant_waiters = Waiters. filter (fun other -> MHPplusLock. mhp (mhp, locks) other ) waiters in
86- if Waiters. exists (fun t -> not @@ MHPplusLock. is_unique_thread t) relevant_waiters then
80+ let relevant_waiters = Waiters. filter (fun ( othermcpa , _ ) -> MCPAccess.A. may_race mcpa othermcpa ) waiters in
81+ if Waiters. exists (fun ( t , _ ) -> MCPAccess.A. may_race t t) relevant_waiters then
8782 (may, must)
8883 else
8984 match capacity with
@@ -107,16 +102,15 @@ struct
107102 let can_proceed_pred seq =
108103 let rec doit seq = match Seq. uncons seq with
109104 | None -> true
110- | Some (h , t ) -> Seq. for_all (MHPplusLock. mhp h ) t && (doit [@ tailcall]) t
105+ | Some (( h , _ ), t ) -> Seq. for_all (fun ( x , _ ) -> MCPAccess.A. may_race h x ) t && (doit [@ tailcall]) t
111106 in
112107 doit seq
113108 in
114109 let can_proceed = exists_k can_proceed_pred (min_cap - 1 ) relevant_waiters in
115110 if not can_proceed then raise Analyses. Deadcode ;
116111 (* limit to this case to avoid having to construct all permutations above *)
117112 if BatList. compare_length_with waiters (min_cap - 1 ) = 0 then
118- List. fold_left (fun acc elem ->
119- let tid = MHPplusLock. tid elem in
113+ List. fold_left (fun acc (_ ,tid ) ->
120114 let curr = MustObserved. find tid acc in
121115 let must' = MustObserved. add tid (Barriers. add addr curr) acc in
122116 must'
0 commit comments