From 6a5b186d2b53cf2c3e3a7ed5c238d26367a9df96 Mon Sep 17 00:00:00 2001 From: gareuselesinge Date: Fri, 30 Aug 2013 12:20:10 +0000 Subject: recdef: restore old semantics (pre STM) The Stm commit switched from an home made handling of failures to a with_state_protection. This was wrong, since in case of success the global state has to be left altered. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@16746 85f007b7-540e-0410-9357-904b9bb8a0f7 --- lib/future.ml | 5 +++++ lib/future.mli | 2 ++ 2 files changed, 7 insertions(+) (limited to 'lib') diff --git a/lib/future.ml b/lib/future.ml index 1e9cada513..d8f7b3a947 100644 --- a/lib/future.ml +++ b/lib/future.ml @@ -111,6 +111,11 @@ let purify f x = v with e -> let e = Errors.push e in !unfreeze state; raise e +let transactify f x = + let state = !freeze () in + try f x + with e -> let e = Errors.push e in !unfreeze state; raise e + let purify_future f x = match !x with | Val _ | Exn _ | Delegated | Dropped -> f x diff --git a/lib/future.mli b/lib/future.mli index 39be0c1806..f07d325e03 100644 --- a/lib/future.mli +++ b/lib/future.mli @@ -59,4 +59,6 @@ val set_freeze : (unit -> Dyn.t) -> (Dyn.t -> unit) -> unit (* Once set_freeze is called we can purify a computation *) val purify : ('a -> 'b) -> 'a -> 'b +(* And also let a function alter the state but backtrack if it raises exn *) +val transactify : ('a -> 'b) -> 'a -> 'b -- cgit v1.2.3