src/hotspot/share/gc/z/zSafeDelete.inline.hpp
changeset 58557 cf3205fdb6dc
parent 54173 e6a92f2f37a9
equal deleted inserted replaced
58556:ff8716224f35 58557:cf3205fdb6dc
    28 #include "gc/z/zSafeDelete.hpp"
    28 #include "gc/z/zSafeDelete.hpp"
    29 #include "metaprogramming/isArray.hpp"
    29 #include "metaprogramming/isArray.hpp"
    30 #include "utilities/debug.hpp"
    30 #include "utilities/debug.hpp"
    31 
    31 
    32 template <typename T>
    32 template <typename T>
    33 ZSafeDelete<T>::ZSafeDelete() :
    33 ZSafeDeleteImpl<T>::ZSafeDeleteImpl(ZLock* lock) :
    34     _lock(),
    34     _lock(lock),
    35     _enabled(0),
    35     _enabled(0),
    36     _deferred() {}
    36     _deferred() {}
    37 
    37 
    38 template <typename T>
    38 template <typename T>
    39 bool ZSafeDelete<T>::deferred_delete(ItemT* item) {
    39 bool ZSafeDeleteImpl<T>::deferred_delete(ItemT* item) {
    40   ZLocker<ZLock> locker(&_lock);
    40   ZLocker<ZLock> locker(_lock);
    41   if (_enabled > 0) {
    41   if (_enabled > 0) {
    42     _deferred.add(item);
    42     _deferred.add(item);
    43     return true;
    43     return true;
    44   }
    44   }
    45 
    45 
    46   return false;
    46   return false;
    47 }
    47 }
    48 
    48 
    49 template <typename T>
    49 template <typename T>
    50 void ZSafeDelete<T>::immediate_delete(ItemT* item) {
    50 void ZSafeDeleteImpl<T>::immediate_delete(ItemT* item) {
    51   if (IsArray<T>::value) {
    51   if (IsArray<T>::value) {
    52     delete [] item;
    52     delete [] item;
    53   } else {
    53   } else {
    54     delete item;
    54     delete item;
    55   }
    55   }
    56 }
    56 }
    57 
    57 
    58 template <typename T>
    58 template <typename T>
    59 void ZSafeDelete<T>::enable_deferred_delete() {
    59 void ZSafeDeleteImpl<T>::enable_deferred_delete() {
    60   ZLocker<ZLock> locker(&_lock);
    60   ZLocker<ZLock> locker(_lock);
    61   _enabled++;
    61   _enabled++;
    62 }
    62 }
    63 
    63 
    64 template <typename T>
    64 template <typename T>
    65 void ZSafeDelete<T>::disable_deferred_delete() {
    65 void ZSafeDeleteImpl<T>::disable_deferred_delete() {
    66   ZArray<ItemT*> deferred;
    66   ZArray<ItemT*> deferred;
    67 
    67 
    68   {
    68   {
    69     ZLocker<ZLock> locker(&_lock);
    69     ZLocker<ZLock> locker(_lock);
    70     assert(_enabled > 0, "Invalid state");
    70     assert(_enabled > 0, "Invalid state");
    71     if (--_enabled == 0) {
    71     if (--_enabled == 0) {
    72       deferred.transfer(&_deferred);
    72       deferred.transfer(&_deferred);
    73     }
    73     }
    74   }
    74   }
    78     immediate_delete(item);
    78     immediate_delete(item);
    79   }
    79   }
    80 }
    80 }
    81 
    81 
    82 template <typename T>
    82 template <typename T>
    83 void ZSafeDelete<T>::operator()(ItemT* item) {
    83 void ZSafeDeleteImpl<T>::operator()(ItemT* item) {
    84   if (!deferred_delete(item)) {
    84   if (!deferred_delete(item)) {
    85     immediate_delete(item);
    85     immediate_delete(item);
    86   }
    86   }
    87 }
    87 }
    88 
    88 
       
    89 template <typename T>
       
    90 ZSafeDelete<T>::ZSafeDelete() :
       
    91     ZSafeDeleteImpl<T>(&_lock),
       
    92     _lock() {}
       
    93 
       
    94 template <typename T>
       
    95 ZSafeDeleteNoLock<T>::ZSafeDeleteNoLock() :
       
    96     ZSafeDeleteImpl<T>(NULL) {}
       
    97 
    89 #endif // SHARE_GC_Z_ZSAFEDELETE_INLINE_HPP
    98 #endif // SHARE_GC_Z_ZSAFEDELETE_INLINE_HPP