summaryrefslogtreecommitdiff
path: root/chromium/v8/src/execution/off-thread-isolate.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/v8/src/execution/off-thread-isolate.cc
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-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.cc107
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