123456789101112131415161718192021222324252627282930313233343536 |
- #pragma once
- #include <util/system/yassert.h>
- class TExtraRef {
- TAtomic Holds;
- public:
- TExtraRef()
- : Holds(false)
- {
- }
- ~TExtraRef() {
- Y_VERIFY(!Holds);
- }
- template <typename TThis>
- void Retain(TThis* thiz) {
- if (AtomicGet(Holds)) {
- return;
- }
- if (AtomicCas(&Holds, 1, 0)) {
- thiz->Ref();
- }
- }
- template <typename TThis>
- void Release(TThis* thiz) {
- if (!AtomicGet(Holds)) {
- return;
- }
- if (AtomicCas(&Holds, 0, 1)) {
- thiz->UnRef();
- }
- }
- };
|