module Nfs:sig..end
There are a few caveats compared to local file locks:
val create : ?message:string -> string -> boolcreate ?message path tries to create and lock the file at path by creating a hard
      link to path.nfs_lock.  The contents of path will be replaced with a sexp
      containing the caller's hostname and pid, and the optional message.
      Efforts will be made to release this lock when the calling program exits. But there
      is no guarantee that this will occur under some types of program crash. If the
      program crashes without removing the lock file an attempt will be made to clean up
      on restart by checking the hostname and pid stored in the lockfile.
val create_exn : ?message:string -> string -> unitcreate_exn ?message path like create, but throws an exception when it fails to
      obtain the lockval blocking_create : ?timeout:Time.Span.t -> ?message:string -> string -> unitblocking_create ?message path like create, but sleeps for 1 second between lock
      attempts and does not return until it succeeds or timeout expires.  Timeout defaults
      to wait indefinitelyval critical_section : ?message:string -> string -> timeout:Time.Span.t -> f:(unit -> 'a) -> 'acritical_section ?message ~timeout path ~f wrap function f (including exceptions
      escaping it) by first locking (using Lock_file.Nfs.blocking_create) and then unlocking the
      given lock file.val get_hostname_and_pid : string -> (string * Core_kernel.Std.Pid.t) optionget_hostname_and_pid path reads the lock file at path and returns the hostname
      and path in the file.  Returns None if the file cannot be read.val get_message : string -> string optionget_message path reads the lock file at path and returns the message in the
      file.  Returns None if the file cannot be read.val unlock_exn : string -> unitunlock_exn path unlocks path if path was locked from the same host and the pid
      in the file is either the current pid or not the pid of a running process.  It will
      raise if for some reason the lock at the given path cannot be unlocked, for example
      if the lock is taken by somebody else that is still alive on the same box, or taken
      by a process on a different host, or unix permissions issues, etc.  This function
      should be used only by programs that need to release their lock before exiting.  If
      releasing the lock can or should wait till the end of the running process, do not
      call this function -- this library already takes care of releasing at exit all the
      locks taken.