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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 } | 144 } |
145 | 145 |
146 virtual void trace(Visitor*) { } | 146 virtual void trace(Visitor*) { } |
147 virtual void willBeDestroyed() { } | 147 virtual void willBeDestroyed() { } |
148 }; | 148 }; |
149 | 149 |
150 template<typename T, bool> | 150 template<typename T, bool> |
151 class SupplementableTracing; | 151 class SupplementableTracing; |
152 | 152 |
153 template<typename T> | 153 template<typename T> |
154 class SupplementableTracing<T, true> : public GarbageCollectedMixin { }; | 154 class SupplementableTracing<T, true> { }; |
155 | 155 |
156 template<typename T> | 156 template<typename T> |
157 class SupplementableTracing<T, false> { }; | 157 class SupplementableTracing<T, false> { }; |
158 | 158 |
159 template<typename T, bool isGarbageCollected = false> | 159 template<typename T, bool isGarbageCollected = false> |
160 class SupplementableBase : public SupplementableTracing<T, isGarbageCollected> { | 160 class SupplementableBase : public SupplementableTracing<T, isGarbageCollected> { |
161 public: | 161 public: |
162 void provideSupplement(const char* key, typename SupplementableTraits<T, isG arbageCollected>::SupplementArgumentType supplement) | 162 void provideSupplement(const char* key, typename SupplementableTraits<T, isG arbageCollected>::SupplementArgumentType supplement) |
163 { | 163 { |
164 ASSERT(m_threadId == currentThread()); | 164 ASSERT(m_threadId == currentThread()); |
(...skipping 23 matching lines...) Expand all Loading... | |
188 virtual void trace(Visitor* visitor) { visitor->trace(m_supplements); } | 188 virtual void trace(Visitor* visitor) { visitor->trace(m_supplements); } |
189 | 189 |
190 void willBeDestroyed() | 190 void willBeDestroyed() |
191 { | 191 { |
192 typedef typename SupplementableTraits<T, isGarbageCollected>::Supplement Map::iterator SupplementIterator; | 192 typedef typename SupplementableTraits<T, isGarbageCollected>::Supplement Map::iterator SupplementIterator; |
193 for (SupplementIterator it = m_supplements.begin(); it != m_supplements. end(); ++it) | 193 for (SupplementIterator it = m_supplements.begin(); it != m_supplements. end(); ++it) |
194 it->value->willBeDestroyed(); | 194 it->value->willBeDestroyed(); |
195 } | 195 } |
196 | 196 |
197 private: | 197 private: |
198 // FIXME: Oilpan: Remove this ignore once PersistentHeapSupplementable is re moved again. | |
199 GC_PLUGIN_IGNORE("") | |
198 typename SupplementableTraits<T, isGarbageCollected>::SupplementMap m_supple ments; | 200 typename SupplementableTraits<T, isGarbageCollected>::SupplementMap m_supple ments; |
199 | 201 |
200 #if !ASSERT_DISABLED | 202 #if !ASSERT_DISABLED |
201 protected: | 203 protected: |
202 SupplementableBase() : m_threadId(currentThread()) { } | 204 SupplementableBase() : m_threadId(currentThread()) { } |
203 | 205 |
204 private: | 206 private: |
205 ThreadIdentifier m_threadId; | 207 ThreadIdentifier m_threadId; |
206 #endif | 208 #endif |
207 }; | 209 }; |
208 | 210 |
209 template<typename T> | 211 template<typename T> |
210 class HeapSupplement : public SupplementBase<T, true> { }; | 212 class HeapSupplement : public SupplementBase<T, true> { }; |
211 | 213 |
214 // FIXME: Oilpan: Move GarbageCollectedMixin to SupplementableBase<T, true> once PersistentHeapSupplementable is removed again. | |
212 template<typename T> | 215 template<typename T> |
213 class HeapSupplementable : public SupplementableBase<T, true> { }; | 216 class HeapSupplementable : public SupplementableBase<T, true>, public GarbageCol lectedMixin { }; |
217 | |
218 template<typename T> | |
219 class GC_PLUGIN_IGNORE("") PersistentHeapSupplementable : public SupplementableB ase<T, true> { | |
220 public: | |
221 PersistentHeapSupplementable() : m_root(this) { } | |
222 private: | |
223 class TraceDelegate : GarbageCollected<TraceDelegate> { | |
224 public: | |
225 TraceDelegate(PersistentHeapSupplementable* owner) : m_owner(owner) { } | |
226 void trace(Visitor* visitor) { m_owner->trace(visitor); } | |
227 private: | |
228 PersistentHeapSupplementable* m_owner; | |
229 }; | |
230 | |
231 TraceDelegate m_root; | |
Mads Ager (chromium)
2014/06/10 11:50:26
Don't you need a Persistent here somewhere? This p
zerny-chromium
2014/06/10 11:52:04
Yes, I forgot the Persistent. In the process of ad
| |
232 }; | |
214 | 233 |
215 template<typename T> | 234 template<typename T> |
216 class Supplement : public SupplementBase<T, false> { }; | 235 class Supplement : public SupplementBase<T, false> { }; |
217 | 236 |
218 template<typename T> | 237 template<typename T> |
219 class Supplementable : public SupplementableBase<T, false> { }; | 238 class Supplementable : public SupplementableBase<T, false> { }; |
220 | 239 |
221 template<typename T> | 240 template<typename T> |
222 struct ThreadingTrait<WebCore::SupplementBase<T, true> > { | 241 struct ThreadingTrait<WebCore::SupplementBase<T, true> > { |
223 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; | 242 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; |
224 }; | 243 }; |
225 | 244 |
226 template<typename T> | 245 template<typename T> |
227 struct ThreadingTrait<WebCore::SupplementableBase<T, true> > { | 246 struct ThreadingTrait<WebCore::SupplementableBase<T, true> > { |
228 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; | 247 static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity; |
229 }; | 248 }; |
230 | 249 |
231 } // namespace WebCore | 250 } // namespace WebCore |
232 | 251 |
233 #endif // Supplementable_h | 252 #endif // Supplementable_h |
OLD | NEW |