aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/kernel/Generator.ml4
-rw-r--r--lib/kernel/SubstantialRelation.ml2
2 files changed, 3 insertions, 3 deletions
diff --git a/lib/kernel/Generator.ml b/lib/kernel/Generator.ml
index e4a15f8..f9aafb0 100644
--- a/lib/kernel/Generator.ml
+++ b/lib/kernel/Generator.ml
@@ -47,8 +47,8 @@ class producer_cursor produce on_release =
method! release =
(match state with
- | `Live _ -> Option.iter (fun f -> f ()) on_release
- | `Fresh | `Done -> ());
+ | `Fresh | `Live _ -> Option.iter (fun f -> f ()) on_release
+ | `Done -> ());
state <- `Done
end
diff --git a/lib/kernel/SubstantialRelation.ml b/lib/kernel/SubstantialRelation.ml
index d3f306b..ec2a01f 100644
--- a/lib/kernel/SubstantialRelation.ml
+++ b/lib/kernel/SubstantialRelation.ml
@@ -131,9 +131,9 @@ module Make (S : Abstract.Storage.STORAGE) = struct
let scan storage relation ~keep =
let open Utilities.Result in
let* tx = S.start_read storage in
- let* node = tuple_node tx relation in
let closed = ref false in
let close () = if not !closed then begin closed := true; ignore (S.abort tx) end in
+ let* node = tuple_node tx relation |> Result.map_error (fun c -> close (); c) in
(* The fold is suspended by [yield], so the tree is walked one node
and one tuple at a time rather than materialized before the
first tuple is produced. *)