OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2012 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 | 136 |
137 static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isG
arbageCollected>& host, const char* key) | 137 static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isG
arbageCollected>& host, const char* key) |
138 { | 138 { |
139 return host.requireSupplement(key); | 139 return host.requireSupplement(key); |
140 } | 140 } |
141 | 141 |
142 static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isG
arbageCollected>* host, const char* key) | 142 static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isG
arbageCollected>* host, const char* key) |
143 { | 143 { |
144 return host ? host->requireSupplement(key) : 0; | 144 return host ? host->requireSupplement(key) : 0; |
145 } | 145 } |
146 | |
147 // FIXME: Oilpan: Remove this callback once PersistentHeapSupplementable is
removed again. | |
148 virtual void persistentHostHasBeenDestroyed() { } | |
149 }; | 146 }; |
150 | 147 |
151 // Helper class for implementing Supplementable, HeapSupplementable, and | 148 // Helper class for implementing Supplementable and HeapSupplementable. |
152 // PersistentHeapSupplementable. | |
153 template<typename T, bool isGarbageCollected = false> | 149 template<typename T, bool isGarbageCollected = false> |
154 class SupplementableBase { | 150 class SupplementableBase { |
155 public: | 151 public: |
156 void provideSupplement(const char* key, typename SupplementableTraits<T, isG
arbageCollected>::SupplementArgumentType supplement) | 152 void provideSupplement(const char* key, typename SupplementableTraits<T, isG
arbageCollected>::SupplementArgumentType supplement) |
157 { | 153 { |
158 ASSERT(m_threadId == currentThread()); | 154 ASSERT(m_threadId == currentThread()); |
159 ASSERT(!this->m_supplements.get(key)); | 155 ASSERT(!this->m_supplements.get(key)); |
160 this->m_supplements.set(key, supplement); | 156 this->m_supplements.set(key, supplement); |
161 } | 157 } |
162 | 158 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 template<typename T> | 204 template<typename T> |
209 class GC_PLUGIN_IGNORE("http://crbug.com/395036") HeapSupplementable : public Su
pplementableBase<T, true>, public GarbageCollectedMixin { | 205 class GC_PLUGIN_IGNORE("http://crbug.com/395036") HeapSupplementable : public Su
pplementableBase<T, true>, public GarbageCollectedMixin { |
210 public: | 206 public: |
211 virtual void trace(Visitor* visitor) OVERRIDE | 207 virtual void trace(Visitor* visitor) OVERRIDE |
212 { | 208 { |
213 visitor->trace(this->m_supplements); | 209 visitor->trace(this->m_supplements); |
214 SupplementableBase<T, true>::trace(visitor); | 210 SupplementableBase<T, true>::trace(visitor); |
215 } | 211 } |
216 }; | 212 }; |
217 | 213 |
218 // This class is used to make an off-heap class supplementable with supplements | |
219 // that are on-heap, aka. HeapSupplements. | |
220 template<typename T> | |
221 class GC_PLUGIN_IGNORE("http://crbug.com/395036") PersistentHeapSupplementable :
public SupplementableBase<T, true> { | |
222 public: | |
223 PersistentHeapSupplementable() : m_root(this) { } | |
224 virtual ~PersistentHeapSupplementable() | |
225 { | |
226 typedef typename SupplementableTraits<T, true>::SupplementMap::iterator
SupplementIterator; | |
227 for (SupplementIterator it = this->m_supplements.begin(); it != this->m_
supplements.end(); ++it) | |
228 it->value->persistentHostHasBeenDestroyed(); | |
229 } | |
230 | |
231 virtual void trace(Visitor* visitor) | |
232 { | |
233 visitor->trace(this->m_supplements); | |
234 SupplementableBase<T, true>::trace(visitor); | |
235 } | |
236 | |
237 private: | |
238 class TraceDelegate : PersistentBase<ThreadLocalPersistents<AnyThread>, Trac
eDelegate> { | |
239 public: | |
240 TraceDelegate(PersistentHeapSupplementable* owner) : m_owner(owner) { } | |
241 void trace(Visitor* visitor) { m_owner->trace(visitor); } | |
242 private: | |
243 PersistentHeapSupplementable* m_owner; | |
244 }; | |
245 | |
246 TraceDelegate m_root; | |
247 }; | |
248 | |
249 template<typename T> | 214 template<typename T> |
250 class Supplement : public SupplementBase<T, false> { }; | 215 class Supplement : public SupplementBase<T, false> { }; |
251 | 216 |
252 // This class is used to make an off-heap class supplementable with off-heap | 217 // This class is used to make an off-heap class supplementable with off-heap |
253 // supplements (Supplement). | 218 // supplements (Supplement). |
254 template<typename T> | 219 template<typename T> |
255 class GC_PLUGIN_IGNORE("http://crbug.com/395036") Supplementable : public Supple
mentableBase<T, false> { | 220 class GC_PLUGIN_IGNORE("http://crbug.com/395036") Supplementable : public Supple
mentableBase<T, false> { |
256 public: | 221 public: |
257 virtual void trace(Visitor* visitor) | 222 virtual void trace(Visitor* visitor) |
258 { | 223 { |
259 // No tracing of off-heap supplements. We should not have any Supplement
able | 224 // No tracing of off-heap supplements. We should not have any Supplement
able |
260 // object on the heap. Either the object is HeapSupplementable or if it
is | 225 // object on the heap. |
261 // off heap it should use PersistentHeapSupplementable to trace any on-h
eap | |
262 // supplements. | |
263 COMPILE_ASSERT(!IsGarbageCollectedType<T>::value, GarbageCollectedObject
MustBeHeapSupplementable); | 226 COMPILE_ASSERT(!IsGarbageCollectedType<T>::value, GarbageCollectedObject
MustBeHeapSupplementable); |
264 SupplementableBase<T, false>::trace(visitor); | 227 SupplementableBase<T, false>::trace(visitor); |
265 } | 228 } |
266 }; | 229 }; |
267 | 230 |
268 template<typename T> | 231 template<typename T> |
269 struct ThreadingTrait<SupplementBase<T, true> > { | 232 struct ThreadingTrait<SupplementBase<T, true> > { |
270 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; | 233 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; |
271 }; | 234 }; |
272 | 235 |
273 template<typename T> | 236 template<typename T> |
274 struct ThreadingTrait<SupplementableBase<T, true> > { | 237 struct ThreadingTrait<SupplementableBase<T, true> > { |
275 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; | 238 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; |
276 }; | 239 }; |
277 | 240 |
278 } // namespace blink | 241 } // namespace blink |
279 | 242 |
280 #endif // Supplementable_h | 243 #endif // Supplementable_h |
OLD | NEW |