blob: b3fae533f6e078da3c09820c5b9580f211b34280 [file] [log] [blame]
/**
* 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_TRANSACTION_TABLE_HPP_
#define QUICKSTEP_TRANSACTION_TRANSACTION_TABLE_HPP_
#include <list>
#include <unordered_map>
#include <utility>
#include <vector>
#include "transaction/Lock.hpp"
#include "transaction/ResourceId.hpp"
#include "transaction/Transaction.hpp"
#include "utility/Macros.hpp"
namespace quickstep {
namespace transaction {
class AccessMode;
/** \addtogroup Transaction
* @{
*/
/**
* @brief Represents different result for TransactionTable's methods.
**/
enum class TransactionTableResult {
kPlacedInOwned = 0,
kPlacedInPending,
kAlreadyInOwned,
kAlreadyInPending,
kDelFromOwned,
kDelFromPending,
kDelError,
kTransactionDeleteOk,
kTransactionDeleteError,
};
/**
* @brief Class for keeping track of the owner and pending list of transactions.
**/
class TransactionTable {
public:
typedef std::pair<ResourceId, Lock> transaction_entry;
typedef std::list<transaction_entry> transaction_own_list;
typedef std::list<transaction_entry> transaction_pending_list;
typedef std::pair<transaction_own_list, transaction_pending_list>
transaction_list_pair;
/**
* @brief Contructor for TransactionTable.
**/
TransactionTable() {
}
/**
* @brief Puts a owned entry of the given resource id in the given
* transaction's owned list.
*
* @param tid Transaction id of the requestor.
* @param rid Resource id of the corresponding lock.
* @param access_mode Access mode of the lock.
*
* @return TransactionTableResult::kPLACED_IN_OWNED since it is
* always a successful operation on owned list.
**/
TransactionTableResult putOwnEntry(const transaction_id tid,
const ResourceId &rid,
const AccessMode &access_mode);
/**
* @brief Puts a pending entry of the given resource id in the given
* transaction's pending list.
*
* @param tid Transaction id of the requestor.
* @param rid Resource id of the corresponding lock.
* @param access_mode Access mode of the lock.
*
* @return TransactionTableResult::kPLACED_IN_PENDING
**/
TransactionTableResult putPendingEntry(const transaction_id tid,
const ResourceId &rid,
const AccessMode &access_mode);
/**
* @brief Deletes the owned entry corresponding to the resource id
* in the transaction's owned list.
*
* @param tid Transaction id of the owner.
* @param rid Resource id of the corresponding lock.
* @param access_mode Access mode of the lock.
*
* @return TransactionTableResult::kDEL_FROM_OWNED if the entry is deleted,
* otherwise TransactionTable::kDEL_ERROR.
**/
TransactionTableResult deleteOwnEntry(const transaction_id tid,
const ResourceId &rid,
const AccessMode &access_mode);
/**
* @brief Deletes the pending entry corresponding to the resource id
* in the transaction's pending list.
* @param tid Transaction id of the owner.
* @param rid Resource id of the corresponding lock.
* @param access_mode Access mode of the lock.
*
* @return TransactionTableResult::kDEL_FROM_PENDING if the entry is
* successfuly deleted, otherwise TransactionTableResult::k_DEL_ERROR.
**/
TransactionTableResult deletePendingEntry(const transaction_id tid,
const ResourceId &rid,
const AccessMode &access_mode);
/**
* @brief Returns a vector of resource ids which the corresponding transaction
* owns or pends.
*
* @param tid Transaction id of the corresponding transaction
*
* @return Vector of resource id that the transaction owns or pends.
**/
std::vector<ResourceId> getResourceIdList(const transaction_id tid);
/**
* @brief Deletes the transaction entry from transaction table.
*
* @param tid Transaction id of the corresponding transaction.
*
* @return TransactionTableResult::kTRANSACTION_DELETE_ERROR if there is no
* entry for the transaction, otherwise
* TransactionTableResult::kTRANSACTION_DELETE_OK.
**/
TransactionTableResult deleteTransaction(const transaction_id tid);
private:
std::unordered_map<transaction_id, transaction_list_pair> internal_map_;
DISALLOW_COPY_AND_ASSIGN(TransactionTable);
};
/** @} */
} // namespace transaction
} // namespace quickstep
#endif