|  | // Copyright 2020 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "src/heap/cppgc/prefinalizer-handler.h" | 
|  |  | 
|  | #include <algorithm> | 
|  | #include <memory> | 
|  |  | 
|  | #include "src/base/platform/platform.h" | 
|  | #include "src/heap/cppgc/heap-page.h" | 
|  | #include "src/heap/cppgc/heap.h" | 
|  | #include "src/heap/cppgc/liveness-broker.h" | 
|  |  | 
|  | namespace cppgc { | 
|  | namespace internal { | 
|  |  | 
|  | // static | 
|  | void PreFinalizerRegistrationDispatcher::RegisterPrefinalizer( | 
|  | PreFinalizer pre_finalizer) { | 
|  | BasePage::FromPayload(pre_finalizer.object) | 
|  | ->heap() | 
|  | ->prefinalizer_handler() | 
|  | ->RegisterPrefinalizer(pre_finalizer); | 
|  | } | 
|  |  | 
|  | bool PreFinalizerRegistrationDispatcher::PreFinalizer::operator==( | 
|  | const PreFinalizer& other) const { | 
|  | return (object == other.object) && (callback == other.callback); | 
|  | } | 
|  |  | 
|  | PreFinalizerHandler::PreFinalizerHandler() | 
|  | #ifdef DEBUG | 
|  | : creation_thread_id_(v8::base::OS::GetCurrentThreadId()) | 
|  | #endif | 
|  | { | 
|  | } | 
|  |  | 
|  | void PreFinalizerHandler::RegisterPrefinalizer(PreFinalizer pre_finalizer) { | 
|  | DCHECK(CurrentThreadIsCreationThread()); | 
|  | DCHECK_EQ(ordered_pre_finalizers_.end(), | 
|  | std::find(ordered_pre_finalizers_.begin(), | 
|  | ordered_pre_finalizers_.end(), pre_finalizer)); | 
|  | ordered_pre_finalizers_.push_back(pre_finalizer); | 
|  | } | 
|  |  | 
|  | void PreFinalizerHandler::InvokePreFinalizers() { | 
|  | DCHECK(CurrentThreadIsCreationThread()); | 
|  | LivenessBroker liveness_broker = LivenessBrokerFactory::Create(); | 
|  | ordered_pre_finalizers_.erase( | 
|  | ordered_pre_finalizers_.begin(), | 
|  | std::remove_if(ordered_pre_finalizers_.rbegin(), | 
|  | ordered_pre_finalizers_.rend(), | 
|  | [liveness_broker](const PreFinalizer& pf) { | 
|  | return (pf.callback)(liveness_broker, pf.object); | 
|  | }) | 
|  | .base()); | 
|  | ordered_pre_finalizers_.shrink_to_fit(); | 
|  | } | 
|  |  | 
|  | bool PreFinalizerHandler::CurrentThreadIsCreationThread() { | 
|  | #ifdef DEBUG | 
|  | return creation_thread_id_ == v8::base::OS::GetCurrentThreadId(); | 
|  | #else | 
|  | return true; | 
|  | #endif | 
|  | } | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace cppgc |