Skip to content

Commit d9132a7

Browse files
committed
Prefer begin ... end for statements and matches where needed
1 parent 1c2256f commit d9132a7

File tree

10 files changed

+172
-113
lines changed

10 files changed

+172
-113
lines changed

.ocamlformat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
profile = default
22
version = 0.25.1
3+
4+
exp-grouping=preserve

src/kcas/kcas.ml

Lines changed: 85 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -197,20 +197,22 @@ let rec release_after casn = function
197197
| NIL -> true
198198
| CASN { state; lt; gt; awaiters; _ } ->
199199
if lt != NIL then release_after casn lt |> ignore;
200-
if not (is_cmp casn state) then (
200+
if not (is_cmp casn state) then begin
201201
state.before <- state.after;
202202
state.casn <- casn_after;
203-
resume_awaiters awaiters);
203+
resume_awaiters awaiters
204+
end;
204205
release_after casn gt
205206

206207
let rec release_before casn = function
207208
| NIL -> false
208209
| CASN { state; lt; gt; awaiters; _ } ->
209210
if lt != NIL then release_before casn lt |> ignore;
210-
if not (is_cmp casn state) then (
211+
if not (is_cmp casn state) then begin
211212
state.after <- state.before;
212213
state.casn <- casn_before;
213-
resume_awaiters awaiters);
214+
resume_awaiters awaiters
215+
end;
214216
release_before casn gt
215217

216218
let release casn cass = function
@@ -219,7 +221,7 @@ let release casn cass = function
219221

220222
let rec verify casn = function
221223
| NIL -> `After
222-
| CASN { loc; state; lt; gt; _ } -> (
224+
| CASN { loc; state; lt; gt; _ } -> begin
223225
if lt == NIL then
224226
(* Fenceless is safe as [finish] has a fence after. *)
225227
if is_cmp casn state && fenceless_get (as_atomic loc) != state then
@@ -232,7 +234,8 @@ let rec verify casn = function
232234
if is_cmp casn state && fenceless_get (as_atomic loc) != state then
233235
`Before
234236
else verify casn gt
235-
| `Before -> `Before)
237+
| `Before -> `Before
238+
end
236239

237240
let finish casn (`Undetermined cass as undetermined) (status : determined) =
238241
if Atomic.compare_and_set casn (undetermined :> status) (status :> status)
@@ -282,9 +285,11 @@ let rec determine casn status = function
282285
before the [compare_and_set], because afterwards is too
283286
late as some other domain might finish the operation after
284287
the [compare_and_set] and miss the awaiters. *)
285-
(match current.awaiters with
286-
| [] -> ()
287-
| awaiters -> record.awaiters <- awaiters);
288+
begin
289+
match current.awaiters with
290+
| [] -> ()
291+
| awaiters -> record.awaiters <- awaiters
292+
end;
288293
if Atomic.compare_and_set (as_atomic loc) current state then
289294
let a_cmp_followed_by_a_cas = a_cas * 2 land (status * 4) in
290295
determine casn
@@ -297,7 +302,7 @@ let rec determine casn status = function
297302
and is_after casn =
298303
(* Fenceless at most gives old [Undetermined] and causes extra work. *)
299304
match fenceless_get casn with
300-
| `Undetermined cass as undetermined -> (
305+
| `Undetermined cass as undetermined -> begin
301306
match determine casn 0 cass with
302307
| status ->
303308
finish casn undetermined
@@ -306,7 +311,8 @@ and is_after casn =
306311
else `Before)
307312
| exception Exit ->
308313
(* Fenceless is safe as there was a fence before. *)
309-
fenceless_get casn == `After)
314+
fenceless_get casn == `After
315+
end
310316
| `After -> true
311317
| `Before -> false
312318

@@ -421,13 +427,14 @@ let rec remove_awaiter loc before awaiter =
421427
let block timeout loc before =
422428
let t = Domain_local_await.prepare_for_await () in
423429
let alive = Timeout.await timeout t.release in
424-
if add_awaiter loc before t.release then (
430+
if add_awaiter loc before t.release then begin
425431
try t.await ()
426432
with cancellation_exn ->
427433
let backtrace = Printexc.get_raw_backtrace () in
428434
remove_awaiter loc before t.release;
429435
Timeout.cancel_alive alive;
430-
Printexc.raise_with_backtrace cancellation_exn backtrace);
436+
Printexc.raise_with_backtrace cancellation_exn backtrace
437+
end;
431438
Timeout.unawait timeout alive
432439

433440
let rec update_no_alloc timeout backoff loc state f =
@@ -437,14 +444,16 @@ let rec update_no_alloc timeout backoff loc state f =
437444
match f before with
438445
| after ->
439446
state.after <- after;
440-
if before == after then (
447+
if before == after then begin
441448
Timeout.cancel timeout;
442-
before)
443-
else if Atomic.compare_and_set (as_atomic loc) state_old state then (
449+
before
450+
end
451+
else if Atomic.compare_and_set (as_atomic loc) state_old state then begin
444452
state.before <- after;
445453
resume_awaiters state_old.awaiters;
446454
Timeout.cancel timeout;
447-
before)
455+
before
456+
end
448457
else update_no_alloc timeout (Backoff.once backoff) loc state f
449458
| exception Retry.Later ->
450459
block timeout loc before;
@@ -457,15 +466,17 @@ let update_with_state timeout backoff loc f state_old =
457466
let before = eval state_old in
458467
match f before with
459468
| after ->
460-
if before == after then (
469+
if before == after then begin
461470
Timeout.cancel timeout;
462-
before)
471+
before
472+
end
463473
else
464474
let state = new_state after in
465-
if Atomic.compare_and_set (as_atomic loc) state_old state then (
475+
if Atomic.compare_and_set (as_atomic loc) state_old state then begin
466476
resume_awaiters state_old.awaiters;
467477
Timeout.cancel timeout;
468-
before)
478+
before
479+
end
469480
else update_no_alloc timeout (Backoff.once backoff) loc state f
470481
| exception Retry.Later ->
471482
let state = new_state before in
@@ -479,9 +490,10 @@ let rec exchange_no_alloc backoff loc state =
479490
let state_old = Atomic.get (as_atomic loc) in
480491
let before = eval state_old in
481492
if before == state.after then before
482-
else if Atomic.compare_and_set (as_atomic loc) state_old state then (
493+
else if Atomic.compare_and_set (as_atomic loc) state_old state then begin
483494
resume_awaiters state_old.awaiters;
484-
before)
495+
before
496+
end
485497
else exchange_no_alloc (Backoff.once backoff) loc state
486498

487499
let is_obstruction_free casn loc =
@@ -495,9 +507,10 @@ let rec cas_with_state loc before state state_old =
495507
|| before == if is_after state_old.casn then after' else before')
496508
&& (before == state.after
497509
||
498-
if Atomic.compare_and_set (as_atomic loc) state_old state then (
510+
if Atomic.compare_and_set (as_atomic loc) state_old state then begin
499511
resume_awaiters state_old.awaiters;
500-
true)
512+
true
513+
end
501514
else
502515
(* We must retry, because compare is by value rather than by state.
503516
@@ -610,10 +623,11 @@ let insert cass loc state =
610623
CASN { loc; state; lt = NIL; gt = cass; awaiters = [] }
611624
| CASN { loc = a; gt = NIL; _ } when a.id < x ->
612625
CASN { loc; state; lt = cass; gt = NIL; awaiters = [] }
613-
| _ -> (
626+
| _ -> begin
614627
match splay ~hit_parent:false x cass with
615628
| _, Hit _, _ -> overlap ()
616-
| lt, Miss, gt -> CASN { loc; state; lt; gt; awaiters = [] })
629+
| lt, Miss, gt -> CASN { loc; state; lt; gt; awaiters = [] }
630+
end
617631
[@@inline]
618632

619633
module Op = struct
@@ -710,9 +724,10 @@ module Xt = struct
710724
let c1 = c0 + 1 in
711725
xt.validate_counter <- c1;
712726
(* Validate whenever counter reaches next power of 2. *)
713-
if c0 land c1 = 0 then (
727+
if c0 land c1 = 0 then begin
714728
Timeout.check (timeout_as_atomic xt);
715-
validate_all xt.casn xt.cass)
729+
validate_all xt.casn xt.cass
730+
end
716731
[@@inline]
717732

718733
let update0 loc f xt lt gt =
@@ -735,15 +750,16 @@ module Xt = struct
735750

736751
let update loc f xt state' lt gt =
737752
let state = Obj.magic state' in
738-
if is_cmp xt.casn state then (
753+
if is_cmp xt.casn state then begin
739754
let before = eval state in
740755
let after = f before in
741756
let state =
742757
if before == after then state
743758
else { before; after; casn = xt.casn; awaiters = [] }
744759
in
745760
xt.cass <- CASN { loc; state; lt; gt; awaiters = [] };
746-
before)
761+
before
762+
end
747763
else
748764
let current = state.after in
749765
let state = { state with after = f current } in
@@ -762,10 +778,11 @@ module Xt = struct
762778
update0 loc f xt cass NIL
763779
| CASN { loc = a; state; lt; gt; _ } when Obj.magic a == loc ->
764780
update loc f xt state lt gt
765-
| cass -> (
781+
| cass -> begin
766782
match splay ~hit_parent:false x cass with
767783
| l, Miss, r -> update0 loc f xt l r
768-
| l, Hit (_loc', state'), r -> update loc f xt state' l r)
784+
| l, Hit (_loc', state'), r -> update loc f xt state' l r
785+
end
769786
[@@inline]
770787

771788
let protect xt f x =
@@ -811,12 +828,13 @@ module Xt = struct
811828
| CASN { loc = a; gt = NIL; _ } when a.id < x -> ()
812829
| CASN { loc = a; state; _ } when Obj.magic a == loc ->
813830
validate_one xt.casn a state
814-
| cass -> (
831+
| cass -> begin
815832
match splay ~hit_parent:true x cass with
816833
| lt, Hit (a, state), gt ->
817834
xt.cass <- CASN { loc = a; state; lt; gt; awaiters = [] };
818835
if Obj.magic a == loc then validate_one xt.casn a state
819-
| _, Miss, _ -> impossible ())
836+
| _, Miss, _ -> impossible ()
837+
end
820838

821839
let is_in_log ~xt loc =
822840
let x = loc.id in
@@ -825,19 +843,20 @@ module Xt = struct
825843
| CASN { loc = a; lt = NIL; _ } when x < a.id -> false
826844
| CASN { loc = a; gt = NIL; _ } when a.id < x -> false
827845
| CASN { loc = a; _ } when Obj.magic a == loc -> true
828-
| cass -> (
846+
| cass -> begin
829847
match splay ~hit_parent:true x cass with
830848
| lt, Hit (a, state), gt ->
831849
xt.cass <- CASN { loc = a; state; lt; gt; awaiters = [] };
832850
Obj.magic a == loc
833-
| _, Miss, _ -> impossible ())
851+
| _, Miss, _ -> impossible ()
852+
end
834853

835854
let rec rollback casn cass_snap cass =
836855
if cass_snap == cass then cass
837856
else
838857
match cass with
839858
| NIL -> NIL
840-
| CASN { loc; state; lt; gt; _ } -> (
859+
| CASN { loc; state; lt; gt; _ } -> begin
841860
match splay ~hit_parent:false loc.id cass_snap with
842861
| lt_mark, Miss, gt_mark ->
843862
let lt = rollback casn lt_mark lt
@@ -854,7 +873,8 @@ module Xt = struct
854873
| lt_mark, Hit (loc, state), gt_mark ->
855874
let lt = rollback casn lt_mark lt
856875
and gt = rollback casn gt_mark gt in
857-
CASN { loc; state; lt; gt; awaiters = [] })
876+
CASN { loc; state; lt; gt; awaiters = [] }
877+
end
858878

859879
type 'x snap = cass * Action.t
860880

@@ -866,10 +886,11 @@ module Xt = struct
866886

867887
let rec first ~xt tx = function
868888
| [] -> tx ~xt
869-
| tx' :: txs -> (
889+
| tx' :: txs -> begin
870890
match tx ~xt with
871891
| value -> value
872-
| exception Retry.Later -> first ~xt tx' txs)
892+
| exception Retry.Later -> first ~xt tx' txs
893+
end
873894

874895
let first ~xt = function
875896
| [] -> Retry.later ()
@@ -881,7 +902,7 @@ module Xt = struct
881902

882903
let rec add_awaiters awaiter casn = function
883904
| NIL as cont -> cont
884-
| CASN { loc; state; lt; gt; _ } as stop -> (
905+
| CASN { loc; state; lt; gt; _ } as stop -> begin
885906
match if lt == NIL then lt else add_awaiters awaiter casn lt with
886907
| NIL ->
887908
if
@@ -890,17 +911,19 @@ module Xt = struct
890911
awaiter
891912
then add_awaiters awaiter casn gt
892913
else stop
893-
| CASN _ as stop -> stop)
914+
| CASN _ as stop -> stop
915+
end
894916

895917
let rec remove_awaiters awaiter casn stop = function
896918
| NIL -> ()
897919
| CASN { loc; state; lt; gt; _ } as current ->
898920
if lt != NIL then remove_awaiters awaiter casn stop lt;
899-
if current != stop then (
921+
if current != stop then begin
900922
remove_awaiter loc
901923
(if is_cmp casn state then eval state else state.before)
902924
awaiter;
903-
remove_awaiters awaiter casn stop gt)
925+
remove_awaiters awaiter casn stop gt
926+
end
904927

905928
let initial_validate_period = 16
906929

@@ -917,43 +940,47 @@ module Xt = struct
917940

918941
let rec commit backoff mode xt tx =
919942
match tx ~xt with
920-
| result -> (
943+
| result -> begin
921944
match xt.cass with
922945
| NIL ->
923946
Timeout.cancel (timeout_as_atomic xt);
924947
Action.run xt.post_commit result
925948
| CASN { loc; state; lt = NIL; gt = NIL; _ } ->
926-
if is_cmp xt.casn state then (
949+
if is_cmp xt.casn state then begin
927950
Timeout.cancel (timeout_as_atomic xt);
928-
Action.run xt.post_commit result)
951+
Action.run xt.post_commit result
952+
end
929953
else
930954
let before = state.before in
931955
state.before <- state.after;
932956
state.casn <- casn_after;
933957
(* Fenceless is safe inside transactions as each log update has a fence. *)
934958
let state_old = fenceless_get (as_atomic loc) in
935-
if cas_with_state loc before state state_old then (
959+
if cas_with_state loc before state state_old then begin
936960
Timeout.cancel (timeout_as_atomic xt);
937-
Action.run xt.post_commit result)
961+
Action.run xt.post_commit result
962+
end
938963
else commit (Backoff.once backoff) mode (reset_quick xt) tx
939-
| cass -> (
964+
| cass -> begin
940965
match determine_for_owner xt.casn cass with
941966
| true ->
942967
Timeout.cancel (timeout_as_atomic xt);
943968
Action.run xt.post_commit result
944969
| false -> commit (Backoff.once backoff) mode (reset mode xt) tx
945970
| exception Mode.Interference ->
946971
commit (Backoff.once backoff) Mode.lock_free
947-
(reset Mode.lock_free xt) tx))
972+
(reset Mode.lock_free xt) tx
973+
end
974+
end
948975
| exception Retry.Invalid ->
949976
Timeout.check (timeout_as_atomic xt);
950977
commit (Backoff.once backoff) mode (reset_quick xt) tx
951-
| exception Retry.Later -> (
978+
| exception Retry.Later -> begin
952979
if xt.cass == NIL then invalid_retry ();
953980
let t = Domain_local_await.prepare_for_await () in
954981
let alive = Timeout.await (timeout_as_atomic xt) t.release in
955982
match add_awaiters t.release xt.casn xt.cass with
956-
| NIL -> (
983+
| NIL -> begin
957984
match t.await () with
958985
| () ->
959986
remove_awaiters t.release xt.casn NIL xt.cass;
@@ -963,11 +990,13 @@ module Xt = struct
963990
let backtrace = Printexc.get_raw_backtrace () in
964991
remove_awaiters t.release xt.casn NIL xt.cass;
965992
Timeout.cancel_alive alive;
966-
Printexc.raise_with_backtrace cancellation_exn backtrace)
993+
Printexc.raise_with_backtrace cancellation_exn backtrace
994+
end
967995
| CASN _ as stop ->
968996
remove_awaiters t.release xt.casn stop xt.cass;
969997
Timeout.unawait (timeout_as_atomic xt) alive;
970-
commit (Backoff.once backoff) mode (reset_quick xt) tx)
998+
commit (Backoff.once backoff) mode (reset_quick xt) tx
999+
end
9711000
| exception exn ->
9721001
Timeout.cancel (timeout_as_atomic xt);
9731002
raise exn

0 commit comments

Comments
 (0)