@@ -545,7 +545,7 @@ clear_tree(S=#state{index=Index}) ->
545545 S3 # state {built = false , expired = false }.
546546
547547destroy_trees (S ) ->
548- S2 = close_trees (S ),
548+ S2 = close_trees (S , true ),
549549 {_ ,Tree0 } = hd (S # state .trees ), % deliberately using state with live db ref
550550 hashtree :destroy (Tree0 ),
551551 S2 .
@@ -563,7 +563,11 @@ maybe_build(S) ->
563563% %
564564% % @doc Flush and close the trees if not closed already.
565565-spec close_trees (# state {}) -> # state {}.
566- close_trees (S = # state {trees = Trees , closed = false }) ->
566+ close_trees (State ) ->
567+ close_trees (State , false ).
568+
569+ -spec close_trees (# state {}, SkipUpdate :: boolean ()) -> # state {}.
570+ close_trees (S = # state {trees = Trees , closed = false }, _WillDestroy = false ) ->
567571 Trees2 = [begin
568572 NewTree =
569573 try hashtree :next_rebuild (Tree ) of
@@ -584,11 +588,19 @@ close_trees(S=#state{trees=Trees, closed=false}) ->
584588 end ,
585589 {IdxN , NewTree }
586590 end || {IdxN , Tree } <- Trees ],
587- Trees3 = [{IdxN , hashtree :close (Tree )} || {IdxN , Tree } <- Trees2 ],
588- S # state {trees = Trees3 , closed = true };
589- close_trees (S ) ->
591+ really_close_trees (Trees2 , S );
592+ close_trees (# state {trees = Trees , closed = false }= State , _WillDestroy = true ) ->
593+ really_close_trees (Trees , State );
594+ close_trees (S , _ ) ->
590595 S .
591596
597+ really_close_trees (Trees2 , S ) ->
598+ lists :foreach (fun really_close_tree /1 , Trees2 ),
599+ S # state {trees = undefined , closed = true }.
600+
601+ really_close_tree ({_IdxN , Tree }) ->
602+ hashtree :close (Tree ).
603+
592604-spec build_or_rehash (pid (), state ()) -> ok .
593605build_or_rehash (Tree , S ) ->
594606 Type = case load_built (S ) of
0 commit comments