diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/v8/src/execution/off-thread-isolate.cc | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/v8/src/execution/off-thread-isolate.cc')
-rw-r--r-- | chromium/v8/src/execution/off-thread-isolate.cc | 107 |
1 files changed, 2 insertions, 105 deletions
diff --git a/chromium/v8/src/execution/off-thread-isolate.cc b/chromium/v8/src/execution/off-thread-isolate.cc index 3a4c39052f2..08675493723 100644 --- a/chromium/v8/src/execution/off-thread-isolate.cc +++ b/chromium/v8/src/execution/off-thread-isolate.cc @@ -7,88 +7,12 @@ #include "src/execution/isolate.h" #include "src/execution/thread-id.h" #include "src/handles/handles-inl.h" +#include "src/handles/off-thread-transfer-handle-storage-inl.h" #include "src/logging/off-thread-logger.h" namespace v8 { namespace internal { -class OffThreadTransferHandleStorage { - public: - enum State { kOffThreadHandle, kRawObject, kHandle }; - - explicit OffThreadTransferHandleStorage( - Address* off_thread_handle_location, - std::unique_ptr<OffThreadTransferHandleStorage> next) - : handle_location_(off_thread_handle_location), - next_(std::move(next)), - state_(kOffThreadHandle) { - CheckValid(); - } - - void ConvertFromOffThreadHandleOnFinish() { - CheckValid(); - DCHECK_EQ(state_, kOffThreadHandle); - raw_obj_ptr_ = *handle_location_; - state_ = kRawObject; - CheckValid(); - } - - void ConvertToHandleOnPublish(Isolate* isolate) { - CheckValid(); - DCHECK_EQ(state_, kRawObject); - handle_location_ = handle(Object(raw_obj_ptr_), isolate).location(); - state_ = kHandle; - CheckValid(); - } - - Address* handle_location() const { - DCHECK_EQ(state_, kHandle); - DCHECK( - Object(*handle_location_).IsSmi() || - !Heap::InOffThreadSpace(HeapObject::cast(Object(*handle_location_)))); - return handle_location_; - } - - OffThreadTransferHandleStorage* next() { return next_.get(); } - - State state() const { return state_; } - - private: - void CheckValid() { -#ifdef DEBUG - Object obj; - - switch (state_) { - case kHandle: - case kOffThreadHandle: - DCHECK_NOT_NULL(handle_location_); - obj = Object(*handle_location_); - break; - case kRawObject: - obj = Object(raw_obj_ptr_); - break; - } - - // Smis are always fine. - if (obj.IsSmi()) return; - - // The object that is not yet in a main-thread handle should be in - // off-thread space. Main-thread handles can still point to off-thread space - // during Publish, so that invariant is taken care of on main-thread handle - // access. - DCHECK_IMPLIES(state_ != kHandle, - Heap::InOffThreadSpace(HeapObject::cast(obj))); -#endif - } - - union { - Address* handle_location_; - Address raw_obj_ptr_; - }; - std::unique_ptr<OffThreadTransferHandleStorage> next_; - State state_; -}; - Address* OffThreadTransferHandleBase::ToHandleLocation() const { return storage_ == nullptr ? nullptr : storage_->handle_location(); } @@ -98,32 +22,16 @@ OffThreadIsolate::OffThreadIsolate(Isolate* isolate, Zone* zone) heap_(isolate->heap()), isolate_(isolate), logger_(new OffThreadLogger()), - handle_zone_(zone), - off_thread_transfer_handles_head_(nullptr) {} + handle_zone_(zone) {} OffThreadIsolate::~OffThreadIsolate() = default; void OffThreadIsolate::FinishOffThread() { heap()->FinishOffThread(); - - OffThreadTransferHandleStorage* storage = - off_thread_transfer_handles_head_.get(); - while (storage != nullptr) { - storage->ConvertFromOffThreadHandleOnFinish(); - storage = storage->next(); - } - handle_zone_ = nullptr; } void OffThreadIsolate::Publish(Isolate* isolate) { - OffThreadTransferHandleStorage* storage = - off_thread_transfer_handles_head_.get(); - while (storage != nullptr) { - storage->ConvertToHandleOnPublish(isolate); - storage = storage->next(); - } - heap()->Publish(isolate->heap()); } @@ -145,16 +53,5 @@ void OffThreadIsolate::PinToCurrentThread() { thread_id_ = ThreadId::Current(); } -OffThreadTransferHandleStorage* OffThreadIsolate::AddTransferHandleStorage( - HandleBase handle) { - DCHECK_IMPLIES(off_thread_transfer_handles_head_ != nullptr, - off_thread_transfer_handles_head_->state() == - OffThreadTransferHandleStorage::kOffThreadHandle); - off_thread_transfer_handles_head_ = - std::make_unique<OffThreadTransferHandleStorage>( - handle.location(), std::move(off_thread_transfer_handles_head_)); - return off_thread_transfer_handles_head_.get(); -} - } // namespace internal } // namespace v8 |