Commit 44f03ca9 authored by Michael Lippautz's avatar Michael Lippautz Committed by Commit Bot

heap: Use LivenessBroker in PreFinalizer

Use broker object for querying liveness.

Bug: chromium:1071168
Change-Id: Ie6ca397d4378b84dd17f09958cee10dadf1dfdbf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2152789Reviewed-by: default avatarOmer Katz <omerkatz@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#760929}
parent 58a38779
......@@ -692,6 +692,7 @@ class PLATFORM_EXPORT LivenessBroker final {
private:
LivenessBroker() = default;
friend class ThreadHeap;
friend class ThreadState;
};
template <typename T>
......
......@@ -1136,11 +1136,12 @@ void ThreadState::InvokePreFinalizers() {
// The prefinalizer callback wrapper returns |true| when its associated
// object is unreachable garbage and the prefinalizer callback has run.
// The registered prefinalizer entry must then be removed and deleted.
LivenessBroker broker;
Deque<PreFinalizer> remaining_ordered_pre_finalizers;
for (auto rit = ordered_pre_finalizers_.rbegin();
rit != ordered_pre_finalizers_.rend(); ++rit) {
const PreFinalizer& pre_finalizer = *rit;
if (!(pre_finalizer.second)(pre_finalizer.first))
if (!(pre_finalizer.second)(broker, pre_finalizer.first))
remaining_ordered_pre_finalizers.push_front(pre_finalizer);
}
......
......@@ -94,18 +94,18 @@ class Visitor;
// }
// Member<Bar> bar_;
// };
#define USING_PRE_FINALIZER(Class, preFinalizer) \
public: \
static bool InvokePreFinalizer(void* object) { \
Class* self = reinterpret_cast<Class*>(object); \
if (ThreadHeap::IsHeapObjectAlive(self)) \
return false; \
self->Class::preFinalizer(); \
return true; \
} \
\
private: \
ThreadState::PrefinalizerRegistration<Class> prefinalizer_dummy_{this}; \
#define USING_PRE_FINALIZER(Class, PreFinalizer) \
public: \
static bool InvokePreFinalizer(const LivenessBroker& info, void* object) { \
Class* self = reinterpret_cast<Class*>(object); \
if (info.IsHeapObjectAlive(self)) \
return false; \
self->Class::PreFinalizer(); \
return true; \
} \
\
private: \
ThreadState::PrefinalizerRegistration<Class> prefinalizer_dummy_{this}; \
using UsingPreFinalizerMacroNeedsTrailingSemiColon = char
class PLATFORM_EXPORT BlinkGCObserver {
......@@ -139,7 +139,7 @@ class PLATFORM_EXPORT ThreadState final {
DISALLOW_NEW();
public:
PrefinalizerRegistration(T* self) {
PrefinalizerRegistration(T* self) { // NOLINT
static_assert(sizeof(&T::InvokePreFinalizer) > 0,
"USING_PRE_FINALIZER(T) must be defined.");
ThreadState* state =
......@@ -590,7 +590,7 @@ class PLATFORM_EXPORT ThreadState final {
BlinkGC::GCReason reason_for_scheduled_gc_ =
BlinkGC::GCReason::kForcedGCForTesting;
using PreFinalizerCallback = bool (*)(void*);
using PreFinalizerCallback = bool (*)(const LivenessBroker&, void*);
using PreFinalizer = std::pair<void*, PreFinalizerCallback>;
// Pre-finalizers are called in the reverse order in which they are
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment