Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 }; | 156 }; |
| 157 | 157 |
| 158 // Base class for persistent handles. RootsAccessor specifies which list to | 158 // Base class for persistent handles. RootsAccessor specifies which list to |
| 159 // link resulting handle into. Owner specifies the class containing trace | 159 // link resulting handle into. Owner specifies the class containing trace |
| 160 // method. | 160 // method. |
| 161 template<typename RootsAccessor, typename Owner> | 161 template<typename RootsAccessor, typename Owner> |
| 162 class PersistentBase : public PersistentNode { | 162 class PersistentBase : public PersistentNode { |
| 163 public: | 163 public: |
| 164 ~PersistentBase() | 164 ~PersistentBase() |
| 165 { | 165 { |
| 166 ASSERT(ThreadState::current()); | |
|
sof
2015/04/16 11:08:46
The assert in the dtor cannot be used, as the Thre
| |
| 166 typename RootsAccessor::Lock lock; | 167 typename RootsAccessor::Lock lock; |
| 167 ASSERT(m_roots == RootsAccessor::roots()); // Check that the thread is u sing the same roots list. | 168 ASSERT(m_roots == RootsAccessor::roots()); // Check that the thread is u sing the same roots list. |
| 168 ASSERT(isHeapObjectAlive()); | 169 ASSERT(isHeapObjectAlive()); |
| 169 ASSERT(m_next->isHeapObjectAlive()); | 170 ASSERT(m_next->isHeapObjectAlive()); |
| 170 ASSERT(m_prev->isHeapObjectAlive()); | 171 ASSERT(m_prev->isHeapObjectAlive()); |
| 171 m_next->m_prev = m_prev; | 172 m_next->m_prev = m_prev; |
| 172 m_prev->m_next = m_next; | 173 m_prev->m_next = m_next; |
| 173 } | 174 } |
| 174 | 175 |
| 175 protected: | 176 protected: |
| 176 inline PersistentBase() | 177 inline PersistentBase() |
| 177 : PersistentNode(TraceMethodDelegate<Owner, &Owner::trace>::trampoline) | 178 : PersistentNode(TraceMethodDelegate<Owner, &Owner::trace>::trampoline) |
| 178 #if ENABLE(ASSERT) | 179 #if ENABLE(ASSERT) |
| 179 , m_roots(RootsAccessor::roots()) | 180 , m_roots(RootsAccessor::roots()) |
| 180 #endif | 181 #endif |
| 181 { | 182 { |
| 183 // Persistent must belong to a thread that will GC it. | |
| 184 ASSERT(m_roots == GlobalPersistents::roots() || ThreadState::current()); | |
| 182 typename RootsAccessor::Lock lock; | 185 typename RootsAccessor::Lock lock; |
| 183 m_prev = RootsAccessor::roots(); | 186 m_prev = RootsAccessor::roots(); |
| 184 m_next = m_prev->m_next; | 187 m_next = m_prev->m_next; |
| 185 m_prev->m_next = this; | 188 m_prev->m_next = this; |
| 186 m_next->m_prev = this; | 189 m_next->m_prev = this; |
| 187 } | 190 } |
| 188 | 191 |
| 189 inline explicit PersistentBase(const PersistentBase& otherref) | 192 inline explicit PersistentBase(const PersistentBase& otherref) |
| 190 : PersistentNode(otherref.m_trace) | 193 : PersistentNode(otherref.m_trace) |
| 191 #if ENABLE(ASSERT) | 194 #if ENABLE(ASSERT) |
| 192 , m_roots(RootsAccessor::roots()) | 195 , m_roots(RootsAccessor::roots()) |
| 193 #endif | 196 #endif |
| 194 { | 197 { |
| 198 ASSERT(m_roots == GlobalPersistents::roots() || ThreadState::current()); | |
| 195 // We don't support allocation of thread local Persistents while doing | 199 // We don't support allocation of thread local Persistents while doing |
| 196 // thread shutdown/cleanup. | 200 // thread shutdown/cleanup. |
| 197 ASSERT(!ThreadState::current()->isTerminating()); | 201 ASSERT(!ThreadState::current()->isTerminating()); |
| 198 typename RootsAccessor::Lock lock; | 202 typename RootsAccessor::Lock lock; |
| 199 ASSERT(otherref.m_roots == m_roots); // Handles must belong to the same list. | 203 ASSERT(otherref.m_roots == m_roots); // Handles must belong to the same list. |
| 200 PersistentBase* other = const_cast<PersistentBase*>(&otherref); | 204 PersistentBase* other = const_cast<PersistentBase*>(&otherref); |
| 201 m_prev = other; | 205 m_prev = other; |
| 202 m_next = other->m_next; | 206 m_next = other->m_next; |
| 203 other->m_next = this; | 207 other->m_next = this; |
| 204 m_next->m_prev = this; | 208 m_next->m_prev = this; |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1112 template<typename T> | 1116 template<typename T> |
| 1113 struct ParamStorageTraits<RawPtr<T>> : public PointerParamStorageTraits<T*, blin k::IsGarbageCollectedType<T>::value> { | 1117 struct ParamStorageTraits<RawPtr<T>> : public PointerParamStorageTraits<T*, blin k::IsGarbageCollectedType<T>::value> { |
| 1114 }; | 1118 }; |
| 1115 | 1119 |
| 1116 template<typename T> | 1120 template<typename T> |
| 1117 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; | 1121 PassRefPtr<T> adoptRef(blink::RefCountedGarbageCollected<T>*) = delete; |
| 1118 | 1122 |
| 1119 } // namespace WTF | 1123 } // namespace WTF |
| 1120 | 1124 |
| 1121 #endif | 1125 #endif |
| OLD | NEW |