summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dev-ml/eliom/eliom-5.0.0-r2.ebuild8
-rw-r--r--dev-ml/eliom/eliom-9999.ebuild4
-rw-r--r--dev-ml/eliom/files/ocsigen28.patch500
-rw-r--r--dev-ml/eliom/files/reactivedata.patch44
4 files changed, 551 insertions, 5 deletions
diff --git a/dev-ml/eliom/eliom-5.0.0-r2.ebuild b/dev-ml/eliom/eliom-5.0.0-r2.ebuild
index 6b4ae4b4ce7e..0807fa3c4eb2 100644
--- a/dev-ml/eliom/eliom-5.0.0-r2.ebuild
+++ b/dev-ml/eliom/eliom-5.0.0-r2.ebuild
@@ -17,10 +17,10 @@ IUSE="doc +ocamlopt +ppx"
RDEPEND=">=dev-lang/ocaml-4.03:=[ocamlopt?]
>=dev-ml/js_of_ocaml-2.8.2:=
- >=www-servers/ocsigenserver-2.5:=
+ >=www-servers/ocsigenserver-2.8:=
>=dev-ml/tyxml-4:=
>=dev-ml/deriving-0.6:=
- >=dev-ml/reactiveData-0.2:=
+ >=dev-ml/reactiveData-0.2.1:=
dev-ml/ocaml-ipaddr:=
dev-ml/react:=
dev-ml/ocaml-ssl:=
@@ -35,7 +35,9 @@ DEPEND="${RDEPEND}
src_prepare() {
epatch "${FILESDIR}/"{camlp4,oc43,oc43-2}.patch \
"${FILESDIR}/tyxml4.patch" \
- "${FILESDIR}/jsofocaml-282.patch"
+ "${FILESDIR}/jsofocaml-282.patch" \
+ "${FILESDIR}/reactivedata.patch" \
+ "${FILESDIR}/ocsigen28.patch"
}
src_compile() {
diff --git a/dev-ml/eliom/eliom-9999.ebuild b/dev-ml/eliom/eliom-9999.ebuild
index f40896552289..bc9355f30ded 100644
--- a/dev-ml/eliom/eliom-9999.ebuild
+++ b/dev-ml/eliom/eliom-9999.ebuild
@@ -25,10 +25,10 @@ IUSE="doc +ocamlopt +ppx"
RDEPEND=">=dev-lang/ocaml-4.03:=[ocamlopt?]
>=dev-ml/js_of_ocaml-2.5-r1:=
- >=www-servers/ocsigenserver-2.5:=
+ >=www-servers/ocsigenserver-2.8:=
>=dev-ml/tyxml-4:=
>=dev-ml/deriving-0.6:=
- >=dev-ml/reactiveData-0.2:=
+ >=dev-ml/reactiveData-0.2.1:=
dev-ml/ocaml-ipaddr:=
dev-ml/react:=
dev-ml/ocaml-ssl:=
diff --git a/dev-ml/eliom/files/ocsigen28.patch b/dev-ml/eliom/files/ocsigen28.patch
new file mode 100644
index 000000000000..fb3ef0a3cf26
--- /dev/null
+++ b/dev-ml/eliom/files/ocsigen28.patch
@@ -0,0 +1,500 @@
+Index: eliom-5.0.0/src/lib/eliom_common.server.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_common.server.ml
++++ eliom-5.0.0/src/lib/eliom_common.server.ml
+@@ -1372,7 +1372,7 @@ let create_persistent_table name =
+
+ let persistent_cookies_table :
+ (full_state_name * float option * timeout * perssessgrp option)
+- Ocsipersist.table Lazy.t =
++ Ocsipersist.table Lwt.t Lazy.t =
+ lazy (create_persistent_table eliom_persistent_cookie_table)
+ (* Another tables, containing the session info for each cookie *)
+ (* the table contains:
+@@ -1390,7 +1390,7 @@ let persistent_cookies_table :
+ let remove_from_all_persistent_tables key =
+ Perstables.fold (* could be replaced by a parallel map *)
+ (fun thr t -> thr >>= fun () ->
+- Ocsipersist.remove (Ocsipersist.open_table t) key >>= Lwt_unix.yield)
++ Ocsipersist.open_table t >>= fun table -> Ocsipersist.remove table key >>= Lwt_unix.yield)
+ (return ())
+ !perstables
+
+Index: eliom-5.0.0/src/lib/eliom_common.server.mli
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_common.server.mli
++++ eliom-5.0.0/src/lib/eliom_common.server.mli
+@@ -609,10 +609,10 @@ module Perstables :
+ val fold : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
+ end
+ val perstables : string list ref
+-val create_persistent_table : string -> 'a Ocsipersist.table
++val create_persistent_table : string -> 'a Ocsipersist.table Lwt.t
+ val persistent_cookies_table :
+ (full_state_name * float option * timeout * perssessgrp option)
+- Ocsipersist.table Lazy.t
++ Ocsipersist.table Lwt.t Lazy.t
+ val remove_from_all_persistent_tables : string -> unit Lwt.t
+ val absolute_change_sitedata : sitedata -> unit
+ val get_current_sitedata : unit -> sitedata
+Index: eliom-5.0.0/src/lib/eliom_reference.server.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_reference.server.ml
++++ eliom-5.0.0/src/lib/eliom_reference.server.ml
+@@ -32,8 +32,8 @@ type 'a eref_kind =
+ | Ref of 'a lazy_t ref (* Ocaml reference *)
+ | Vol of 'a volatile_table Lazy.t (* Vol. table (group, session, process) *)
+ | Ocsiper of 'a option Ocsipersist.t Lwt.t (* Global persist. table *)
+- | Ocsiper_sit of 'a Ocsipersist.table (* Persist. table for site *)
+- | Per of 'a persistent_table (* Persist. table for group session or process *)
++ | Ocsiper_sit of 'a Ocsipersist.table Lwt.t (* Persist. table for site *)
++ | Per of 'a persistent_table Lwt.t (* Persist. table for group session or process *)
+
+ type volatile = [ `Volatile ]
+ type persistent = [ `Persistent ]
+@@ -174,9 +174,7 @@ let eref_from_fun_ ~ext ~scope ?secure ?
+ | None -> (Volatile.eref_from_fun_ ~ext ~scope ?secure f :> _ eref)
+ | Some name ->
+ (f, ext,
+- Ocsiper (Ocsipersist.make_persistent
+- ~store:pers_ref_store
+- ~name ~default:None))
++ Ocsiper (pers_ref_store >>= fun store -> Ocsipersist.make_persistent ~store ~name ~default:None))
+ end
+ | `Site ->
+ begin
+@@ -207,6 +205,7 @@ let get_site_id () =
+ let get (f, _, table as eref) =
+ match table with
+ | Per t ->
++ t >>= fun t ->
+ (get_persistent_data ~table:t () >>= function
+ | Data d -> Lwt.return d
+ | _ ->
+@@ -221,6 +220,7 @@ let get (f, _, table as eref) =
+ Ocsipersist.set r (Some value) >>= fun () ->
+ Lwt.return value)
+ | Ocsiper_sit t ->
++ t >>= fun t ->
+ (let site_id = get_site_id () in
+ try_lwt Ocsipersist.find t site_id
+ with Not_found ->
+@@ -231,9 +231,10 @@ let get (f, _, table as eref) =
+
+ let set (_, _, table as eref) value =
+ match table with
+- | Per t -> set_persistent_data ~table:t value
++ | Per t -> t >>= fun t -> set_persistent_data ~table:t value
+ | Ocsiper r -> r >>= fun r -> Ocsipersist.set r (Some value)
+ | Ocsiper_sit t ->
++ t >>= fun t ->
+ Ocsipersist.add t (get_site_id ()) value
+ | _ -> Lwt.return (Volatile.set eref value)
+
+@@ -242,9 +243,10 @@ let modify eref f =
+
+ let unset (f, _, table as eref) =
+ match table with
+- | Per t -> remove_persistent_data ~table:t ()
++ | Per t -> t >>= fun t -> remove_persistent_data ~table:t ()
+ | Ocsiper r -> r >>= fun r -> Ocsipersist.set r None
+ | Ocsiper_sit t ->
++ t >>= fun t ->
+ Ocsipersist.remove t (get_site_id ())
+ | _ -> Lwt.return (Volatile.unset eref)
+
+@@ -258,6 +260,7 @@ module Ext = struct
+ match table with
+ | Vol _ -> Lwt.return (Volatile.Ext.get state r)
+ | Per t ->
++ t >>= fun t ->
+ (Lwt.catch
+ (fun () -> Eliom_state.Ext.Low_level.get_persistent_data
+ ~state ~table:t)
+@@ -279,6 +282,7 @@ module Ext = struct
+ match table with
+ | Vol _ -> Lwt.return (Volatile.Ext.set state r value)
+ | Per t ->
++ t >>= fun t ->
+ Eliom_state.Ext.Low_level.set_persistent_data
+ ~state ~table:t value
+ | _ -> Lwt.fail (Failure "wrong eref for this function")
+@@ -291,7 +295,7 @@ module Ext = struct
+ let state = Eliom_state.Ext.untype_state state in
+ match table with
+ | Vol _ -> Lwt.return (Volatile.Ext.unset state r)
+- | Per t -> Eliom_state.Ext.Low_level.remove_persistent_data
++ | Per t -> t >>= fun t -> Eliom_state.Ext.Low_level.remove_persistent_data
+ ~state ~table:t
+ | _ -> failwith "wrong eref for this function"
+
+Index: eliom-5.0.0/src/lib/eliom_state.server.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_state.server.ml
++++ eliom-5.0.0/src/lib/eliom_state.server.ml
+@@ -918,11 +918,11 @@ type 'a persistent_table =
+ bool *
+ (int64 * 'a) Ocsipersist.table)
+
+-let create_persistent_table ~scope ?secure name : 'a persistent_table =
++let create_persistent_table ~scope ?secure name : 'a persistent_table Lwt.t =
+ let sitedata = Eliom_request_info.find_sitedata "create_persistent_table" in
+ let secure = Eliom_common.get_secure secure sitedata in
+- let t = Eliom_common.create_persistent_table name in
+- (scope, secure, t)
++ Eliom_common.create_persistent_table name >>= fun t ->
++ Lwt.return (scope, secure, t)
+
+ let get_p_table_key_
+ ~table:(scope, secure, table)
+@@ -1271,10 +1271,8 @@ module Ext = struct
+
+ let get_persistent_cookie_info
+ ((_, _, cookie) : ([< Eliom_common.cookie_level ], [ `Pers ]) state) =
+- Ocsipersist.find
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
+- cookie
+- >>= fun v ->
++ Lazy.force Eliommod_persess.persistent_cookies_table >>= fun table ->
++ Ocsipersist.find table cookie >>= fun v ->
+ Lwt.return (cookie, v)
+
+ let discard_state ~state =
+@@ -1487,10 +1485,8 @@ module Ext = struct
+ | None -> TNone
+ | Some t -> TSome t
+ in
+- Ocsipersist.add
+- (Lazy.force Eliom_common.persistent_cookies_table)
+- cookie
+- (fullstname, exp, ti, sessgrp)
++ Lazy.force Eliom_common.persistent_cookies_table >>= fun table ->
++ Ocsipersist.add table cookie (fullstname, exp, ti, sessgrp)
+
+ let get_service_cookie_timeout ~cookie:(_, (_, _, _, r, _, _)) =
+ !r
+@@ -1510,10 +1506,8 @@ module Ext = struct
+
+ let unset_persistent_data_cookie_timeout
+ ~cookie:(cookie, (fullstname, exp, _, sessgrp)) =
+- Ocsipersist.add
+- (Lazy.force Eliom_common.persistent_cookies_table)
+- cookie
+- (fullstname, exp, TGlobal, sessgrp)
++ Lazy.force Eliom_common.persistent_cookies_table >>= fun table ->
++ Ocsipersist.add table cookie (fullstname, exp, TGlobal, sessgrp)
+
+
+ let get_session_group_list () =
+Index: eliom-5.0.0/src/lib/eliom_state.server.mli
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_state.server.mli
++++ eliom-5.0.0/src/lib/eliom_state.server.mli
+@@ -1019,7 +1019,7 @@ val remove_volatile_data :
+ val create_persistent_table :
+ scope:Eliom_common.user_scope ->
+ ?secure:bool ->
+- string -> 'a persistent_table
++ string -> 'a persistent_table Lwt.t
+
+ (** gets persistent session data for the current persistent session (if any).
+ (low level) *)
+Index: eliom-5.0.0/src/lib/server/eliommod_cookies.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_cookies.ml
++++ eliom-5.0.0/src/lib/server/eliommod_cookies.ml
+@@ -152,8 +152,7 @@ let get_cookie_info
+ lazy
+ (catch
+ (fun () ->
+- Ocsipersist.find
+- (Lazy.force Eliom_common.persistent_cookies_table) value >>=
++ Lazy.force Eliom_common.persistent_cookies_table >>= fun table -> Ocsipersist.find table value >>=
+ fun (full_state_name, persexp, perstimeout, sessgrp) ->
+
+ Eliommod_sessiongroups.Pers.up value sessgrp >>= fun () ->
+Index: eliom-5.0.0/src/lib/server/eliommod_gc.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_gc.ml
++++ eliom-5.0.0/src/lib/server/eliommod_gc.ml
+@@ -309,7 +309,8 @@ let persistent_session_gc sitedata =
+ (fun () ->
+ let now = Unix.time () in
+ Lwt_log.ign_info ~section "GC of persistent sessions";
+- (Ocsipersist.iter_table
++ Lazy.force Eliommod_persess.persistent_cookies_table >>=
++ Ocsipersist.iter_table
+ (fun k ((scope, _, _), exp, _, session_group) ->
+ (match exp with
+ | Some exp when exp < now ->
+@@ -320,8 +321,7 @@ let persistent_session_gc sitedata =
+ session_group k
+ (*WAS: remove_from_all_persistent_tables k *)
+ | _ -> return ())
+- )
+- (Lazy.force Eliommod_persess.persistent_cookies_table)))
++ ))
+ >>=
+ f
+ in ignore (f ())
+Index: eliom-5.0.0/src/lib/server/eliommod_pagegen.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_pagegen.ml
++++ eliom-5.0.0/src/lib/server/eliommod_pagegen.ml
+@@ -135,8 +135,9 @@ let update_cookie_table ?now sitedata (c
+ oldv = newc.Eliom_common.pc_value ->
+ catch
+ (fun () ->
++ Lazy.force Eliommod_persess.persistent_cookies_table >>= fun table ->
+ Ocsipersist.replace_if_exists
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
++ table
+ newc.Eliom_common.pc_value
+ (name,
+ newexp,
+@@ -147,8 +148,9 @@ let update_cookie_table ?now sitedata (c
+ (* someone else closed the session *)
+ | e -> fail e)
+ | _ ->
++ Lazy.force Eliommod_persess.persistent_cookies_table >>= fun table ->
+ Ocsipersist.add
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
++ table
+ newc.Eliom_common.pc_value
+ (name,
+ newexp,
+Index: eliom-5.0.0/src/lib/server/eliommod_persess.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_persess.ml
++++ eliom-5.0.0/src/lib/server/eliommod_persess.ml
+@@ -50,7 +50,7 @@ let number_of_persistent_table_elements
+ List.fold_left
+ (fun thr t ->
+ thr >>= fun l ->
+- Ocsipersist.length (Ocsipersist.open_table t) >>= fun e ->
++ Ocsipersist.open_table t >>= fun table -> Ocsipersist.length table >>= fun e ->
+ return ((t, e)::l)) (return []) !perstables
+
+ let close_persistent_state2
+@@ -141,8 +141,7 @@ let rec find_or_create_persistent_cookie
+ (* We do not need to verify if it already exists.
+ make_new_session_id does never generate twice the same cookie. *)
+ let usertimeout = ref Eliom_common.TGlobal (* See global table *) in
+- Ocsipersist.add
+- (Lazy.force persistent_cookies_table) c
++ Lazy.force persistent_cookies_table >>= fun table -> Ocsipersist.add table c
+ (full_st_name,
+ None (* Some 0. *) (* exp on server - We'll change it later *),
+ Eliom_common.TGlobal (* timeout - see global config *),
+Index: eliom-5.0.0/src/lib/server/eliommod_persess.mli
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_persess.mli
++++ eliom-5.0.0/src/lib/server/eliommod_persess.mli
+@@ -22,7 +22,7 @@ val perstables : string list ref
+ val persistent_cookies_table :
+ (Eliom_common.full_state_name * float option * Eliom_common.timeout *
+ Eliom_common.perssessgrp option)
+- Ocsipersist.table Lazy.t
++ Ocsipersist.table Lwt.t Lazy.t
+ val number_of_persistent_tables : unit -> int
+ val number_of_persistent_table_elements : unit -> (string * int) list Lwt.t
+ val close_persistent_state2 :
+Index: eliom-5.0.0/src/lib/server/eliommod_sessadmin.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_sessadmin.ml
++++ eliom-5.0.0/src/lib/server/eliommod_sessadmin.ml
+@@ -94,6 +94,7 @@ let close_all_data_states ~scope ~secure
+
+
+ let close_all_persistent_states2 full_st_name sitedata =
++ Lazy.force Eliommod_persess.persistent_cookies_table >>=
+ Ocsipersist.iter_table
+ (fun k ((scope, _, _) as full_st_name2, old_exp, old_t, sessiongrp) ->
+ if full_st_name = full_st_name2 && old_t = Eliom_common.TGlobal
+@@ -102,7 +103,6 @@ let close_all_persistent_states2 full_st
+ Lwt_unix.yield
+ else return ()
+ )
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
+
+ (** Close all persistent sessions for one session name.
+ If the optional parameter [?state_name] (session name) is not present,
+@@ -195,6 +195,7 @@ let update_pers_exp full_st_name sitedat
+ close_all_persistent_states2 full_st_name sitedata
+ | _ ->
+ let now = Unix.time () in
++ Lazy.force Eliommod_persess.persistent_cookies_table >>= fun table ->
+ Ocsipersist.iter_table
+ (fun k ((scope, _, _) as full_st_name2, old_exp, old_t, sessgrp) ->
+ if full_st_name = full_st_name2 && old_t =
+@@ -211,11 +212,7 @@ let update_pers_exp full_st_name sitedat
+ Eliommod_persess.close_persistent_state2
+ ~scope sitedata sessgrp k
+ | _ ->
+- Ocsipersist.add
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
+- k
+- (full_st_name2, newexp,
+- Eliom_common.TGlobal, sessgrp) >>= Lwt_unix.yield
++ Ocsipersist.add table k (full_st_name2, newexp, Eliom_common.TGlobal, sessgrp) >>= Lwt_unix.yield
+ else return ()
+ )
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
++ table
+Index: eliom-5.0.0/src/lib/server/eliommod_sessexpl.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_sessexpl.ml
++++ eliom-5.0.0/src/lib/server/eliommod_sessexpl.ml
+@@ -57,12 +57,12 @@ let iter_data_cookies f =
+
+ (** Iterator on persistent cookies *)
+ let iter_persistent_cookies f =
++ Lazy.force Eliommod_persess.persistent_cookies_table >>=
+ Ocsipersist.iter_table
+ (fun k v ->
+ f (k, v) >>=
+ Lwt_unix.yield
+ )
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
+
+
+ (** Iterator on service cookies *)
+@@ -94,13 +94,14 @@ let fold_data_cookies f beg =
+
+ (** Iterator on persistent cookies *)
+ let fold_persistent_cookies f beg =
++ Lazy.force Eliommod_persess.persistent_cookies_table >>= fun table ->
+ Ocsipersist.fold_table
+ (fun k v beg ->
+ f (k, v) beg >>= fun res ->
+ Lwt_unix.yield () >>= fun () ->
+ return res
+ )
+- (Lazy.force Eliommod_persess.persistent_cookies_table)
++ table
+ beg
+
+ (*****************************************************************************)
+@@ -121,4 +122,4 @@ let number_of_table_elements () =
+ List.map (fun f -> f ()) !Eliommod_datasess.counttableelements
+
+ let number_of_persistent_cookies () =
+- Ocsipersist.length (Lazy.force Eliommod_persess.persistent_cookies_table)
++ Lazy.force Eliommod_persess.persistent_cookies_table >>= Ocsipersist.length
+Index: eliom-5.0.0/src/lib/server/eliommod_sessiongroups.ml
+===================================================================
+--- eliom-5.0.0.orig/src/lib/server/eliommod_sessiongroups.ml
++++ eliom-5.0.0/src/lib/server/eliommod_sessiongroups.ml
+@@ -413,7 +413,7 @@ module Pers = struct
+ (*VVV Verify this carefully! *)
+ (*VVV VEOcsigen_request_infoFY concurrent access *)
+
+- let grouptable : (nbmax * string list) Ocsipersist.table Lazy.t =
++ let grouptable : (nbmax * string list) Ocsipersist.table Lwt.t Lazy.t =
+ lazy (Ocsipersist.open_table "__eliom_session_group_table")
+ (* It is lazy because if the module is linked statically,
+ the creation of the table must happen after initialisation
+@@ -426,7 +426,7 @@ module Pers = struct
+ | Some g ->
+ Lwt.catch
+ (fun () ->
+- Ocsipersist.find !!grouptable
++ !!grouptable >>= fun grouptable -> Ocsipersist.find grouptable
+ (Eliom_common.string_of_perssessgrp g) >>= fun (_, a) ->
+ Lwt.return a)
+ (function
+@@ -439,7 +439,7 @@ module Pers = struct
+ let sg = Eliom_common.string_of_perssessgrp sg in
+ Lwt.catch
+ (fun () ->
+- Ocsipersist.find !!grouptable sg >>= fun (max2, cl) ->
++ !!grouptable >>= fun grouptable -> Ocsipersist.find grouptable sg >>= fun (max2, cl) ->
+ let max, newmax = match set_max with
+ | None -> ((match max2 with
+ | Default -> defaultmax
+@@ -449,7 +449,7 @@ module Pers = struct
+ | Some (Some v) -> Some v, Val v
+ in
+ let cl, toclose = cut max cl in
+- Ocsipersist.replace_if_exists !!grouptable sg (newmax, (sess_id::cl))
++ Ocsipersist.replace_if_exists grouptable sg (newmax, (sess_id::cl))
+ >>= fun () ->
+ Lwt.return toclose)
+ (function
+@@ -459,7 +459,7 @@ module Pers = struct
+ | Some None -> Nolimit
+ | Some (Some v) -> Val v
+ in
+- Ocsipersist.add !!grouptable sg (max, [sess_id]) >>= fun () ->
++ !!grouptable >>= fun grouptable -> Ocsipersist.add grouptable sg (max, [sess_id]) >>= fun () ->
+ Lwt.return []
+ | e -> Lwt.fail e)
+ | None -> Lwt.return []
+@@ -502,8 +502,7 @@ module Pers = struct
+ belonging to the group grp *)
+ (* group_name is the cookie value *)
+ remove sitedata group_name grp >>= fun () ->
+- Ocsipersist.remove
+- (!!Eliom_common.persistent_cookies_table) group_name
++ !!Eliom_common.persistent_cookies_table >>= fun table -> Ocsipersist.remove table group_name
+ | _ -> Lwt.return ())
+ >>= fun () ->
+
+@@ -511,7 +510,7 @@ module Pers = struct
+ match sess_grp with
+ | Some sg ->
+ let sg = Eliom_common.string_of_perssessgrp sg in
+- Ocsipersist.remove !!grouptable sg
++ !!grouptable >>= fun grouptable -> Ocsipersist.remove grouptable sg
+ | None -> Lwt.return ()
+ )
+ (function Not_found -> Lwt.return () | e -> Lwt.fail e)
+@@ -526,7 +525,7 @@ module Pers = struct
+ match cookie_level with
+ | `Client_process -> begin
+ (* We remove cookie info from the table *)
+- Ocsipersist.remove (!!Eliom_common.persistent_cookies_table) cookie
++ !!Eliom_common.persistent_cookies_table >>= fun table -> Ocsipersist.remove table cookie
+ >>= fun () ->
+
+ (* We remove the session from its group: *)
+@@ -555,7 +554,7 @@ module Pers = struct
+ let sg = Eliom_common.string_of_perssessgrp sg0 in
+ Lwt.catch
+ (fun () ->
+- Ocsipersist.find !!grouptable sg >>= fun (max, cl) ->
++ !!grouptable >>= fun grouptable -> Ocsipersist.find grouptable sg >>= fun (max, cl) ->
+ let newcl = List.remove_first_if_any sess_id cl in
+ (match newcl with
+ | [] ->
+@@ -570,8 +569,8 @@ module Pers = struct
+ remove_group ~cookie_level:`Session sitedata sess_grp
+ | _ -> Lwt.return ()
+ ) >>= fun () ->
+- Ocsipersist.remove !!grouptable sg
+- | _ -> Ocsipersist.replace_if_exists !!grouptable sg (max, newcl)
++ Ocsipersist.remove grouptable sg
++ | _ -> Ocsipersist.replace_if_exists grouptable sg (max, newcl)
+ )
+ )
+ (function
+@@ -586,9 +585,9 @@ module Pers = struct
+ let sg = Eliom_common.string_of_perssessgrp sg in
+ Lwt.catch
+ (fun () ->
+- Ocsipersist.find !!grouptable sg >>= fun (max, cl) ->
++ !!grouptable >>= fun grouptable -> Ocsipersist.find grouptable sg >>= fun (max, cl) ->
+ let newcl = List.remove_first_if_any sess_id cl in
+- Ocsipersist.replace_if_exists !!grouptable sg (max, sess_id::newcl)
++ Ocsipersist.replace_if_exists grouptable sg (max, sess_id::newcl)
+ )
+ (function
+ | Not_found -> Lwt.return ()
+@@ -601,6 +600,6 @@ module Pers = struct
+ end
+ else Lwt.return []
+
+- let nb_of_groups () = Ocsipersist.length !!grouptable
++ let nb_of_groups () = !!grouptable >>= Ocsipersist.length
+
+ end
diff --git a/dev-ml/eliom/files/reactivedata.patch b/dev-ml/eliom/files/reactivedata.patch
new file mode 100644
index 000000000000..190df85cfa1b
--- /dev/null
+++ b/dev-ml/eliom/files/reactivedata.patch
@@ -0,0 +1,44 @@
+Index: eliom-5.0.0/src/lib/eliom_shared.eliom
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_shared.eliom
++++ eliom-5.0.0/src/lib/eliom_shared.eliom
+@@ -288,7 +288,7 @@ module FakeReactiveData = struct
+ val concat : 'a t -> 'a t -> 'a t
+ val value : 'a t -> 'a list
+ val synced : 'a t -> bool
+- val signal : 'a t -> 'a list FakeReact.S.t
++ val signal : ?eq:('a -> 'a -> bool) -> 'a t -> 'a list FakeReact.S.t
+ val singleton_s : 'a FakeReact.S.t -> 'a t
+ val map : ('a -> 'b) -> 'a t -> 'b t
+ val from_signal :
+@@ -304,7 +304,7 @@ module FakeReactiveData = struct
+ let singleton_s s = [FakeReact.S.value s], FakeReact.S.synced s
+ let value (l, _) = l
+ let synced (_, b) = b
+- let signal (l, synced) = fst (FakeReact.S.create ~synced l)
++ let signal ?eq (l, synced) = fst (FakeReact.S.create ~synced l)
+ let map f (l, b) = List.map f l, b
+ let from_signal ?eq s = FakeReact.S.(value s, synced s)
+ module Lwt = struct
+@@ -635,7 +635,7 @@ module ReactiveData = struct
+ let value (s : 'a t) = {shared# 'a list {
+ FakeReactiveData.RList.value (Value.local %s) }}
+
+- let signal (s : 'a t) = {shared# 'a list FakeReact.S.t {
++ let signal ?eq (s : 'a t) = {shared# 'a list FakeReact.S.t {
+ FakeReactiveData.RList.signal (Value.local %s) }}
+
+ let map f s = {shared# 'a FakeReactiveData.RList.t {
+Index: eliom-5.0.0/src/lib/eliom_shared_sigs.shared.mli
+===================================================================
+--- eliom-5.0.0.orig/src/lib/eliom_shared_sigs.shared.mli
++++ eliom-5.0.0/src/lib/eliom_shared_sigs.shared.mli
+@@ -143,7 +143,7 @@ module type RLIST = sig
+
+ val concat : 'a t -> 'a t -> 'a t
+ val value : 'a t -> 'a list Eliom_lib.shared_value
+- val signal : 'a t -> 'a list signal
++ val signal : ?eq:(('a -> 'a -> bool)) -> 'a t -> 'a list signal
+ val singleton_s : 'a signal -> 'a t
+ val map : ('a -> 'b) Eliom_lib.shared_value -> 'a t -> 'b t
+ val from_signal :