Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: Source/heap/Heap.h

Issue 205173002: Move webaudio to oilpan (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: WIP Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 21 matching lines...) Expand all
32 #define Heap_h 32 #define Heap_h
33 33
34 #include "heap/AddressSanitizer.h" 34 #include "heap/AddressSanitizer.h"
35 #include "heap/HeapExport.h" 35 #include "heap/HeapExport.h"
36 #include "heap/ThreadState.h" 36 #include "heap/ThreadState.h"
37 #include "heap/Visitor.h" 37 #include "heap/Visitor.h"
38 38
39 #include "wtf/Assertions.h" 39 #include "wtf/Assertions.h"
40 #include "wtf/OwnPtr.h" 40 #include "wtf/OwnPtr.h"
41 #include "wtf/PassRefPtr.h" 41 #include "wtf/PassRefPtr.h"
42 #include "wtf/ThreadSafeRefCounted.h"
42 43
43 #include <stdint.h> 44 #include <stdint.h>
44 45
45 namespace WebCore { 46 namespace WebCore {
46 47
47 const size_t blinkPageSizeLog2 = 17; 48 const size_t blinkPageSizeLog2 = 17;
48 const size_t blinkPageSize = 1 << blinkPageSizeLog2; 49 const size_t blinkPageSize = 1 << blinkPageSizeLog2;
49 const size_t blinkPageOffsetMask = blinkPageSize - 1; 50 const size_t blinkPageOffsetMask = blinkPageSize - 1;
50 const size_t blinkPageBaseMask = ~blinkPageOffsetMask; 51 const size_t blinkPageBaseMask = ~blinkPageOffsetMask;
51 // Double precision floats are more efficient when 8 byte aligned, so we 8 byte 52 // Double precision floats are more efficient when 8 byte aligned, so we 8 byte
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 static const int numberOfEntriesLog2 = 12; 529 static const int numberOfEntriesLog2 = 12;
529 static const int numberOfEntries = 1 << numberOfEntriesLog2; 530 static const int numberOfEntries = 1 << numberOfEntriesLog2;
530 531
531 static size_t hash(Address); 532 static size_t hash(Address);
532 533
533 WTF::OwnPtr<HeapContainsCache::Entry[]> m_entries; 534 WTF::OwnPtr<HeapContainsCache::Entry[]> m_entries;
534 535
535 friend class ThreadState; 536 friend class ThreadState;
536 }; 537 };
537 538
539 // FIXME(oilpan): The current implementation requires the deallocating
540 // thread to be the same as the thread on which this instance was first
541 // allocated. Only the refs/derefs that are not 0 -> 1 or 1 -> 0 are
542 // thread safe.
haraken 2014/03/27 11:44:05 Probably you can eliminate this restriction by usi
keishi 2014/04/03 06:53:19 Done.
543 // This is currently used by the WebAudio code and the WebDatabase code.
haraken 2014/03/27 11:44:05 Remove the "WebDatabase code" part. I think tkent-
keishi 2014/04/03 06:53:19 Done.
544 // We should attempt to restructure the WebAudio code so that the main thread
545 // alone determines life-time and receives messages about life-time from the
546 // audio thread.
547 template<typename T>
548 class ThreadSafeRefCountedGarbageCollected : public WTF::ThreadSafeRefCountedBas e, public GarbageCollectedFinalized<T> {
Mads Ager (chromium) 2014/03/27 11:06:49 I think it was like this on the branch as well, bu
keishi 2014/04/03 06:53:19 Done.
549 WTF_MAKE_NONCOPYABLE(ThreadSafeRefCountedGarbageCollected);
550
551 public:
552 ThreadSafeRefCountedGarbageCollected()
553 {
554 #ifndef NDEBUG
555 m_threadState = ThreadState::current();
556 #endif
557 m_keepAlive = new Persistent<T>(static_cast<T*>(this));
558 }
559
560 // Override ref to deal with a case where a reference count goes up
561 // from 0 to 1. This can happen in the following scenario:
562 // (1) The reference count becomes 0, but on-stack pointers keep references to the object.
563 // (2) The on-stack pointer is assigned to a RefPtr. The reference count bec omes 1.
564 // In this case, we have to resurrect m_keepAlive.
565 void ref()
566 {
567 MutexLocker lock(m_mutex);
568 if (UNLIKELY(!refCount())) {
569 ASSERT(!m_keepAlive);
570 ASSERT(m_threadState->contains(reinterpret_cast<Address>(this)));
571 ASSERT(m_threadState == ThreadState::current());
572 m_keepAlive = new Persistent<T>(static_cast<T*>(this));
573 }
574 WTF::ThreadSafeRefCountedBase::ref();
575 }
576
577 // Override deref to deal with our own deallocation based on ref counting.
578 void deref()
579 {
580 MutexLocker lock(m_mutex);
581 if (derefBase()) {
haraken 2014/03/27 11:44:05 I suspect this leaks memory, because currently der
keishi 2014/04/03 06:53:19 haraken fixed this in r170256
582 ASSERT(m_threadState == ThreadState::current());
583 m_keepAlive = 0;
haraken 2014/03/27 11:44:05 m_keepAlive = nullptr;
keishi 2014/04/03 06:53:19 Done.
584 }
585 }
586
587 using GarbageCollectedFinalized<T>::operator new;
588 using GarbageCollectedFinalized<T>::operator delete;
589
590 protected:
591 ~ThreadSafeRefCountedGarbageCollected() { }
592
593 private:
594 Persistent<T>* m_keepAlive;
haraken 2014/03/27 11:44:05 Shall we use an OwnPtr<Persistent<T> > ?
keishi 2014/04/03 06:53:19 Done.
595 mutable Mutex m_mutex;
596 #ifndef NDEBUG
597 ThreadState* m_threadState;
598 #endif
599 };
600
538 // The CallbackStack contains all the visitor callbacks used to trace and mark 601 // The CallbackStack contains all the visitor callbacks used to trace and mark
539 // objects. A specific CallbackStack instance contains at most bufferSize elemen ts. 602 // objects. A specific CallbackStack instance contains at most bufferSize elemen ts.
540 // If more space is needed a new CallbackStack instance is created and chained 603 // If more space is needed a new CallbackStack instance is created and chained
541 // together with the former instance. I.e. a logical CallbackStack can be made o f 604 // together with the former instance. I.e. a logical CallbackStack can be made o f
542 // multiple chained CallbackStack object instances. 605 // multiple chained CallbackStack object instances.
543 // There are two logical callback stacks. One containing all the marking callbac ks and 606 // There are two logical callback stacks. One containing all the marking callbac ks and
544 // one containing the weak pointer callbacks. 607 // one containing the weak pointer callbacks.
545 class CallbackStack { 608 class CallbackStack {
546 public: 609 public:
547 CallbackStack(CallbackStack** first) 610 CallbackStack(CallbackStack** first)
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 delete m_keepAlive; 1063 delete m_keepAlive;
1001 m_keepAlive = 0; 1064 m_keepAlive = 0;
1002 } 1065 }
1003 } 1066 }
1004 1067
1005 bool hasOneRef() 1068 bool hasOneRef()
1006 { 1069 {
1007 return m_refCount == 1; 1070 return m_refCount == 1;
1008 } 1071 }
1009 1072
1073 int refCount()
Mads Ager (chromium) 2014/03/27 11:06:49 Do we need this? When something is RefCountedGarba
keishi 2014/04/03 06:53:19 Done.
1074 {
1075 return m_refCount;
1076 }
1077
1010 protected: 1078 protected:
1011 ~RefCountedGarbageCollected() { } 1079 ~RefCountedGarbageCollected() { }
1012 1080
1013 private: 1081 private:
1014 int m_refCount; 1082 int m_refCount;
1015 Persistent<T>* m_keepAlive; 1083 Persistent<T>* m_keepAlive;
1016 }; 1084 };
1017 1085
1018 template<typename T> 1086 template<typename T>
1019 T* adoptRefCountedGarbageCollected(T* ptr) 1087 T* adoptRefCountedGarbageCollected(T* ptr)
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
1734 // to export. This forces it to export all the methods from ThreadHeap. 1802 // to export. This forces it to export all the methods from ThreadHeap.
1735 template<> void ThreadHeap<FinalizedHeapObjectHeader>::addPageToHeap(const GCInf o*); 1803 template<> void ThreadHeap<FinalizedHeapObjectHeader>::addPageToHeap(const GCInf o*);
1736 template<> void ThreadHeap<HeapObjectHeader>::addPageToHeap(const GCInfo*); 1804 template<> void ThreadHeap<HeapObjectHeader>::addPageToHeap(const GCInfo*);
1737 extern template class HEAP_EXPORT ThreadHeap<FinalizedHeapObjectHeader>; 1805 extern template class HEAP_EXPORT ThreadHeap<FinalizedHeapObjectHeader>;
1738 extern template class HEAP_EXPORT ThreadHeap<HeapObjectHeader>; 1806 extern template class HEAP_EXPORT ThreadHeap<HeapObjectHeader>;
1739 #endif 1807 #endif
1740 1808
1741 } 1809 }
1742 1810
1743 #endif // Heap_h 1811 #endif // Heap_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698