Title: [253500] trunk/Source
Revision
253500
Author
[email protected]
Date
2019-12-13 14:37:52 -0800 (Fri, 13 Dec 2019)

Log Message

Add a Heap::finalize function that takes WTF::Function<void()>
https://bugs.webkit.org/show_bug.cgi?id=205211

Reviewed by Geoffrey Garen.

Source/_javascript_Core:

* heap/Heap.cpp:
(JSC::Heap::addFinalizer):
(JSC::Heap::FinalizerOwner::finalize):
* heap/Heap.h:

Source/WTF:

* wtf/Function.h:
(WTF::Function<Out):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (253499 => 253500)


--- trunk/Source/_javascript_Core/ChangeLog	2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/_javascript_Core/ChangeLog	2019-12-13 22:37:52 UTC (rev 253500)
@@ -1,3 +1,15 @@
+2019-12-13  Saam Barati  <[email protected]>
+
+        Add a Heap::finalize function that takes WTF::Function<void()>
+        https://bugs.webkit.org/show_bug.cgi?id=205211
+
+        Reviewed by Geoffrey Garen.
+
+        * heap/Heap.cpp:
+        (JSC::Heap::addFinalizer):
+        (JSC::Heap::FinalizerOwner::finalize):
+        * heap/Heap.h:
+
 2019-12-13  Jim Mason  <[email protected]>
 
         [GTK] WebKitGTK build hangs on g-ir-scanner

Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (253499 => 253500)


--- trunk/Source/_javascript_Core/heap/Heap.cpp	2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp	2019-12-13 22:37:52 UTC (rev 253500)
@@ -2435,19 +2435,33 @@
     return true;
 }
 
-void Heap::addFinalizer(JSCell* cell, Finalizer finalizer)
+void Heap::addFinalizer(JSCell* cell, CFinalizer finalizer)
 {
-    WeakSet::allocate(cell, &m_finalizerOwner, reinterpret_cast<void*>(finalizer)); // Balanced by FinalizerOwner::finalize().
+    WeakSet::allocate(cell, &m_cFinalizerOwner, bitwise_cast<void*>(finalizer)); // Balanced by CFinalizerOwner::finalize().
 }
 
-void Heap::FinalizerOwner::finalize(Handle<Unknown> handle, void* context)
+void Heap::addFinalizer(JSCell* cell, LambdaFinalizer function)
 {
+    WeakSet::allocate(cell, &m_lambdaFinalizerOwner, function.leakImpl()); // Balanced by LambdaFinalizerOwner::finalize().
+}
+
+void Heap::CFinalizerOwner::finalize(Handle<Unknown> handle, void* context)
+{
     HandleSlot slot = handle.slot();
-    Finalizer finalizer = reinterpret_cast<Finalizer>(context);
+    CFinalizer finalizer = bitwise_cast<CFinalizer>(context);
     finalizer(slot->asCell());
     WeakSet::deallocate(WeakImpl::asWeakImpl(slot));
 }
 
+void Heap::LambdaFinalizerOwner::finalize(Handle<Unknown> handle, void* context)
+{
+    LambdaFinalizer::Impl* impl = bitwise_cast<LambdaFinalizer::Impl*>(context);
+    LambdaFinalizer finalizer(impl);
+    HandleSlot slot = handle.slot();
+    finalizer(slot->asCell());
+    WeakSet::deallocate(WeakImpl::asWeakImpl(slot));
+}
+
 void Heap::collectNowFullIfNotDoneRecently(Synchronousness synchronousness)
 {
     if (!m_fullActivityCallback) {

Modified: trunk/Source/_javascript_Core/heap/Heap.h (253499 => 253500)


--- trunk/Source/_javascript_Core/heap/Heap.h	2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/_javascript_Core/heap/Heap.h	2019-12-13 22:37:52 UTC (rev 253500)
@@ -171,8 +171,10 @@
     // helping heap.
     JS_EXPORT_PRIVATE bool isCurrentThreadBusy();
     
-    typedef void (*Finalizer)(JSCell*);
-    JS_EXPORT_PRIVATE void addFinalizer(JSCell*, Finalizer);
+    typedef void (*CFinalizer)(JSCell*);
+    JS_EXPORT_PRIVATE void addFinalizer(JSCell*, CFinalizer);
+    using LambdaFinalizer = WTF::Function<void(JSCell*)>;
+    JS_EXPORT_PRIVATE void addFinalizer(JSCell*, LambdaFinalizer);
 
     void notifyIsSafeToCollect();
     bool isSafeToCollect() const { return m_isSafeToCollect; }
@@ -431,10 +433,14 @@
 
     static constexpr size_t minExtraMemory = 256;
     
-    class FinalizerOwner : public WeakHandleOwner {
+    class CFinalizerOwner : public WeakHandleOwner {
         void finalize(Handle<Unknown>, void* context) override;
     };
 
+    class LambdaFinalizerOwner : public WeakHandleOwner {
+        void finalize(Handle<Unknown>, void* context) override;
+    };
+
     JS_EXPORT_PRIVATE bool isValidAllocation(size_t);
     JS_EXPORT_PRIVATE void reportExtraMemoryAllocatedSlowCase(size_t);
     JS_EXPORT_PRIVATE void deprecatedReportExtraMemorySlowCase(size_t);
@@ -634,7 +640,8 @@
     HandleSet m_handleSet;
     std::unique_ptr<CodeBlockSet> m_codeBlocks;
     std::unique_ptr<JITStubRoutineSet> m_jitStubRoutines;
-    FinalizerOwner m_finalizerOwner;
+    CFinalizerOwner m_cFinalizerOwner;
+    LambdaFinalizerOwner m_lambdaFinalizerOwner;
     
     Lock m_parallelSlotVisitorLock;
     bool m_isSafeToCollect { false };

Modified: trunk/Source/WTF/ChangeLog (253499 => 253500)


--- trunk/Source/WTF/ChangeLog	2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/WTF/ChangeLog	2019-12-13 22:37:52 UTC (rev 253500)
@@ -1,3 +1,13 @@
+2019-12-13  Saam Barati  <[email protected]>
+
+        Add a Heap::finalize function that takes WTF::Function<void()>
+        https://bugs.webkit.org/show_bug.cgi?id=205211
+
+        Reviewed by Geoffrey Garen.
+
+        * wtf/Function.h:
+        (WTF::Function<Out):
+
 2019-12-13  Per Arne Vollan  <[email protected]>
 
         [iOS] Deny mach lookup access to "*.apple-extension-service" in the WebContent process

Modified: trunk/Source/WTF/wtf/Function.h (253499 => 253500)


--- trunk/Source/WTF/wtf/Function.h	2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/WTF/wtf/Function.h	2019-12-13 22:37:52 UTC (rev 253500)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -62,8 +62,13 @@
 class Function<Out(In...)> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
+    using Impl = Detail::CallableWrapperBase<Out, In...>;
+
     Function() = default;
     Function(std::nullptr_t) { }
+    Function(Impl* impl)
+        : m_callableWrapper(impl)
+    { }
 
     template<typename CallableType, class = typename std::enable_if<!(std::is_pointer<CallableType>::value && std::is_function<typename std::remove_pointer<CallableType>::type>::value) && std::is_rvalue_reference<CallableType&&>::value>::type>
     Function(CallableType&& callable)
@@ -101,8 +106,13 @@
         return *this;
     }
 
+    Impl* leakImpl()
+    {
+        return m_callableWrapper.release();
+    }
+
 private:
-    std::unique_ptr<Detail::CallableWrapperBase<Out, In...>> m_callableWrapper;
+    std::unique_ptr<Impl> m_callableWrapper;
 };
 
 } // namespace WTF
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to