// Copyright (c) 2023, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
// History:
//   1 Sep 23  Brian Frank  Creation

** Lock for synchronization between actors.
native const class Lock
  ** Construct mutual exclusion lock.
  static Lock makeReentrant()

  ** Private constructor
  private new make()

  ** Acquire the lock; if not available then block forever until its available.
  Void lock()

  ** Release the lock.  Raise exception if not holding the lock.
  Void unlock()

  ** Acquire the lock if its free and immediately return true.
  ** Or if the lock is not available and timeout is null, then
  ** immediately return false.  If timeout is non-null, then block
  ** up to the given timeout waiting for the lock and return true
  ** if lock acquired or false on timeout.
  Bool tryLock(Duration? timeout := null)