// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FBL_AUTO_LOCK_H_
#define FBL_AUTO_LOCK_H_
#ifdef __cplusplus

#include <fbl/macros.h>
#include <fbl/mutex.h>
#include <fbl/null_lock.h>

namespace fbl {

// Default AutoLock will accept any object which represents a "mutex"
// capability, and which supports an Acquire/Release interface.
template <typename T>
class __TA_SCOPED_CAPABILITY AutoLock {
 public:
  explicit AutoLock(T* mutex) __TA_ACQUIRE(mutex) : mutex_(mutex) { mutex_->Acquire(); }
  ~AutoLock() __TA_RELEASE() { release(); }

  // early release the mutex before the object goes out of scope
  void release() __TA_RELEASE() {
    // In typical usage, this conditional will be optimized away so
    // that mutex_->Release() is called unconditionally.
    if (mutex_ != nullptr) {
      mutex_->Release();
      mutex_ = nullptr;
    }
  }

  // suppress default constructors
  DISALLOW_COPY_ASSIGN_AND_MOVE(AutoLock);

 private:
  T* mutex_;
};

// No-op specialization for the fbl::NullLock
template <>
class __TA_SCOPED_CAPABILITY AutoLock<::fbl::NullLock> {
 public:
  explicit AutoLock(::fbl::NullLock* mutex) __TA_ACQUIRE(mutex) {}
  ~AutoLock() __TA_RELEASE() {}
  void release() __TA_RELEASE() {}
  DISALLOW_COPY_ASSIGN_AND_MOVE(AutoLock);
};

// Specialization for the C11 mtx_t type.  Not present in the kernel.
#if !_KERNEL
template <>
class __TA_SCOPED_CAPABILITY AutoLock<mtx_t> {
 public:
  explicit AutoLock(mtx_t* mutex) __TA_ACQUIRE(mutex) : mutex_(mutex) { mtx_lock(mutex_); }
  ~AutoLock() __TA_RELEASE() { release(); }

  void release() __TA_RELEASE() {
    if (mutex_ != nullptr) {
      mtx_unlock(mutex_);
      mutex_ = nullptr;
    }
  }

  // suppress default constructors
  DISALLOW_COPY_ASSIGN_AND_MOVE(AutoLock);

 private:
  mtx_t* mutex_;
};
#endif  // if !_KERNEL

}  // namespace fbl

#endif  // #ifdef __cplusplus

#endif  // FBL_AUTO_LOCK_H_
