functor (M : BaseLock) ->
  sig
    type t = M.t
    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