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 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 private: | 615 private: |
616 static const int numberOfEntriesLog2 = 12; | 616 static const int numberOfEntriesLog2 = 12; |
617 static const int numberOfEntries = 1 << numberOfEntriesLog2; | 617 static const int numberOfEntries = 1 << numberOfEntriesLog2; |
618 | 618 |
619 static size_t hash(Address); | 619 static size_t hash(Address); |
620 | 620 |
621 WTF::OwnPtr<Address[]> m_entries; | 621 WTF::OwnPtr<Address[]> m_entries; |
622 bool m_hasEntries; | 622 bool m_hasEntries; |
623 }; | 623 }; |
624 | 624 |
625 // FIXME: This is currently used by the WebAudio code. | |
626 // We should attempt to restructure the WebAudio code so that the main thread | |
627 // alone determines life-time and receives messages about life-time from the | |
628 // audio thread. | |
629 template<typename T> | |
630 class ThreadSafeRefCountedGarbageCollected : public GarbageCollectedFinalized<T>
, public WTF::ThreadSafeRefCountedBase { | |
631 WTF_MAKE_NONCOPYABLE(ThreadSafeRefCountedGarbageCollected); | |
632 | |
633 public: | |
634 ThreadSafeRefCountedGarbageCollected() | |
635 { | |
636 makeKeepAlive(); | |
637 } | |
638 | |
639 // Override ref to deal with a case where a reference count goes up | |
640 // from 0 to 1. This can happen in the following scenario: | |
641 // (1) The reference count becomes 0, but on-stack pointers keep references
to the object. | |
642 // (2) The on-stack pointer is assigned to a RefPtr. The reference count bec
omes 1. | |
643 // In this case, we have to resurrect m_keepAlive. | |
644 void ref() | |
645 { | |
646 MutexLocker lock(m_mutex); | |
647 if (UNLIKELY(!refCount())) { | |
648 makeKeepAlive(); | |
649 } | |
650 WTF::ThreadSafeRefCountedBase::ref(); | |
651 } | |
652 | |
653 // Override deref to deal with our own deallocation based on ref counting. | |
654 void deref() | |
655 { | |
656 MutexLocker lock(m_mutex); | |
657 if (derefBase()) { | |
658 ASSERT(m_keepAlive); | |
659 m_keepAlive.clear(); | |
660 } | |
661 } | |
662 | |
663 using GarbageCollectedFinalized<T>::operator new; | |
664 using GarbageCollectedFinalized<T>::operator delete; | |
665 | |
666 protected: | |
667 ~ThreadSafeRefCountedGarbageCollected() { } | |
668 | |
669 private: | |
670 void makeKeepAlive() | |
671 { | |
672 ASSERT(!m_keepAlive); | |
673 m_keepAlive = adoptPtr(new CrossThreadPersistent<T>(static_cast<T*>(this
))); | |
674 } | |
675 | |
676 OwnPtr<CrossThreadPersistent<T> > m_keepAlive; | |
677 mutable Mutex m_mutex; | |
678 }; | |
679 | |
680 template<typename DataType> | 625 template<typename DataType> |
681 class PagePool { | 626 class PagePool { |
682 protected: | 627 protected: |
683 PagePool(); | 628 PagePool(); |
684 | 629 |
685 class PoolEntry { | 630 class PoolEntry { |
686 public: | 631 public: |
687 PoolEntry(DataType* data, PoolEntry* next) | 632 PoolEntry(DataType* data, PoolEntry* next) |
688 : data(data) | 633 : data(data) |
689 , next(next) | 634 , next(next) |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 // persistent handle will be deleted. When the garbage collector | 1132 // persistent handle will be deleted. When the garbage collector |
1188 // determines that there are no other references to the object it will | 1133 // determines that there are no other references to the object it will |
1189 // be reclaimed and the destructor of the reclaimed object will be | 1134 // be reclaimed and the destructor of the reclaimed object will be |
1190 // called at that time. | 1135 // called at that time. |
1191 template<typename T> | 1136 template<typename T> |
1192 class RefCountedGarbageCollected : public GarbageCollectedFinalized<T> { | 1137 class RefCountedGarbageCollected : public GarbageCollectedFinalized<T> { |
1193 WTF_MAKE_NONCOPYABLE(RefCountedGarbageCollected); | 1138 WTF_MAKE_NONCOPYABLE(RefCountedGarbageCollected); |
1194 | 1139 |
1195 public: | 1140 public: |
1196 RefCountedGarbageCollected() | 1141 RefCountedGarbageCollected() |
1197 : m_refCount(1) | 1142 : m_refCount(0) |
1198 { | 1143 { |
1199 makeKeepAlive(); | |
1200 } | 1144 } |
1201 | 1145 |
1202 // Implement method to increase reference count for use with | 1146 // Implement method to increase reference count for use with |
1203 // RefPtrs. | 1147 // RefPtrs. |
1204 // | 1148 // |
1205 // In contrast to the normal WTF::RefCounted, the reference count | 1149 // In contrast to the normal WTF::RefCounted, the reference count |
1206 // can reach 0 and increase again. This happens in the following | 1150 // can reach 0 and increase again. This happens in the following |
1207 // scenario: | 1151 // scenario: |
1208 // | 1152 // |
1209 // (1) The reference count becomes 0, but members, persistents, or | 1153 // (1) The reference count becomes 0, but members, persistents, or |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 void makeKeepAlive() | 1195 void makeKeepAlive() |
1252 { | 1196 { |
1253 ASSERT(!m_keepAlive); | 1197 ASSERT(!m_keepAlive); |
1254 m_keepAlive = new Persistent<T>(static_cast<T*>(this)); | 1198 m_keepAlive = new Persistent<T>(static_cast<T*>(this)); |
1255 } | 1199 } |
1256 | 1200 |
1257 int m_refCount; | 1201 int m_refCount; |
1258 Persistent<T>* m_keepAlive; | 1202 Persistent<T>* m_keepAlive; |
1259 }; | 1203 }; |
1260 | 1204 |
1261 template<typename T> | |
1262 T* adoptRefCountedGarbageCollected(T* ptr) | |
1263 { | |
1264 ASSERT(ptr->hasOneRef()); | |
1265 ptr->deref(); | |
1266 WTF::adopted(ptr); | |
1267 return ptr; | |
1268 } | |
1269 | |
1270 // Classes that contain heap references but aren't themselves heap | 1205 // Classes that contain heap references but aren't themselves heap |
1271 // allocated, have some extra macros available which allows their use | 1206 // allocated, have some extra macros available which allows their use |
1272 // to be restricted to cases where the garbage collector is able | 1207 // to be restricted to cases where the garbage collector is able |
1273 // to discover their heap references. | 1208 // to discover their heap references. |
1274 // | 1209 // |
1275 // STACK_ALLOCATED(): Use if the object is only stack allocated. Heap objects | 1210 // STACK_ALLOCATED(): Use if the object is only stack allocated. Heap objects |
1276 // should be in Members but you do not need the trace method as they are on | 1211 // should be in Members but you do not need the trace method as they are on |
1277 // the stack. (Down the line these might turn in to raw pointers, but for | 1212 // the stack. (Down the line these might turn in to raw pointers, but for |
1278 // now Members indicates that we have thought about them and explicitly | 1213 // now Members indicates that we have thought about them and explicitly |
1279 // taken care of them.) | 1214 // taken care of them.) |
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2450 }; | 2385 }; |
2451 | 2386 |
2452 template<typename T> | 2387 template<typename T> |
2453 struct IfWeakMember<WeakMember<T> > { | 2388 struct IfWeakMember<WeakMember<T> > { |
2454 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit
or->isAlive(t.get()); } | 2389 static bool isDead(Visitor* visitor, const WeakMember<T>& t) { return !visit
or->isAlive(t.get()); } |
2455 }; | 2390 }; |
2456 | 2391 |
2457 } | 2392 } |
2458 | 2393 |
2459 #endif // Heap_h | 2394 #endif // Heap_h |
OLD | NEW |