Skip to content

Commit ee8ea09

Browse files
Use MCPAccess.A for MHP check instead of custom construct
Co-authored-by: Simmo Saan <[email protected]>
1 parent b9a045c commit ee8ea09

File tree

1 file changed

+15
-21
lines changed

1 file changed

+15
-21
lines changed

src/analyses/pthreadBarriers.ml

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)