OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 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 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 // Normally these would be typedefs instead of subclasses, but that makes them | 675 // Normally these would be typedefs instead of subclasses, but that makes them |
676 // very hard to forward declare. | 676 // very hard to forward declare. |
677 class HeapContainsCache : public HeapExtentCache<PositiveEntry> { | 677 class HeapContainsCache : public HeapExtentCache<PositiveEntry> { |
678 public: | 678 public: |
679 BaseHeapPage* lookup(Address); | 679 BaseHeapPage* lookup(Address); |
680 void addEntry(Address, BaseHeapPage*); | 680 void addEntry(Address, BaseHeapPage*); |
681 }; | 681 }; |
682 | 682 |
683 class HeapDoesNotContainCache : public HeapExtentCache<NegativeEntry> { }; | 683 class HeapDoesNotContainCache : public HeapExtentCache<NegativeEntry> { }; |
684 | 684 |
685 // FIXME: This is currently used by the WebAudio code. | |
686 // We should attempt to restructure the WebAudio code so that the main thread | |
687 // alone determines life-time and receives messages about life-time from the | |
688 // audio thread. | |
689 template<typename T> | |
690 class ThreadSafeRefCountedGarbageCollected : public GarbageCollectedFinalized<T>
, public WTF::ThreadSafeRefCountedBase { | |
691 WTF_MAKE_NONCOPYABLE(ThreadSafeRefCountedGarbageCollected); | |
692 | |
693 public: | |
694 ThreadSafeRefCountedGarbageCollected() | |
695 { | |
696 makeKeepAlive(); | |
697 } | |
698 | |
699 // Override ref to deal with a case where a reference count goes up | |
700 // from 0 to 1. This can happen in the following scenario: | |
701 // (1) The reference count becomes 0, but on-stack pointers keep references
to the object. | |
702 // (2) The on-stack pointer is assigned to a RefPtr. The reference count bec
omes 1. | |
703 // In this case, we have to resurrect m_keepAlive. | |
704 void ref() | |
705 { | |
706 MutexLocker lock(m_mutex); | |
707 if (UNLIKELY(!refCount())) { | |
708 makeKeepAlive(); | |
709 } | |
710 WTF::ThreadSafeRefCountedBase::ref(); | |
711 } | |
712 | |
713 // Override deref to deal with our own deallocation based on ref counting. | |
714 void deref() | |
715 { | |
716 MutexLocker lock(m_mutex); | |
717 if (derefBase()) { | |
718 ASSERT(m_keepAlive); | |
719 m_keepAlive.clear(); | |
720 } | |
721 } | |
722 | |
723 using GarbageCollectedFinalized<T>::operator new; | |
724 using GarbageCollectedFinalized<T>::operator delete; | |
725 | |
726 protected: | |
727 ~ThreadSafeRefCountedGarbageCollected() { } | |
728 | |
729 private: | |
730 void makeKeepAlive() | |
731 { | |
732 ASSERT(!m_keepAlive); | |
733 m_keepAlive = adoptPtr(new CrossThreadPersistent<T>(static_cast<T*>(this
))); | |
734 } | |
735 | |
736 OwnPtr<CrossThreadPersistent<T> > m_keepAlive; | |
737 mutable Mutex m_mutex; | |
738 }; | |
739 | |
740 template<typename DataType> | 685 template<typename DataType> |
741 class PagePool { | 686 class PagePool { |
742 protected: | 687 protected: |
743 PagePool(); | 688 PagePool(); |
744 | 689 |
745 class PoolEntry { | 690 class PoolEntry { |
746 public: | 691 public: |
747 PoolEntry(DataType* data, PoolEntry* next) | 692 PoolEntry(DataType* data, PoolEntry* next) |
748 : data(data) | 693 : data(data) |
749 , next(next) | 694 , next(next) |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 // persistent handle will be deleted. When the garbage collector | 1170 // persistent handle will be deleted. When the garbage collector |
1226 // determines that there are no other references to the object it will | 1171 // determines that there are no other references to the object it will |
1227 // be reclaimed and the destructor of the reclaimed object will be | 1172 // be reclaimed and the destructor of the reclaimed object will be |
1228 // called at that time. | 1173 // called at that time. |
1229 template<typename T> | 1174 template<typename T> |
1230 class RefCountedGarbageCollected : public GarbageCollectedFinalized<T> { | 1175 class RefCountedGarbageCollected : public GarbageCollectedFinalized<T> { |
1231 WTF_MAKE_NONCOPYABLE(RefCountedGarbageCollected); | 1176 WTF_MAKE_NONCOPYABLE(RefCountedGarbageCollected); |
1232 | 1177 |
1233 public: | 1178 public: |
1234 RefCountedGarbageCollected() | 1179 RefCountedGarbageCollected() |
1235 : m_refCount(1) | 1180 : m_refCount(0) |
1236 { | 1181 { |
1237 makeKeepAlive(); | |
1238 } | 1182 } |
1239 | 1183 |
1240 // Implement method to increase reference count for use with | 1184 // Implement method to increase reference count for use with |
1241 // RefPtrs. | 1185 // RefPtrs. |
1242 // | 1186 // |
1243 // In contrast to the normal WTF::RefCounted, the reference count | 1187 // In contrast to the normal WTF::RefCounted, the reference count |
1244 // can reach 0 and increase again. This happens in the following | 1188 // can reach 0 and increase again. This happens in the following |
1245 // scenario: | 1189 // scenario: |
1246 // | 1190 // |
1247 // (1) The reference count becomes 0, but members, persistents, or | 1191 // (1) The reference count becomes 0, but members, persistents, or |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1289 void makeKeepAlive() | 1233 void makeKeepAlive() |
1290 { | 1234 { |
1291 ASSERT(!m_keepAlive); | 1235 ASSERT(!m_keepAlive); |
1292 m_keepAlive = new Persistent<T>(static_cast<T*>(this)); | 1236 m_keepAlive = new Persistent<T>(static_cast<T*>(this)); |
1293 } | 1237 } |
1294 | 1238 |
1295 int m_refCount; | 1239 int m_refCount; |
1296 Persistent<T>* m_keepAlive; | 1240 Persistent<T>* m_keepAlive; |
1297 }; | 1241 }; |
1298 | 1242 |
1299 template<typename T> | |
1300 T* adoptRefCountedGarbageCollected(T* ptr) | |
1301 { | |
1302 ASSERT(ptr->hasOneRef()); | |
1303 ptr->deref(); | |
1304 WTF::adopted(ptr); | |
1305 return ptr; | |
1306 } | |
1307 | |
1308 // Classes that contain heap references but aren't themselves heap | 1243 // Classes that contain heap references but aren't themselves heap |
1309 // allocated, have some extra macros available which allows their use | 1244 // allocated, have some extra macros available which allows their use |
1310 // to be restricted to cases where the garbage collector is able | 1245 // to be restricted to cases where the garbage collector is able |
1311 // to discover their heap references. | 1246 // to discover their heap references. |
1312 // | 1247 // |
1313 // STACK_ALLOCATED(): Use if the object is only stack allocated. Heap objects | 1248 // STACK_ALLOCATED(): Use if the object is only stack allocated. Heap objects |
1314 // should be in Members but you do not need the trace method as they are on | 1249 // should be in Members but you do not need the trace method as they are on |
1315 // the stack. (Down the line these might turn in to raw pointers, but for | 1250 // the stack. (Down the line these might turn in to raw pointers, but for |
1316 // now Members indicates that we have thought about them and explicitly | 1251 // now Members indicates that we have thought about them and explicitly |
1317 // taken care of them.) | 1252 // taken care of them.) |
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2488 }; | 2423 }; |
2489 | 2424 |
2490 template<typename T> | 2425 template<typename T> |
2491 struct IfWeakMember<WeakMember<T> > { | 2426 struct IfWeakMember<WeakMember<T> > { |
2492 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit
or->isAlive(t.get()); } | 2427 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit
or->isAlive(t.get()); } |
2493 }; | 2428 }; |
2494 | 2429 |
2495 } | 2430 } |
2496 | 2431 |
2497 #endif // Heap_h | 2432 #endif // Heap_h |
OLD | NEW |