mirror of
https://github.com/XRPLF/rippled.git
synced 2026-10-18 17:48:04 +00:00
Compare commits
1 Commits
mvadari/re
...
vlntb/intr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
db5eb115f1 |
@@ -7,6 +7,24 @@
|
|||||||
|
|
||||||
namespace xrpl {
|
namespace xrpl {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
// All-time peak strong/weak ref counts ever observed across all
|
||||||
|
// IntrusiveRefCounts instances. Read from doSweep periodically.
|
||||||
|
inline std::atomic<std::uint32_t> kPeakStrongObserved{0};
|
||||||
|
inline std::atomic<std::uint32_t> kPeakWeakObserved{0};
|
||||||
|
|
||||||
|
inline void
|
||||||
|
updateRefCountPeak(std::atomic<std::uint32_t>& peak, std::uint32_t v) noexcept
|
||||||
|
{
|
||||||
|
auto cur = peak.load(std::memory_order_relaxed);
|
||||||
|
while (v > cur && !peak.compare_exchange_weak(
|
||||||
|
cur, v, std::memory_order_relaxed))
|
||||||
|
{
|
||||||
|
// retry; cur is updated by compare_exchange_weak on failure
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
/** Action to perform when releasing a strong pointer.
|
/** Action to perform when releasing a strong pointer.
|
||||||
|
|
||||||
noop: Do nothing. For example, a `noop` action will occur when a count is
|
noop: Do nothing. For example, a `noop` action will occur when a count is
|
||||||
@@ -413,6 +431,8 @@ inline IntrusiveRefCounts::RefCountPair::RefCountPair(IntrusiveRefCounts::FieldT
|
|||||||
, partialDestroyStartedBit{v & kPartialDestroyStartedMask}
|
, partialDestroyStartedBit{v & kPartialDestroyStartedMask}
|
||||||
, partialDestroyFinishedBit{v & kPartialDestroyFinishedMask}
|
, partialDestroyFinishedBit{v & kPartialDestroyFinishedMask}
|
||||||
{
|
{
|
||||||
|
detail::updateRefCountPeak(detail::kPeakStrongObserved, strong);
|
||||||
|
detail::updateRefCountPeak(detail::kPeakWeakObserved, weak);
|
||||||
XRPL_ASSERT(
|
XRPL_ASSERT(
|
||||||
(strong < kCheckStrongMaxValue && weak < kCheckWeakMaxValue),
|
(strong < kCheckStrongMaxValue && weak < kCheckWeakMaxValue),
|
||||||
"xrpl::IntrusiveRefCounts::RefCountPair(FieldType) : inputs inside "
|
"xrpl::IntrusiveRefCounts::RefCountPair(FieldType) : inputs inside "
|
||||||
|
|||||||
@@ -1088,6 +1088,21 @@ public:
|
|||||||
<< "; size after: " << cachedSLEs_.size();
|
<< "; size after: " << cachedSLEs_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto const peakStrong =
|
||||||
|
xrpl::detail::kPeakStrongObserved.load(std::memory_order_relaxed);
|
||||||
|
auto const peakWeak =
|
||||||
|
xrpl::detail::kPeakWeakObserved.load(std::memory_order_relaxed);
|
||||||
|
constexpr std::uint32_t kStrongLimit = 65503; // kCheckStrongMaxValue
|
||||||
|
constexpr std::uint32_t kWeakLimit = 16351; // kCheckWeakMaxValue
|
||||||
|
JLOG(journal_.warn())
|
||||||
|
<< "RefCount peak since startup: "
|
||||||
|
<< "strong=" << peakStrong << "/" << kStrongLimit
|
||||||
|
<< " (" << (peakStrong * 100 / kStrongLimit) << "%); "
|
||||||
|
<< "weak=" << peakWeak << "/" << kWeakLimit
|
||||||
|
<< " (" << (peakWeak * 100 / kWeakLimit) << "%)";
|
||||||
|
}
|
||||||
|
|
||||||
mallocTrim("doSweep", journal_);
|
mallocTrim("doSweep", journal_);
|
||||||
|
|
||||||
// Set timer to do another sweep later.
|
// Set timer to do another sweep later.
|
||||||
|
|||||||
Reference in New Issue
Block a user