/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 **/

#ifndef QUICKSTEP_TRANSACTION_LOCK_MANAGER_HPP_
#define QUICKSTEP_TRANSACTION_LOCK_MANAGER_HPP_

#include <atomic>
#include <memory>
#include <queue>
#include <vector>

#include "threading/Thread.hpp"
#include "transaction/DeadLockDetector.hpp"
#include "transaction/LockRequest.hpp"
#include "transaction/Transaction.hpp"

namespace quickstep {

template <typename T> class ThreadSafeQueue;

namespace transaction {

class AccessMode;
class LockTable;
class ResourceId;
class TransactionTable;

/** \addtogroup Transaction
 *  @{
 **/

/**
 * @brief Class for centralized location of acquisition and releasing
 *        of resource locks.
 **/
class LockManager : public Thread {
 public:
  /**
   * @brief Constructor
   *
   * @param incoming_requests Queue for the lock requests that are waiting
   *        for the permission.
   * @param permitted_requests Queue for the lock requests that are granted
   *        permission.
   **/
  LockManager(ThreadSafeQueue<LockRequest> *incoming_requests,
              ThreadSafeQueue<LockRequest> *permitted_requests);

  /**
   * @brief Destructor for LockManager. It handles the thread
   *        joins that it owns.
   **/
  ~LockManager();

  /**
   * @brief Method for defining the LockManager's thread main logic.
   *
   * @warning Users must not use this function directly. Instead use
   *          start() method inherited from the Thread class.
   **/
  void run() override;

  /**
   * @brief Acquires the lock on resource with specified access mode.
   *
   * @param tid Id of the transaction which the resource lock is acquired for.
   * @param rid Id of the resource on which the resource lock is acquired.
   * @param access_mode Permissible access mode on resource.
   *
   * @return True if it can acquire the lock from root to leaf lock hierarchy,
   *         false otherwise.
   **/
  bool acquireLock(const transaction_id tid,
                   const ResourceId &rid,
                   const AccessMode &access_mode);

  /**
   * @brief Releases all locks hold by the transaction.
   *
   * @param tid Id of the transaction whose locks will be released.
   * @param latch_table If it is true, the method latch the whole
   *        lock table, which is default.
   * @return True if tid releases all of its locks.
   **/
  bool releaseAllLocks(const transaction_id tid,
                       const bool latch_table = true);

  /**
   * @brief Release the locks acquired by the transactions contained
   *        in victim buffer to break the deadlock.
   **/
  void killVictims();

 private:
  bool acquireLockInternal(const transaction_id tid,
                           const ResourceId &rid,
                           const AccessMode &access_mode);

  std::unique_ptr<LockTable> lock_table_;
  std::unique_ptr<TransactionTable> transaction_table_;
  std::atomic<DeadLockDetectorStatus> detector_status_;
  std::vector<transaction_id> victim_result_;
  std::unique_ptr<DeadLockDetector> deadlock_detector_;
  ThreadSafeQueue<LockRequest> &incoming_requests_;
  ThreadSafeQueue<LockRequest> &permitted_requests_;
  std::queue<LockRequest> inner_pending_requests_;
};

/** @} */

}  // namespace transaction
}  // namespace quickstep

#endif  // QUICKSTEP_TRANSACTION_LOCK_MANAGER_HPP_
