@@ -254,7 +254,7 @@ let[@inline never] try_resize t r new_capacity =
254
254
true
255
255
end
256
256
257
- let rec adjust_estimated_size t r mask delta =
257
+ let rec adjust_estimated_size t r mask delta result =
258
258
let i = Multicore_magic. instantaneous_domain_index () in
259
259
let n = Array. length r.non_linearizable_size in
260
260
if i < n then begin
@@ -273,7 +273,7 @@ let rec adjust_estimated_size t r mask delta =
273
273
&& estimated_size + estimated_size + estimated_size < capacity
274
274
then try_resize t r (capacity lsr 1 ) |> ignore
275
275
end ;
276
- true
276
+ result
277
277
end
278
278
else
279
279
let new_cs =
@@ -289,7 +289,7 @@ let rec adjust_estimated_size t r mask delta =
289
289
|> Multicore_magic. copy_as_padded
290
290
in
291
291
let r = if Atomic. compare_and_set t r new_r then new_r else Atomic. get t in
292
- adjust_estimated_size t r mask delta
292
+ adjust_estimated_size t r mask delta result
293
293
294
294
(* *)
295
295
@@ -341,14 +341,14 @@ let rec try_add t key value backoff =
341
341
| B Nil ->
342
342
let after = Cons { key; value; rest = Nil } in
343
343
if Atomic. compare_and_set b (B Nil ) (B after) then
344
- adjust_estimated_size t r mask 1
344
+ adjust_estimated_size t r mask 1 true
345
345
else try_add t key value (Backoff. once backoff)
346
346
| B (Cons _ as before ) ->
347
347
if assoc_node r.equal key before != Nil then false
348
348
else
349
349
let after = Cons { key; value; rest = before } in
350
350
if Atomic. compare_and_set b (B before) (B after) then
351
- adjust_estimated_size t r mask 1
351
+ adjust_estimated_size t r mask 1 true
352
352
else try_add t key value (Backoff. once backoff)
353
353
| B (Resize _ ) -> try_add t key value Backoff. default
354
354
@@ -361,32 +361,39 @@ let[@tail_mod_cons] rec dissoc t key = function
361
361
| Cons r ->
362
362
if t key r.key then r.rest else Cons { r with rest = dissoc t key r.rest }
363
363
364
- let rec try_remove t key backoff =
364
+ let rec remove_node t key backoff =
365
365
let r = get t in
366
366
let h = r.hash key in
367
367
let mask = Array. length r.buckets - 1 in
368
368
let i = h land mask in
369
369
let b = Array. unsafe_get r.buckets i in
370
370
match Atomic. get b with
371
- | B Nil -> false
371
+ | B Nil -> Nil
372
372
| B (Cons cons_r as before ) -> begin
373
373
if r.equal cons_r.key key then
374
374
if Atomic. compare_and_set b (B before) (B cons_r.rest) then
375
- adjust_estimated_size t r mask (- 1 )
376
- else try_remove t key (Backoff. once backoff)
375
+ adjust_estimated_size t r mask (- 1 ) before
376
+ else remove_node t key (Backoff. once backoff)
377
377
else
378
378
match dissoc r.equal key cons_r.rest with
379
379
| (Nil | Cons _ ) as rest ->
380
380
if
381
381
Atomic. compare_and_set b (B before)
382
382
(B (Cons { cons_r with rest }))
383
- then adjust_estimated_size t r mask (- 1 )
384
- else try_remove t key (Backoff. once backoff)
385
- | exception Not_found -> false
383
+ then
384
+ assoc_node r.equal key cons_r.rest
385
+ |> adjust_estimated_size t r mask (- 1 )
386
+ else remove_node t key (Backoff. once backoff)
387
+ | exception Not_found -> Nil
386
388
end
387
- | B (Resize _ ) -> try_remove t key Backoff. default
389
+ | B (Resize _ ) -> remove_node t key Backoff. default
390
+
391
+ let try_remove t key = remove_node t key Backoff. default != Nil
388
392
389
- let try_remove t key = try_remove t key Backoff. default
393
+ let remove_exn t key =
394
+ match remove_node t key Backoff. default with
395
+ | Nil -> raise_notrace Not_found
396
+ | Cons r -> r.value
390
397
391
398
(* *)
392
399
0 commit comments