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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 ASSERT(isAlive()); | 196 ASSERT(isAlive()); |
197 ASSERT(m_next->isAlive()); | 197 ASSERT(m_next->isAlive()); |
198 ASSERT(m_prev->isAlive()); | 198 ASSERT(m_prev->isAlive()); |
199 m_next->m_prev = m_prev; | 199 m_next->m_prev = m_prev; |
200 m_prev->m_next = m_next; | 200 m_prev->m_next = m_next; |
201 } | 201 } |
202 | 202 |
203 protected: | 203 protected: |
204 inline PersistentBase() | 204 inline PersistentBase() |
205 : PersistentNode(TraceMethodDelegate<Owner, &Owner::trace>::trampoline) | 205 : PersistentNode(TraceMethodDelegate<Owner, &Owner::trace>::trampoline) |
206 #ifndef NDEBUG | 206 #if ENABLE(ASSERT) |
207 , m_roots(RootsAccessor::roots()) | 207 , m_roots(RootsAccessor::roots()) |
208 #endif | 208 #endif |
209 { | 209 { |
210 typename RootsAccessor::Lock lock; | 210 typename RootsAccessor::Lock lock; |
211 m_prev = RootsAccessor::roots(); | 211 m_prev = RootsAccessor::roots(); |
212 m_next = m_prev->m_next; | 212 m_next = m_prev->m_next; |
213 m_prev->m_next = this; | 213 m_prev->m_next = this; |
214 m_next->m_prev = this; | 214 m_next->m_prev = this; |
215 } | 215 } |
216 | 216 |
217 inline explicit PersistentBase(const PersistentBase& otherref) | 217 inline explicit PersistentBase(const PersistentBase& otherref) |
218 : PersistentNode(otherref.m_trace) | 218 : PersistentNode(otherref.m_trace) |
219 #ifndef NDEBUG | 219 #if ENABLE(ASSERT) |
220 , m_roots(RootsAccessor::roots()) | 220 , m_roots(RootsAccessor::roots()) |
221 #endif | 221 #endif |
222 { | 222 { |
223 // We don't support allocation of thread local Persistents while doing | 223 // We don't support allocation of thread local Persistents while doing |
224 // thread shutdown/cleanup. | 224 // thread shutdown/cleanup. |
225 ASSERT(!ThreadState::current()->isTerminating()); | 225 ASSERT(!ThreadState::current()->isTerminating()); |
226 typename RootsAccessor::Lock lock; | 226 typename RootsAccessor::Lock lock; |
227 ASSERT(otherref.m_roots == m_roots); // Handles must belong to the same
list. | 227 ASSERT(otherref.m_roots == m_roots); // Handles must belong to the same
list. |
228 PersistentBase* other = const_cast<PersistentBase*>(&otherref); | 228 PersistentBase* other = const_cast<PersistentBase*>(&otherref); |
229 m_prev = other; | 229 m_prev = other; |
230 m_next = other->m_next; | 230 m_next = other->m_next; |
231 other->m_next = this; | 231 other->m_next = this; |
232 m_next->m_prev = this; | 232 m_next->m_prev = this; |
233 } | 233 } |
234 | 234 |
235 inline PersistentBase& operator=(const PersistentBase& otherref) { return *t
his; } | 235 inline PersistentBase& operator=(const PersistentBase& otherref) { return *t
his; } |
236 | 236 |
237 #ifndef NDEBUG | 237 #if ENABLE(ASSERT) |
238 private: | 238 private: |
239 PersistentNode* m_roots; | 239 PersistentNode* m_roots; |
240 #endif | 240 #endif |
241 }; | 241 }; |
242 | 242 |
243 // A dummy Persistent handle that ensures the list of persistents is never null. | 243 // A dummy Persistent handle that ensures the list of persistents is never null. |
244 // This removes a test from a hot path. | 244 // This removes a test from a hot path. |
245 class PersistentAnchor : public PersistentNode { | 245 class PersistentAnchor : public PersistentNode { |
246 public: | 246 public: |
247 void trace(Visitor* visitor) | 247 void trace(Visitor* visitor) |
(...skipping 21 matching lines...) Expand all Loading... |
269 private: | 269 private: |
270 PersistentAnchor() : PersistentNode(TraceMethodDelegate<PersistentAnchor, &P
ersistentAnchor::trace>::trampoline) | 270 PersistentAnchor() : PersistentNode(TraceMethodDelegate<PersistentAnchor, &P
ersistentAnchor::trace>::trampoline) |
271 { | 271 { |
272 m_next = this; | 272 m_next = this; |
273 m_prev = this; | 273 m_prev = this; |
274 } | 274 } |
275 | 275 |
276 friend class ThreadState; | 276 friend class ThreadState; |
277 }; | 277 }; |
278 | 278 |
279 #ifndef NDEBUG | 279 #if ENABLE(ASSERT) |
280 // For global persistent handles we cannot check that the | 280 // For global persistent handles we cannot check that the |
281 // pointer is in the heap because that would involve | 281 // pointer is in the heap because that would involve |
282 // inspecting the heap of running threads. | 282 // inspecting the heap of running threads. |
283 #define ASSERT_IS_VALID_PERSISTENT_POINTER(pointer) \ | 283 #define ASSERT_IS_VALID_PERSISTENT_POINTER(pointer) \ |
284 bool isGlobalPersistent = WTF::IsSubclass<RootsAccessor, GlobalPersistents>:
:value; \ | 284 bool isGlobalPersistent = WTF::IsSubclass<RootsAccessor, GlobalPersistents>:
:value; \ |
285 ASSERT(!pointer || isGlobalPersistent || ThreadStateFor<ThreadingTrait<T>::A
ffinity>::state()->contains(pointer)) | 285 ASSERT(!pointer || isGlobalPersistent || ThreadStateFor<ThreadingTrait<T>::A
ffinity>::state()->contains(pointer)) |
286 #else | 286 #else |
287 #define ASSERT_IS_VALID_PERSISTENT_POINTER(pointer) | 287 #define ASSERT_IS_VALID_PERSISTENT_POINTER(pointer) |
288 #endif | 288 #endif |
289 | 289 |
(...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, WebCore::Is
GarbageCollectedType<T>::value> { | 1190 struct ParamStorageTraits<T*> : public PointerParamStorageTraits<T*, WebCore::Is
GarbageCollectedType<T>::value> { |
1191 }; | 1191 }; |
1192 | 1192 |
1193 template<typename T> | 1193 template<typename T> |
1194 struct ParamStorageTraits<RawPtr<T> > : public PointerParamStorageTraits<T*, Web
Core::IsGarbageCollectedType<T>::value> { | 1194 struct ParamStorageTraits<RawPtr<T> > : public PointerParamStorageTraits<T*, Web
Core::IsGarbageCollectedType<T>::value> { |
1195 }; | 1195 }; |
1196 | 1196 |
1197 } // namespace WTF | 1197 } // namespace WTF |
1198 | 1198 |
1199 #endif | 1199 #endif |
OLD | NEW |