NFC: Split InvalidPointer out of ds/dllist.h
This lets us use Pagemaps without requiring dllists in scope
This commit is contained in:
committed by
Matthew Parkinson
parent
addd98e6db
commit
83b72722cf
@@ -1,59 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "helpers.h"
|
||||
#include "invalidptr.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
|
||||
namespace snmalloc
|
||||
{
|
||||
/**
|
||||
* Invalid pointer class. This is similar to `std::nullptr_t`, but allows
|
||||
* other values.
|
||||
*/
|
||||
template<address_t Sentinel>
|
||||
struct InvalidPointer
|
||||
{
|
||||
/**
|
||||
* Equality comparison. Two invalid pointer values with the same sentinel
|
||||
* are always the same, invalid pointer values with different sentinels are
|
||||
* always different.
|
||||
*/
|
||||
template<address_t OtherSentinel>
|
||||
constexpr bool operator==(const InvalidPointer<OtherSentinel>&)
|
||||
{
|
||||
return Sentinel == OtherSentinel;
|
||||
}
|
||||
/**
|
||||
* Equality comparison. Two invalid pointer values with the same sentinel
|
||||
* are always the same, invalid pointer values with different sentinels are
|
||||
* always different.
|
||||
*/
|
||||
template<address_t OtherSentinel>
|
||||
constexpr bool operator!=(const InvalidPointer<OtherSentinel>&)
|
||||
{
|
||||
return Sentinel != OtherSentinel;
|
||||
}
|
||||
/**
|
||||
* Implicit conversion, creates a pointer with the value of the sentinel.
|
||||
* On CHERI and other provenance-tracking systems, this is a
|
||||
* provenance-free integer and so will trap if dereferenced, on other
|
||||
* systems the sentinel should be a value in unmapped memory.
|
||||
*/
|
||||
template<typename T>
|
||||
operator T*() const
|
||||
{
|
||||
return reinterpret_cast<T*>(Sentinel);
|
||||
}
|
||||
/**
|
||||
* Implicit conversion to an address, returns the sentinel value.
|
||||
*/
|
||||
operator address_t() const
|
||||
{
|
||||
return Sentinel;
|
||||
}
|
||||
};
|
||||
|
||||
template<
|
||||
class T,
|
||||
class Terminator = std::nullptr_t,
|
||||
|
||||
51
src/ds/invalidptr.h
Normal file
51
src/ds/invalidptr.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#pragma once
|
||||
|
||||
namespace snmalloc
|
||||
{
|
||||
/**
|
||||
* Invalid pointer class. This is similar to `std::nullptr_t`, but allows
|
||||
* other values.
|
||||
*/
|
||||
template<address_t Sentinel>
|
||||
struct InvalidPointer
|
||||
{
|
||||
/**
|
||||
* Equality comparison. Two invalid pointer values with the same sentinel
|
||||
* are always the same, invalid pointer values with different sentinels are
|
||||
* always different.
|
||||
*/
|
||||
template<address_t OtherSentinel>
|
||||
constexpr bool operator==(const InvalidPointer<OtherSentinel>&)
|
||||
{
|
||||
return Sentinel == OtherSentinel;
|
||||
}
|
||||
/**
|
||||
* Equality comparison. Two invalid pointer values with the same sentinel
|
||||
* are always the same, invalid pointer values with different sentinels are
|
||||
* always different.
|
||||
*/
|
||||
template<address_t OtherSentinel>
|
||||
constexpr bool operator!=(const InvalidPointer<OtherSentinel>&)
|
||||
{
|
||||
return Sentinel != OtherSentinel;
|
||||
}
|
||||
/**
|
||||
* Implicit conversion, creates a pointer with the value of the sentinel.
|
||||
* On CHERI and other provenance-tracking systems, this is a
|
||||
* provenance-free integer and so will trap if dereferenced, on other
|
||||
* systems the sentinel should be a value in unmapped memory.
|
||||
*/
|
||||
template<typename T>
|
||||
operator T*() const
|
||||
{
|
||||
return reinterpret_cast<T*>(Sentinel);
|
||||
}
|
||||
/**
|
||||
* Implicit conversion to an address, returns the sentinel value.
|
||||
*/
|
||||
operator address_t() const
|
||||
{
|
||||
return Sentinel;
|
||||
}
|
||||
};
|
||||
} // namespace snmalloc
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "../ds/bits.h"
|
||||
#include "../ds/helpers.h"
|
||||
#include "../ds/invalidptr.h"
|
||||
|
||||
#include <atomic>
|
||||
#include <utility>
|
||||
|
||||
Reference in New Issue
Block a user