package batteries
A community-maintained standard library extension
Install
Dune Dependency
Authors
Maintainers
Sources
v3.9.0.tar.gz
md5=ea26b5c72e6731e59d856626049cca4d
sha512=55975b62c26f6db77433a3ac31f97af609fc6789bb62ac38b267249c78fd44ff37fe81901f1cf560857b9493a6046dd37b0d1c0234c66bd59e52843aac3ce6cb
doc/src/batteries.unthreaded/batConcurrent.ml.html
Source file batConcurrent.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
(* * Concurrent - Generic interface for concurrent operations * Copyright (C) 2008 David Teller, LIFO, Universite d'Orleans * * 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 2.1 of the License, or (at your option) any later version, * with the special exception on linking described in file LICENSE. * * 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 along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *) type lock = {execute : 'a 'b. ('a -> 'b) -> 'a -> 'b} let nolock= {execute = (fun f x -> f x)} let sync lock = lock.execute let synchronize locker f x = sync (locker ()) f x let compose {execute = a} {execute = b} = { execute = (fun f x -> b (a f) x) } let create ~enter ~leave = { execute = (fun f x -> enter (); try let result = f x in leave (); result with e -> leave (); raise e ) } module type BaseLock = sig type t (** The type of a lock. *) val create:unit -> t val lock : t -> unit val unlock:t -> unit val try_lock:t -> bool end module type Lock = sig type t (** The type of a lock. *) val create: unit -> t val lock : t -> unit val unlock: t -> unit val try_lock:t -> bool val synchronize: ?lock:t -> ('a -> 'b) -> 'a -> 'b val make : unit -> lock end let base_create = create module MakeLock(M:BaseLock) : Lock with type t = M.t = struct type t = M.t let create = M.create let lock = M.lock let unlock = M.unlock let try_lock=M.try_lock let synchronize ?(lock=M.create ()) f x = try M.lock lock; let result = f x in M.unlock lock; result with e -> M.unlock lock; raise e let make () = let lock = M.create () in base_create ~enter:(fun () -> M.lock lock) ~leave:(fun () -> M.unlock lock) end module BaseNoLock = struct type t = unit external create: unit -> t = "%ignore" external lock : t -> unit = "%ignore" external unlock: t -> unit = "%ignore" let try_lock _t = true end module NoLock = MakeLock(BaseNoLock)
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>