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 21 matching lines...) Expand all Loading... |
32 #define Handle_h | 32 #define Handle_h |
33 | 33 |
34 #include "platform/heap/Heap.h" | 34 #include "platform/heap/Heap.h" |
35 #include "platform/heap/HeapAllocator.h" | 35 #include "platform/heap/HeapAllocator.h" |
36 #include "platform/heap/InlinedGlobalMarkingVisitor.h" | 36 #include "platform/heap/InlinedGlobalMarkingVisitor.h" |
37 #include "platform/heap/PersistentNode.h" | 37 #include "platform/heap/PersistentNode.h" |
38 #include "platform/heap/ThreadState.h" | 38 #include "platform/heap/ThreadState.h" |
39 #include "platform/heap/TraceTraits.h" | 39 #include "platform/heap/TraceTraits.h" |
40 #include "platform/heap/Visitor.h" | 40 #include "platform/heap/Visitor.h" |
41 #include "wtf/Allocator.h" | 41 #include "wtf/Allocator.h" |
| 42 #include "wtf/Atomics.h" |
42 #include "wtf/Functional.h" | 43 #include "wtf/Functional.h" |
43 #include "wtf/HashFunctions.h" | 44 #include "wtf/HashFunctions.h" |
44 #include "wtf/Locker.h" | 45 #include "wtf/Locker.h" |
45 #include "wtf/MainThread.h" | 46 #include "wtf/MainThread.h" |
46 #include "wtf/RawPtr.h" | 47 #include "wtf/RawPtr.h" |
47 #include "wtf/RefCounted.h" | 48 #include "wtf/RefCounted.h" |
48 #include "wtf/TypeTraits.h" | 49 #include "wtf/TypeTraits.h" |
49 | 50 |
50 #if defined(LEAK_SANITIZER) | 51 #if defined(LEAK_SANITIZER) |
51 #include "wtf/LeakAnnotations.h" | 52 #include "wtf/LeakAnnotations.h" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 { | 204 { |
204 if (m_persistentNode) { | 205 if (m_persistentNode) { |
205 ASSERT(ThreadState::current()); | 206 ASSERT(ThreadState::current()); |
206 ThreadState::current()->registerStaticPersistentNode(m_persistentNod
e); | 207 ThreadState::current()->registerStaticPersistentNode(m_persistentNod
e); |
207 LEAK_SANITIZER_IGNORE_OBJECT(this); | 208 LEAK_SANITIZER_IGNORE_OBJECT(this); |
208 } | 209 } |
209 return this; | 210 return this; |
210 } | 211 } |
211 #endif | 212 #endif |
212 | 213 |
| 214 protected: |
| 215 T* atomicGet() { return reinterpret_cast<T*>(acquireLoad(reinterpret_cast<vo
id* volatile*>(&m_raw))); } |
| 216 |
213 private: | 217 private: |
214 NO_LAZY_SWEEP_SANITIZE_ADDRESS | 218 NO_LAZY_SWEEP_SANITIZE_ADDRESS |
215 void assign(T* ptr) | 219 void assign(T* ptr) |
216 { | 220 { |
217 m_raw = ptr; | 221 if (crossThreadnessConfiguration == CrossThreadPersistentConfiguration) |
| 222 releaseStore(reinterpret_cast<void* volatile*>(&m_raw), ptr); |
| 223 else |
| 224 m_raw = ptr; |
218 checkPointer(); | 225 checkPointer(); |
219 if (m_raw) { | 226 if (m_raw) { |
220 if (!m_persistentNode) | 227 if (!m_persistentNode) |
221 initialize(); | 228 initialize(); |
222 return; | 229 return; |
223 } | 230 } |
224 if (m_persistentNode && crossThreadnessConfiguration != CrossThreadPersi
stentConfiguration) | 231 if (m_persistentNode && crossThreadnessConfiguration != CrossThreadPersi
stentConfiguration) |
225 uninitialize(); | 232 uninitialize(); |
226 } | 233 } |
227 | 234 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 CrossThreadPersistent(T* raw) : Parent(raw) { } | 437 CrossThreadPersistent(T* raw) : Parent(raw) { } |
431 CrossThreadPersistent(T& raw) : Parent(raw) { } | 438 CrossThreadPersistent(T& raw) : Parent(raw) { } |
432 CrossThreadPersistent(const CrossThreadPersistent& other) : Parent(other) {
} | 439 CrossThreadPersistent(const CrossThreadPersistent& other) : Parent(other) {
} |
433 template<typename U> | 440 template<typename U> |
434 CrossThreadPersistent(const CrossThreadPersistent<U>& other) : Parent(other)
{ } | 441 CrossThreadPersistent(const CrossThreadPersistent<U>& other) : Parent(other)
{ } |
435 template<typename U> | 442 template<typename U> |
436 CrossThreadPersistent(const Member<U>& other) : Parent(other) { } | 443 CrossThreadPersistent(const Member<U>& other) : Parent(other) { } |
437 template<typename U> | 444 template<typename U> |
438 CrossThreadPersistent(const RawPtr<U>& other) : Parent(other.get()) { } | 445 CrossThreadPersistent(const RawPtr<U>& other) : Parent(other.get()) { } |
439 | 446 |
| 447 T* atomicGet() { return Parent::atomicGet(); } |
| 448 |
440 template<typename U> | 449 template<typename U> |
441 CrossThreadPersistent& operator=(U* other) | 450 CrossThreadPersistent& operator=(U* other) |
442 { | 451 { |
443 Parent::operator=(other); | 452 Parent::operator=(other); |
444 return *this; | 453 return *this; |
445 } | 454 } |
446 | 455 |
447 CrossThreadPersistent& operator=(std::nullptr_t) | 456 CrossThreadPersistent& operator=(std::nullptr_t) |
448 { | 457 { |
449 Parent::operator=(nullptr); | 458 Parent::operator=(nullptr); |
(...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 // into it. | 1466 // into it. |
1458 // | 1467 // |
1459 // TODO(sof): remove this hack once wtf/Functional.h can also work with a ty
pe like | 1468 // TODO(sof): remove this hack once wtf/Functional.h can also work with a ty
pe like |
1460 // CrossThreadWeakPersistent<>. | 1469 // CrossThreadWeakPersistent<>. |
1461 static WeakPtr<T> unwrap(const StorageType& value) { return WeakPtr<T>(WeakR
eference<T>::create(value.get())); } | 1470 static WeakPtr<T> unwrap(const StorageType& value) { return WeakPtr<T>(WeakR
eference<T>::create(value.get())); } |
1462 }; | 1471 }; |
1463 | 1472 |
1464 } // namespace WTF | 1473 } // namespace WTF |
1465 | 1474 |
1466 #endif | 1475 #endif |
OLD | NEW |