add GC output constraints

I don't fully understand what this does

but it sounds good!
This commit is contained in:
Jarred Sumner
2022-04-07 01:57:45 -07:00
parent 9bee40813f
commit e08cc968cb
31 changed files with 130 additions and 161 deletions

View File

@@ -66,7 +66,7 @@ void JSVMClientData::create(VM* vm)
vm->clientData = clientData; // ~VM deletes this pointer.
clientData->m_normalWorld = DOMWrapperWorld::create(*vm, DOMWrapperWorld::Type::Normal);
// vm->heap.addMarkingConstraint(makeUnique<WebCore::DOMGCOutputConstraint>(*vm, clientData->heapData()));
vm->heap.addMarkingConstraint(makeUnique<WebCore::DOMGCOutputConstraint>(*vm, clientData->heapData()));
vm->m_typedArrayController = adoptRef(new WebCoreTypedArrayController(true));
}

View File

@@ -20,9 +20,7 @@ class DOMWrapperWorld;
#include "wtf/Function.h"
#include "wtf/HashSet.h"
#include "wtf/RefPtr.h"
#include "JavaScriptCore/WeakHandleOwner.h"
#include "JavaScriptCore/WeakInlines.h"
#include "JavaScriptCore/IsoSubspacePerVM.h"
namespace WebCore {

View File

@@ -24,123 +24,121 @@
*/
#include "config.h"
#include "JavaScriptCore/WeakInlines.h"
#include "JavaScriptCore/AbstractSlotVisitorInlines.h"
#include "JavaScriptCore/VM.h"
#include "JavaScriptCore/MarkingConstraint.h"
namespace JSC {
class VisitCounter {
public:
VisitCounter() {}
VisitCounter(AbstractSlotVisitor& visitor)
: m_visitor(&visitor)
, m_initialVisitCount(visitor.visitCount())
{
}
AbstractSlotVisitor& visitor() const { return *m_visitor; }
size_t visitCount() const
{
return m_visitor->visitCount() - m_initialVisitCount;
}
private:
AbstractSlotVisitor* m_visitor { nullptr };
size_t m_initialVisitCount { 0 };
};
static constexpr bool verboseMarkingConstraint = false;
MarkingConstraint::MarkingConstraint(CString abbreviatedName, CString name, ConstraintVolatility volatility, ConstraintConcurrency concurrency, ConstraintParallelism parallelism)
: m_abbreviatedName(abbreviatedName)
, m_name(WTFMove(name))
, m_volatility(volatility)
, m_concurrency(concurrency)
, m_parallelism(parallelism)
{
}
MarkingConstraint::~MarkingConstraint()
{
}
void MarkingConstraint::resetStats()
{
m_lastVisitCount = 0;
}
void MarkingConstraint::execute(SlotVisitor& visitor)
{
ASSERT(!visitor.heap()->isMarkingForGCVerifier());
VisitCounter visitCounter(visitor);
executeImpl(visitor);
m_lastVisitCount += visitCounter.visitCount();
if (verboseMarkingConstraint && visitCounter.visitCount())
dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in execute)");
}
void MarkingConstraint::executeSynchronously(AbstractSlotVisitor& visitor)
{
prepareToExecuteImpl(NoLockingNecessary, visitor);
executeImpl(visitor);
}
double MarkingConstraint::quickWorkEstimate(SlotVisitor&)
{
return 0;
}
double MarkingConstraint::workEstimate(SlotVisitor& visitor)
{
return lastVisitCount() + quickWorkEstimate(visitor);
}
void MarkingConstraint::prepareToExecute(const AbstractLocker& constraintSolvingLocker, SlotVisitor& visitor)
{
ASSERT(!visitor.heap()->isMarkingForGCVerifier());
dataLogIf(Options::logGC(), abbreviatedName());
VisitCounter visitCounter(visitor);
prepareToExecuteImpl(constraintSolvingLocker, visitor);
m_lastVisitCount = visitCounter.visitCount();
if (verboseMarkingConstraint && visitCounter.visitCount())
dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in prepareToExecute)");
}
void MarkingConstraint::doParallelWork(SlotVisitor& visitor, SharedTask<void(SlotVisitor&)>& task)
{
ASSERT(!visitor.heap()->isMarkingForGCVerifier());
VisitCounter visitCounter(visitor);
task.run(visitor);
if (verboseMarkingConstraint && visitCounter.visitCount())
dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in doParallelWork)");
{
Locker locker { m_lock };
m_lastVisitCount += visitCounter.visitCount();
}
}
void MarkingConstraint::prepareToExecuteImpl(const AbstractLocker&, AbstractSlotVisitor&)
{
}
} // namespace JSC
#include "BunGCOutputConstraint.h"
#include "JavaScriptCore/JSCInlines.h"
#include "WebCoreJSClientData.h"
#include "JavaScriptCore/BlockDirectoryInlines.h"
#include "JavaScriptCore/HeapInlines.h"
#include "JavaScriptCore/MarkedBlockInlines.h"
#include "JavaScriptCore/SubspaceInlines.h"
// #include "JavaScriptCore/WeakInlines.h"
// #include "JavaScriptCore/AbstractSlotVisitorInlines.h"
// #include "JavaScriptCore/VM.h"
// #include "JavaScriptCore/MarkingConstraint.h"
// #include "JavaScriptCore/JSCInlines.h"
// namespace JSC {
// class VisitCounter {
// public:
// VisitCounter() {}
// VisitCounter(AbstractSlotVisitor& visitor)
// : m_visitor(&visitor)
// , m_initialVisitCount(visitor.visitCount())
// {
// }
// AbstractSlotVisitor& visitor() const { return *m_visitor; }
// size_t visitCount() const
// {
// return m_visitor->visitCount() - m_initialVisitCount;
// }
// private:
// AbstractSlotVisitor* m_visitor { nullptr };
// size_t m_initialVisitCount { 0 };
// };
// static constexpr bool verboseMarkingConstraint = false;
// MarkingConstraint::MarkingConstraint(CString abbreviatedName, CString name, ConstraintVolatility volatility, ConstraintConcurrency concurrency, ConstraintParallelism parallelism)
// : m_abbreviatedName(abbreviatedName)
// , m_name(WTFMove(name))
// , m_volatility(volatility)
// , m_concurrency(concurrency)
// , m_parallelism(parallelism)
// {
// }
// MarkingConstraint::~MarkingConstraint()
// {
// }
// void MarkingConstraint::resetStats()
// {
// m_lastVisitCount = 0;
// }
// void MarkingConstraint::execute(SlotVisitor& visitor)
// {
// ASSERT(!visitor.heap()->isMarkingForGCVerifier());
// VisitCounter visitCounter(visitor);
// executeImpl(visitor);
// m_lastVisitCount += visitCounter.visitCount();
// if (verboseMarkingConstraint && visitCounter.visitCount())
// dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in execute)");
// }
// void MarkingConstraint::executeSynchronously(AbstractSlotVisitor& visitor)
// {
// prepareToExecuteImpl(NoLockingNecessary, visitor);
// executeImpl(visitor);
// }
// double MarkingConstraint::quickWorkEstimate(SlotVisitor&)
// {
// return 0;
// }
// double MarkingConstraint::workEstimate(SlotVisitor& visitor)
// {
// return lastVisitCount() + quickWorkEstimate(visitor);
// }
// void MarkingConstraint::prepareToExecute(const AbstractLocker& constraintSolvingLocker, SlotVisitor& visitor)
// {
// ASSERT(!visitor.heap()->isMarkingForGCVerifier());
// dataLogIf(Options::logGC(), abbreviatedName());
// VisitCounter visitCounter(visitor);
// prepareToExecuteImpl(constraintSolvingLocker, visitor);
// m_lastVisitCount = visitCounter.visitCount();
// if (verboseMarkingConstraint && visitCounter.visitCount())
// dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in prepareToExecute)");
// }
// void MarkingConstraint::doParallelWork(SlotVisitor& visitor, SharedTask<void(SlotVisitor&)>& task)
// {
// ASSERT(!visitor.heap()->isMarkingForGCVerifier());
// VisitCounter visitCounter(visitor);
// task.run(visitor);
// if (verboseMarkingConstraint && visitCounter.visitCount())
// dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in doParallelWork)");
// {
// Locker locker { m_lock };
// m_lastVisitCount += visitCounter.visitCount();
// }
// }
// void MarkingConstraint::prepareToExecuteImpl(const AbstractLocker&, AbstractSlotVisitor&)
// {
// }
// } // namespace JSC
namespace WebCore {
using namespace JSC;

View File

@@ -2,8 +2,6 @@
#include "JavaScriptCore/JSMicrotask.h"
#include "JavaScriptCore/ObjectConstructor.h"
#include "JavaScriptCore/JSCInlines.h"
namespace WebCore {
using JSGlobalObject = JSC::JSGlobalObject;
using Exception = JSC::Exception;

View File

@@ -2,8 +2,6 @@
#include "root.h"
#include "JavaScriptCore/JSCInlines.h"
#include "wtf/Forward.h"
namespace WebCore {

View File

@@ -2,8 +2,6 @@
#include "helpers.h"
#include "JavaScriptCore/JSCInlines.h"
namespace JSC {
ALWAYS_INLINE GCDeferralContext::GCDeferralContext(VM& vm)

View File

@@ -18,4 +18,3 @@
#include "wtf/GetPtr.h"
#include "wtf/Vector.h"
#include <cstddef>
#include "JavaScriptCore/WeakHandleOwner.h"

View File

@@ -25,8 +25,6 @@
#include "root.h"
#include "JavaScriptCore/WeakHandleOwner.h"
#include "ExceptionDetails.h"
#include "ExceptionOr.h"
#include "JavaScriptCore/ThrowScope.h"

View File

@@ -23,8 +23,6 @@
#include "JSDOMWrapperCache.h"
#include "JavaScriptCore/JSCInlines.h"
namespace WebCore {
using namespace JSC;

View File

@@ -3,8 +3,6 @@
#include "BunClientData.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSFunction.h"
#include "JavaScriptCore/JSMicrotask.h"
#include "JavaScriptCore/ObjectConstructor.h"

View File

@@ -2,8 +2,6 @@
#include "JavaScriptCore/JSMicrotask.h"
#include "JavaScriptCore/ObjectConstructor.h"
#include "JavaScriptCore/JSCInlines.h"
#pragma mark - Node.js Process
namespace Zig {

View File

@@ -8,7 +8,6 @@
#include "wtf/text/WTFString.h"
#include "GCDefferalContext.h"
#include "JavaScriptCore/JSCInlines.h"
using ScriptArguments = Inspector::ScriptArguments;
using MessageType = JSC::MessageType;

View File

@@ -22,7 +22,7 @@
#include "JavaScriptCore/InitializeThreading.h"
#include "JavaScriptCore/IteratorOperations.h"
#include "JavaScriptCore/JSArray.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSCallbackConstructor.h"
#include "JavaScriptCore/JSCallbackObject.h"
#include "JavaScriptCore/JSCast.h"
@@ -109,7 +109,6 @@ extern "C" void JSCInitialize()
has_loaded_jsc = true;
JSC::Config::enableRestrictedOptions();
// JSC::Options::useAtMethod() = true;
std::set_terminate([]() { Zig__GlobalObject__onCrash(); });
WTF::initializeMainThread();
JSC::initialize();
@@ -136,12 +135,12 @@ extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSClassRef* globalObje
auto heapSize = JSC::HeapType::Large;
JSC::VM& vm = JSC::VM::create(heapSize).leakRef();
JSC::Wasm::enableFastMemory();
WebCore::JSVMClientData::create(&vm);
// This must happen before JSVMClientData::create
vm.heap.acquireAccess();
JSC::Wasm::enableFastMemory();
WebCore::JSVMClientData::create(&vm);
JSC::JSLockHolder locker(vm);
Zig::GlobalObject* globalObject = Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::JSGlobalObject::create(vm, JSC::JSGlobalObject::createStructure(vm, JSC::jsNull())), JSC::jsNull()));
@@ -152,6 +151,7 @@ extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSClassRef* globalObje
}
JSC::gcProtect(globalObject);
vm.ref();
return globalObject;
}

View File

@@ -18,7 +18,7 @@
#include "JavaScriptCore/JSArray.h"
#include "JavaScriptCore/JSArrayBuffer.h"
#include "JavaScriptCore/JSArrayInlines.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSCallbackObject.h"
#include "JavaScriptCore/JSClassRef.h"
#include "JavaScriptCore/JSInternalPromise.h"
@@ -2409,7 +2409,7 @@ void JSC__JSValue__getNameProperty(JSC__JSValue JSValue0, JSC__JSGlobalObject* a
{
JSC::JSObject* obj = JSC::JSValue::decode(JSValue0).getObject();
JSC::VM &vm = arg1->vm();
JSC::VM& vm = arg1->vm();
if (obj == nullptr) {
arg2->len = 0;
@@ -2417,10 +2417,9 @@ void JSC__JSValue__getNameProperty(JSC__JSValue JSValue0, JSC__JSGlobalObject* a
}
JSC::JSValue name = obj->getDirect(vm, vm.propertyNames->toStringTagSymbol);
if (name == JSC::JSValue{}) {
if (name == JSC::JSValue {}) {
name = obj->getDirect(vm, vm.propertyNames->name);
}
if (name && name.isString()) {
auto str = name.toWTFString(arg1);

View File

@@ -1,4 +1,4 @@
//-- AUTOGENERATED FILE -- 1648857986
//-- AUTOGENERATED FILE -- 1649320745
// clang-format off
#pragma once

View File

@@ -1,5 +1,5 @@
// clang-format: off
//-- AUTOGENERATED FILE -- 1648857986
//-- AUTOGENERATED FILE -- 1649320745
#pragma once
#include <stddef.h>

View File

@@ -4,7 +4,7 @@
// #include "headers.h"
// #include "JavaScriptCore/JSObject.h"
// #include "JavaScriptCore/JSCInlines.h"
//
// #include "JavaScriptCore/InternalFunction.h"
// namespace Zig {

View File

@@ -1,4 +1,4 @@
#include "JavaScriptCore/JSCInlines.h"
#include "wtf/FastMalloc.h"
#include "wtf/Noncopyable.h"

View File

@@ -41,7 +41,7 @@
#include "WebCoreJSClientData.h"
#include "JavaScriptCore/FunctionPrototype.h"
#include "JavaScriptCore/HeapAnalyzer.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
#include "JavaScriptCore/SlotVisitorMacros.h"
#include "JavaScriptCore/SubspaceInlines.h"

View File

@@ -28,8 +28,6 @@
#include "wtf/NeverDestroyed.h"
#include "JSAbortSignal.h"
#include "JavaScriptCore/WeakHandleOwner.h"
namespace WebCore {
bool JSAbortSignalOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::AbstractSlotVisitor& visitor, const char** reason)

View File

@@ -22,7 +22,6 @@
#include "config.h"
#include "JSDOMConstructor.h"
#include "JavaScriptCore/JSCInlines.h"
#include "WebCoreJSClientData.h"
namespace WebCore {

View File

@@ -71,7 +71,6 @@
#include "JSWebGLTransformFeedback.h"
#include "JSWebGLVertexArrayObject.h"
#include "JSWebGLVertexArrayObjectOES.h"
#include "JavaScriptCore/JSCInlines.h"
namespace WebCore {
using namespace JSC;

View File

@@ -38,7 +38,7 @@
#include "WebCoreJSClientData.h"
#include "JavaScriptCore/FunctionPrototype.h"
#include "JavaScriptCore/HeapAnalyzer.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
#include "JavaScriptCore/SlotVisitorMacros.h"
#include "JavaScriptCore/SubspaceInlines.h"

View File

@@ -27,8 +27,6 @@
#include "JavaScriptCore/ErrorPrototype.h"
#include "wtf/NeverDestroyed.h"
#include "JavaScriptCore/WeakHandleOwner.h"
namespace WebCore {
class JSDOMException : public JSDOMWrapper<DOMException> {

View File

@@ -43,7 +43,7 @@
#include "WebCoreJSClientData.h"
#include "JavaScriptCore/FunctionPrototype.h"
#include "JavaScriptCore/HeapAnalyzer.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
#include "JavaScriptCore/SlotVisitorMacros.h"
#include "JavaScriptCore/SubspaceInlines.h"

View File

@@ -45,7 +45,7 @@
#include "JavaScriptCore/FunctionPrototype.h"
#include "JavaScriptCore/HeapAnalyzer.h"
#include "JavaScriptCore/JSArray.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
#include "JavaScriptCore/SlotVisitorMacros.h"
#include "JavaScriptCore/SubspaceInlines.h"

View File

@@ -32,7 +32,7 @@
#pragma once
#include "root.h"
#include "JavaScriptCore/JSCInlines.h"
#include "JSDOMWrapper.h"
// #include "wtf/IsoMalloc.h"

View File

@@ -25,8 +25,6 @@
#include "root.h"
#include "JavaScriptCore/JSCInlines.h"
#include "WebCoreTypedArrayController.h"
#include "JSDOMConvertBufferSource.h"

View File

@@ -1,7 +1,6 @@
#pragma once
#include "config.h"
#include "JavaScriptCore/WeakHandleOwner.h"
namespace JSC {