summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/heap/GCThreadSharedData.h
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
commit8995b83bcbfbb68245f779b64e5517627c6cc6ea (patch)
tree17985605dab9263cc2444bd4d45f189e142cca7c /Source/JavaScriptCore/heap/GCThreadSharedData.h
parentb9c9652036d5e9f1e29c574f40bc73a35c81ace6 (diff)
downloadqtwebkit-8995b83bcbfbb68245f779b64e5517627c6cc6ea.tar.gz
Imported WebKit commit cf4f8fc6f19b0629f51860cb2d4b25e139d07e00 (http://svn.webkit.org/repository/webkit/trunk@131592)
New snapshot that includes the build fixes for Mac OS X 10.6 and earlier as well as the previously cherry-picked changes
Diffstat (limited to 'Source/JavaScriptCore/heap/GCThreadSharedData.h')
-rw-r--r--Source/JavaScriptCore/heap/GCThreadSharedData.h45
1 files changed, 38 insertions, 7 deletions
diff --git a/Source/JavaScriptCore/heap/GCThreadSharedData.h b/Source/JavaScriptCore/heap/GCThreadSharedData.h
index 3f09a2820..bd48d9263 100644
--- a/Source/JavaScriptCore/heap/GCThreadSharedData.h
+++ b/Source/JavaScriptCore/heap/GCThreadSharedData.h
@@ -28,16 +28,27 @@
#include "ListableHandler.h"
#include "MarkStack.h"
+#include "MarkedBlock.h"
#include "UnconditionalFinalizer.h"
#include "WeakReferenceHarvester.h"
#include <wtf/HashSet.h>
+#include <wtf/TCSpinLock.h>
#include <wtf/Threading.h>
#include <wtf/Vector.h>
namespace JSC {
+class GCThread;
class JSGlobalData;
class CopiedSpace;
+class CopyVisitor;
+
+enum GCPhase {
+ NoPhase,
+ Mark,
+ Copy,
+ Exit
+};
class GCThreadSharedData {
public:
@@ -46,6 +57,11 @@ public:
void reset();
+ void didStartMarking();
+ void didFinishMarking();
+ void didStartCopying();
+ void didFinishCopying();
+
#if ENABLE(PARALLEL_GC)
void resetChildren();
size_t childVisitCount();
@@ -53,12 +69,11 @@ public:
#endif
private:
+ friend class GCThread;
friend class SlotVisitor;
+ friend class CopyVisitor;
-#if ENABLE(PARALLEL_GC)
- void markingThreadMain(SlotVisitor*);
- static void markingThreadStartFunc(void* heap);
-#endif
+ void getNextBlocksToCopy(size_t&, size_t&);
JSGlobalData* m_globalData;
CopiedSpace* m_copiedSpace;
@@ -67,9 +82,8 @@ private:
bool m_shouldHashConst;
- Vector<ThreadIdentifier> m_markingThreads;
- Vector<SlotVisitor*> m_markingThreadsMarkStack;
-
+ Vector<GCThread*> m_gcThreads;
+
Mutex m_markingLock;
ThreadCondition m_markingCondition;
MarkStackArray m_sharedMarkStack;
@@ -79,10 +93,27 @@ private:
Mutex m_opaqueRootsLock;
HashSet<void*> m_opaqueRoots;
+ SpinLock m_copyLock;
+ Vector<MarkedBlock*>& m_blocksToCopy;
+ size_t m_copyIndex;
+ static const size_t s_blockFragmentLength = 32;
+
+ Mutex m_phaseLock;
+ ThreadCondition m_phaseCondition;
+ GCPhase m_currentPhase;
+
ListableHandler<WeakReferenceHarvester>::List m_weakReferenceHarvesters;
ListableHandler<UnconditionalFinalizer>::List m_unconditionalFinalizers;
};
+inline void GCThreadSharedData::getNextBlocksToCopy(size_t& start, size_t& end)
+{
+ SpinLockHolder locker(&m_copyLock);
+ start = m_copyIndex;
+ end = std::min(m_blocksToCopy.size(), m_copyIndex + s_blockFragmentLength);
+ m_copyIndex = end;
+}
+
} // namespace JSC
#endif