Home | History | Annotate | Download | only in common
      1 /*
      2 ******************************************************************************
      3 * Copyright (C) 2015, International Business Machines
      4 * Corporation and others.  All Rights Reserved.
      5 ******************************************************************************
      6 * sharedobject.cpp
      7 */
      8 #include "sharedobject.h"
      9 #include "uassert.h"
     10 
     11 U_NAMESPACE_BEGIN
     12 
     13 SharedObject::~SharedObject() {}
     14 
     15 UnifiedCacheBase::~UnifiedCacheBase() {}
     16 
     17 void
     18 SharedObject::addRef(UBool fromWithinCache) const {
     19     umtx_atomic_inc(&totalRefCount);
     20 
     21     // Although items in use may not be correct immediately, it
     22     // will be correct eventually.
     23     if (umtx_atomic_inc(&hardRefCount) == 1 && cachePtr != NULL) {
     24         // If this object is cached, and the hardRefCount goes from 0 to 1,
     25         // then the increment must happen from within the cache while the
     26         // cache global mutex is locked. In this way, we can be rest assured
     27         // that data races can't happen if the cache performs some task if
     28         // the hardRefCount is zero while the global cache mutex is locked.
     29         U_ASSERT(fromWithinCache);
     30         cachePtr->incrementItemsInUse();
     31     }
     32 }
     33 
     34 void
     35 SharedObject::removeRef(UBool fromWithinCache) const {
     36     UBool decrementItemsInUse = (umtx_atomic_dec(&hardRefCount) == 0);
     37     UBool allReferencesGone = (umtx_atomic_dec(&totalRefCount) == 0);
     38 
     39     // Although items in use may not be correct immediately, it
     40     // will be correct eventually.
     41     if (decrementItemsInUse && cachePtr != NULL) {
     42         if (fromWithinCache) {
     43             cachePtr->decrementItemsInUse();
     44         } else {
     45             cachePtr->decrementItemsInUseWithLockingAndEviction();
     46         }
     47     }
     48     if (allReferencesGone) {
     49         delete this;
     50     }
     51 }
     52 
     53 void
     54 SharedObject::addSoftRef() const {
     55     umtx_atomic_inc(&totalRefCount);
     56     ++softRefCount;
     57 }
     58 
     59 void
     60 SharedObject::removeSoftRef() const {
     61     --softRefCount;
     62     if (umtx_atomic_dec(&totalRefCount) == 0) {
     63         delete this;
     64     }
     65 }
     66 
     67 int32_t
     68 SharedObject::getRefCount() const {
     69     return umtx_loadAcquire(totalRefCount);
     70 }
     71 
     72 int32_t
     73 SharedObject::getHardRefCount() const {
     74     return umtx_loadAcquire(hardRefCount);
     75 }
     76 
     77 void
     78 SharedObject::deleteIfZeroRefCount() const {
     79     if(getRefCount() == 0) {
     80         delete this;
     81     }
     82 }
     83 
     84 U_NAMESPACE_END
     85