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 |