aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/BunGCOutputConstraint.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-22 23:21:48 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-06-22 23:21:48 -0700
commit729d445b6885f69dd2c6355f38707bd42851c791 (patch)
treef87a7c408929ea3f57bbb7ace380cf869da83c0e /src/bun.js/bindings/BunGCOutputConstraint.cpp
parent25f820c6bf1d8ec6d444ef579cc036b8c0607b75 (diff)
downloadbun-729d445b6885f69dd2c6355f38707bd42851c791.tar.gz
bun-729d445b6885f69dd2c6355f38707bd42851c791.tar.zst
bun-729d445b6885f69dd2c6355f38707bd42851c791.zip
change the directory structurejarred/rename
Diffstat (limited to 'src/bun.js/bindings/BunGCOutputConstraint.cpp')
-rw-r--r--src/bun.js/bindings/BunGCOutputConstraint.cpp184
1 files changed, 184 insertions, 0 deletions
diff --git a/src/bun.js/bindings/BunGCOutputConstraint.cpp b/src/bun.js/bindings/BunGCOutputConstraint.cpp
new file mode 100644
index 000000000..97ee0761b
--- /dev/null
+++ b/src/bun.js/bindings/BunGCOutputConstraint.cpp
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2017-2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#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 "WebCoreJSClientData.h"
+#include "JavaScriptCore/BlockDirectoryInlines.h"
+#include "JavaScriptCore/HeapInlines.h"
+#include "JavaScriptCore/MarkedBlockInlines.h"
+#include "JavaScriptCore/SubspaceInlines.h"
+
+namespace WebCore {
+
+using namespace JSC;
+
+DOMGCOutputConstraint::DOMGCOutputConstraint(VM& vm, JSHeapData& heapData)
+ : MarkingConstraint("Domo", "DOM Output", ConstraintVolatility::SeldomGreyed, ConstraintConcurrency::Concurrent, ConstraintParallelism::Parallel)
+ , m_vm(vm)
+ , m_heapData(heapData)
+ , m_lastExecutionVersion(vm.heap.mutatorExecutionVersion())
+{
+}
+
+DOMGCOutputConstraint::~DOMGCOutputConstraint()
+{
+}
+
+template<typename Visitor>
+void DOMGCOutputConstraint::executeImplImpl(Visitor& visitor)
+{
+ Heap& heap = m_vm.heap;
+
+ if (heap.mutatorExecutionVersion() == m_lastExecutionVersion)
+ return;
+
+ m_lastExecutionVersion = heap.mutatorExecutionVersion();
+
+ m_heapData.forEachOutputConstraintSpace(
+ [&](Subspace& subspace) {
+ auto func = [](Visitor& visitor, HeapCell* heapCell, HeapCell::Kind) {
+ SetRootMarkReasonScope rootScope(visitor, RootMarkReason::DOMGCOutput);
+ JSCell* cell = static_cast<JSCell*>(heapCell);
+ cell->methodTable()->visitOutputConstraints(cell, visitor);
+ };
+
+ RefPtr<SharedTask<void(Visitor&)>> task = subspace.template forEachMarkedCellInParallel<Visitor>(func);
+ visitor.addParallelConstraintTask(task);
+ });
+}
+
+void DOMGCOutputConstraint::executeImpl(AbstractSlotVisitor& visitor) { executeImplImpl(visitor); }
+void DOMGCOutputConstraint::executeImpl(SlotVisitor& visitor) { executeImplImpl(visitor); }
+
+} // namespace WebCore