123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566(* Copyright (C) 2023 Petter A. Urkedal <paurkedal@gmail.com>
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version, with the LGPL-3.0 Linking Exception.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* and the LGPL-3.0 Linking Exception along with this library. If not, see
* <http://www.gnu.org/licenses/> and <https://spdx.org>, respectively.
*)(** Switch implementation used where not available.
A switch provides scoped release of resources. The signature here is
provided on platforms where we don't use its native implementation, either
because it does not exist or lacks functionality on which we rely. *)moduletypeS=sigtype'afibertypettypehookexceptionOff(** {1 Explicit Construction and Release}
These functions are somewhat unsafe, since they don't enforce lifetime by
passing a new switch as an argument to the user. They are nevertheless
useful for applications which haven't been switch to the EIO-style
resource handling discipline, esp. when dealing with connection pools.
The [caqti-eio] package uses {!Eio.Switch} which lacks these functions. *)valeternal:t(** A switch which is never released. *)valcreate:unit->t(** Create a fresh releasable switch which is initially on. *)valrelease:t->unitfiber(** [release sw] calls all cleanup handlers on [sw] in reverse order of
registration and marks the switch as being off. *)(** {1 EIO-Compatible Interface} *)valrun:(t->'afiber)->'afiber(** [run f] calls [f] with a fresh switch which will be released upon exit or
in case of failure. *)valcheck:t->unit(** [check sw] raises [Off] if [sw] has been turned off. *)valon_release_cancellable:t->(unit->unitfiber)->hook(** [on_release_cancellable sw f] registers [f] to be called upon the evetual
release of [sw] unless {!remove_hook} is called on the returned hook
before that happen. *)valremove_hook:hook->unit(** Given a [hook] returned by {!on_release_cancellable}, [remove_hook hook]
cancels the cleanup registered by that call. *)end