diff --git a/base/include/refbase.h b/base/include/refbase.h old mode 100755 new mode 100644 index 4c4c24b..c6f93da --- a/base/include/refbase.h +++ b/base/include/refbase.h @@ -70,6 +70,9 @@ public: bool AttemptIncStrongRef(const void *objectId, int &outCount); + // Only for IPC use. + bool AttemptIncStrong(const void *objectId); + bool IsLifeTimeExtended(); void ExtendObjectLifetime(); @@ -140,6 +143,9 @@ public: bool AttemptIncStrongRef(const void *objectId); + // Only for IPC use. + bool AttemptIncStrong(const void *objectId); + bool IsAttemptAcquireSet(); bool IsExtendLifeTimeSet(); diff --git a/base/src/refbase.cpp b/base/src/refbase.cpp old mode 100755 new mode 100644 index fd314d1..1b2968e --- a/base/src/refbase.cpp +++ b/base/src/refbase.cpp @@ -245,6 +245,22 @@ ATTEMPT_SUCCESS: return true; } +bool RefCounter::AttemptIncStrong(const void *objectId) +{ + IncWeakRefCount(objectId); + int curCount = GetStrongRefCount(); + while (curCount > 0) { + if (atomicStrong_.compare_exchange_weak(curCount, curCount + 1, std::memory_order_relaxed)) { + break; + } + curCount = atomicStrong_.load(std::memory_order_relaxed); + } + if (curCount <= 0) { + DecWeakRefCount(objectId); + } + return curCount > 0; +} + RefBase::RefBase() : refs_(new RefCounter()) { refs_->IncRefCount(); @@ -434,6 +450,18 @@ bool RefBase::AttemptIncStrongRef(const void *objectId) return false; } +bool RefBase::AttemptIncStrong(const void *objectId) +{ + if (refs_ == nullptr) { + return false; + } + if (refs_->AttemptIncStrong(objectId)) { + refs_->SetAttemptAcquire(); + return true; + } + return false; +} + bool RefBase::IsAttemptAcquireSet() { if (refs_ == nullptr) {