Commit 867cd774 authored by Josh Karlin's avatar Josh Karlin Committed by Commit Bot

MakeAsyncTaskId non-copyable non-movable

What: Make AsyncTaskId non-copyable/non-movable

Why: The address of an AsyncTaskId is what's used to keep track of
them. So if they move after they've been registered then corruption
ensues.

How: This is a trivial change. I did have to make a small change to
XrFrameRequestCallbackCollection to prevent the AsyncTaskId from
being copied.

Bug: 1051938
Change-Id: Idf751369c831a9130462b4eb2aa83be121df1fc6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2053409Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Commit-Queue: Josh Karlin <jkarlin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#741412}
parent 284af1c4
...@@ -14,6 +14,13 @@ namespace probe { ...@@ -14,6 +14,13 @@ namespace probe {
// The core probes use this class as an identifier for an async task. // The core probes use this class as an identifier for an async task.
class CORE_EXPORT AsyncTaskId { class CORE_EXPORT AsyncTaskId {
public: public:
AsyncTaskId() = default;
// Not copyable or movable, since the address of an AsyncTaskId is what's used
// to keep track of them.
AsyncTaskId(const AsyncTaskId&) = delete;
AsyncTaskId& operator=(const AsyncTaskId&) = delete;
void SetAdTask() { ad_task_ = true; } void SetAdTask() { ad_task_ = true; }
bool IsAdTask() const { return ad_task_; } bool IsAdTask() const { return ad_task_; }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "third_party/blink/renderer/bindings/modules/v8/v8_xr_frame_request_callback.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_xr_frame_request_callback.h"
#include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
#include "third_party/blink/renderer/core/probe/async_task_id.h"
#include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/probe/core_probes.h"
#include "third_party/blink/renderer/modules/xr/xr_frame.h" #include "third_party/blink/renderer/modules/xr/xr_frame.h"
#include "third_party/blink/renderer/modules/xr/xr_session.h" #include "third_party/blink/renderer/modules/xr/xr_session.h"
...@@ -20,12 +21,13 @@ XRFrameRequestCallbackCollection::CallbackId ...@@ -20,12 +21,13 @@ XRFrameRequestCallbackCollection::CallbackId
XRFrameRequestCallbackCollection::RegisterCallback( XRFrameRequestCallbackCollection::RegisterCallback(
V8XRFrameRequestCallback* callback) { V8XRFrameRequestCallback* callback) {
CallbackId id = ++next_callback_id_; CallbackId id = ++next_callback_id_;
auto add_result = auto add_result = callbacks_.Set(
callbacks_.Set(id, CallbackAndAsyncTask(callback, probe::AsyncTaskId())); id,
CallbackAndAsyncTask(callback, std::make_unique<probe::AsyncTaskId>()));
pending_callbacks_.push_back(id); pending_callbacks_.push_back(id);
probe::AsyncTaskScheduledBreakable(context_, "XRRequestFrame", probe::AsyncTaskScheduledBreakable(
&add_result.stored_value->value.second); context_, "XRRequestFrame", add_result.stored_value->value.second.get());
return id; return id;
} }
...@@ -60,7 +62,7 @@ void XRFrameRequestCallbackCollection::ExecuteCallbacks(XRSession* session, ...@@ -60,7 +62,7 @@ void XRFrameRequestCallbackCollection::ExecuteCallbacks(XRSession* session,
if (it == current_callbacks_.end()) if (it == current_callbacks_.end())
continue; continue;
probe::AsyncTask async_task(context_, &it->value.second); probe::AsyncTask async_task(context_, it->value.second.get());
probe::UserCallback probe(context_, "XRRequestFrame", AtomicString(), true); probe::UserCallback probe(context_, "XRRequestFrame", AtomicString(), true);
it->value.first->InvokeAndReportException(session, timestamp, frame); it->value.first->InvokeAndReportException(session, timestamp, frame);
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_REQUEST_CALLBACK_COLLECTION_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_REQUEST_CALLBACK_COLLECTION_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_REQUEST_CALLBACK_COLLECTION_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_FRAME_REQUEST_CALLBACK_COLLECTION_H_
#include "third_party/blink/renderer/core/probe/async_task_id.h"
#include "third_party/blink/renderer/platform/bindings/name_client.h" #include "third_party/blink/renderer/platform/bindings/name_client.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
...@@ -16,6 +15,10 @@ class V8XRFrameRequestCallback; ...@@ -16,6 +15,10 @@ class V8XRFrameRequestCallback;
class XRFrame; class XRFrame;
class XRSession; class XRSession;
namespace probe {
class AsyncTaskId;
}
class XRFrameRequestCallbackCollection final class XRFrameRequestCallbackCollection final
: public GarbageCollected<XRFrameRequestCallbackCollection>, : public GarbageCollected<XRFrameRequestCallbackCollection>,
public NameClient { public NameClient {
...@@ -41,8 +44,8 @@ class XRFrameRequestCallbackCollection final ...@@ -41,8 +44,8 @@ class XRFrameRequestCallbackCollection final
!WTF::IsHashTraitsEmptyValue<Traits, CallbackId>(id); !WTF::IsHashTraitsEmptyValue<Traits, CallbackId>(id);
} }
using CallbackAndAsyncTask = using CallbackAndAsyncTask = std::pair<Member<V8XRFrameRequestCallback>,
std::pair<Member<V8XRFrameRequestCallback>, probe::AsyncTaskId>; std::unique_ptr<probe::AsyncTaskId>>;
using CallbackMap = HeapHashMap<CallbackId, CallbackAndAsyncTask>; using CallbackMap = HeapHashMap<CallbackId, CallbackAndAsyncTask>;
CallbackMap callbacks_; CallbackMap callbacks_;
......
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