117 lines
3.8 KiB
C++
117 lines
3.8 KiB
C++
/*------------------------------------------------------------------------------*
|
|
* Architecture & Implementation of DBMS *
|
|
*------------------------------------------------------------------------------*
|
|
* Copyright 2022 Databases and Information Systems Group TU Dortmund *
|
|
* Visit us at *
|
|
* http://dbis.cs.tu-dortmund.de/cms/en/home/ *
|
|
* *
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
|
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
|
|
* OTHER DEALINGS IN THE SOFTWARE. *
|
|
* *
|
|
* Authors: *
|
|
* Maximilian Berens <maximilian.berens@tu-dortmund.de> *
|
|
* Roland Kühn <roland.kuehn@cs.tu-dortmund.de> *
|
|
* Jan Mühlig <jan.muehlig@tu-dortmund.de> *
|
|
*------------------------------------------------------------------------------*
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint>
|
|
|
|
namespace beedb::concurrency
|
|
{
|
|
/**
|
|
* Represents a transaction timestamp, e.g., a begin or end timestamp
|
|
* of a record or begin or commit time of a transaction.
|
|
* The timestamp contains the "real" time (that is a global counter incremented
|
|
* for each new transaction) and a flag that indices the commit-state of the timestamp.
|
|
* The flag may be 1 for committed and else 0.
|
|
*
|
|
* The time "0" in combination with the set committed flag indicates "infinity".
|
|
*/
|
|
class alignas(64) timestamp
|
|
{
|
|
public:
|
|
using timestamp_t = std::uint64_t;
|
|
|
|
static auto make_infinity()
|
|
{
|
|
return timestamp{};
|
|
}
|
|
|
|
timestamp(const timestamp_t t, bool is_committed) : _timestamp_and_committed_flag((t << 1u) | is_committed)
|
|
{
|
|
}
|
|
|
|
timestamp &operator=(const timestamp &) = default;
|
|
|
|
~timestamp() = default;
|
|
|
|
/**
|
|
* @return True, if the transaction of the timestamp was committed.
|
|
*/
|
|
[[nodiscard]] bool is_committed() const
|
|
{
|
|
return _timestamp_and_committed_flag & 1u;
|
|
}
|
|
|
|
/**
|
|
* @return The "real" time without "committed" flag.
|
|
*/
|
|
[[nodiscard]] timestamp_t time() const
|
|
{
|
|
return _timestamp_and_committed_flag >> 1u;
|
|
}
|
|
|
|
/**
|
|
* @return True, when this timestamp is "never ending".
|
|
*/
|
|
[[nodiscard]] bool is_infinity() const
|
|
{
|
|
return _timestamp_and_committed_flag == 1u;
|
|
}
|
|
|
|
bool operator==(const timestamp other) const
|
|
{
|
|
return other._timestamp_and_committed_flag == _timestamp_and_committed_flag;
|
|
}
|
|
|
|
bool operator!=(const timestamp other) const
|
|
{
|
|
return other._timestamp_and_committed_flag != _timestamp_and_committed_flag;
|
|
}
|
|
|
|
bool operator<(const timestamp other) const
|
|
{
|
|
return time() < other.time();
|
|
}
|
|
|
|
bool operator<=(const timestamp other) const
|
|
{
|
|
return time() <= other.time();
|
|
}
|
|
|
|
bool operator>(const timestamp other) const
|
|
{
|
|
return time() > other.time();
|
|
}
|
|
|
|
bool operator>=(const timestamp other) const
|
|
{
|
|
return time() >= other.time();
|
|
}
|
|
|
|
private:
|
|
timestamp() = default;
|
|
|
|
// Time and committed flag (last bit).
|
|
timestamp_t _timestamp_and_committed_flag = 1u;
|
|
};
|
|
} // namespace beedb::concurrency
|