Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(779)

Unified Diff: content/browser/devtools/devtools_frame_trace_recorder.cc

Issue 1188773005: DevTools: fix concurrency problems in DevToolsFrameTraceRecorder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review comments addressed Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/devtools/devtools_frame_trace_recorder.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/devtools/devtools_frame_trace_recorder.cc
diff --git a/content/browser/devtools/devtools_frame_trace_recorder.cc b/content/browser/devtools/devtools_frame_trace_recorder.cc
index 3821b85b1d26cde1e60948701f7e619e7565601b..67d6567c4adb0310ff4fcdf29a8f5c497d6beb5c 100644
--- a/content/browser/devtools/devtools_frame_trace_recorder.cc
+++ b/content/browser/devtools/devtools_frame_trace_recorder.cc
@@ -29,29 +29,63 @@ static base::subtle::Atomic32 frame_data_count = 0;
static int kMaximumFrameDataCount = 150;
static size_t kFrameAreaLimit = 256000;
-} // namespace
-
-class DevToolsFrameTraceRecorderData
+class TraceableDevToolsScreenshot
: public base::trace_event::ConvertableToTraceFormat {
public:
- DevToolsFrameTraceRecorderData(const cc::CompositorFrameMetadata& metadata)
- : metadata_(metadata),
- weak_factory_(this) {
+ TraceableDevToolsScreenshot(const SkBitmap& bitmap) : frame_(bitmap) {}
+
+ void AppendAsTraceFormat(std::string* out) const override {
+ out->append("\"");
+ if (!frame_.drawsNothing()) {
+ std::vector<unsigned char> data;
+ SkAutoLockPixels lock_image(frame_);
+ bool encoded = gfx::PNGCodec::Encode(
+ reinterpret_cast<unsigned char*>(frame_.getAddr32(0, 0)),
+ gfx::PNGCodec::FORMAT_SkBitmap,
+ gfx::Size(frame_.width(), frame_.height()),
+ frame_.width() * frame_.bytesPerPixel(), false,
+ std::vector<gfx::PNGCodec::Comment>(), &data);
+ if (encoded) {
+ std::string encoded_data;
+ base::Base64Encode(
+ base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()),
+ &encoded_data);
+ out->append(encoded_data);
+ }
+ }
+ out->append("\"");
}
- base::WeakPtr<DevToolsFrameTraceRecorderData> GetWeakPtr() {
- return weak_factory_.GetWeakPtr();
+ private:
+ ~TraceableDevToolsScreenshot() override {
+ base::subtle::NoBarrier_AtomicIncrement(&frame_data_count, -1);
}
+ SkBitmap frame_;
+};
+
+} // namespace
+
+class DevToolsFrameTraceRecorderData
+ : public base::RefCounted<DevToolsFrameTraceRecorderData> {
+ public:
+ DevToolsFrameTraceRecorderData(const cc::CompositorFrameMetadata& metadata)
+ : metadata_(metadata), timestamp_(base::TraceTicks::Now()) {}
+
void FrameCaptured(const SkBitmap& bitmap, ReadbackResponse response) {
if (response != READBACK_SUCCESS)
return;
int current_frame_count = base::subtle::NoBarrier_Load(&frame_data_count);
if (current_frame_count >= kMaximumFrameDataCount)
return;
- frame_ = bitmap;
- if (!frame_.drawsNothing())
- base::subtle::NoBarrier_AtomicIncrement(&frame_data_count, 1);
+ if (bitmap.drawsNothing())
+ return;
+ base::subtle::NoBarrier_AtomicIncrement(&frame_data_count, 1);
+ TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID_AND_TIMESTAMP(
+ TRACE_DISABLED_BY_DEFAULT("devtools.screenshot"), "Screenshot", 1,
+ timestamp_.ToInternalValue(),
+ scoped_refptr<base::trace_event::ConvertableToTraceFormat>(
+ new TraceableDevToolsScreenshot(bitmap)));
}
void CaptureFrame(RenderFrameHostImpl* host) {
@@ -68,44 +102,18 @@ class DevToolsFrameTraceRecorderData
scale = sqrt(kFrameAreaLimit / area);
gfx::Size snapshot_size(gfx::ToRoundedSize(gfx::ScaleSize(
metadata_.scrollable_viewport_size, scale)));
- view->CopyFromCompositingSurface(gfx::Rect(), snapshot_size,
- base::Bind(
- &DevToolsFrameTraceRecorderData::FrameCaptured,
- GetWeakPtr()),
+ view->CopyFromCompositingSurface(
+ gfx::Rect(), snapshot_size,
+ base::Bind(&DevToolsFrameTraceRecorderData::FrameCaptured, this),
kN32_SkColorType);
}
- void AppendAsTraceFormat(std::string* out) const override {
- out->append("\"");
- if (!frame_.drawsNothing()) {
- std::vector<unsigned char> data;
- SkAutoLockPixels lock_image(frame_);
- bool encoded = gfx::PNGCodec::Encode(
- reinterpret_cast<unsigned char*>(frame_.getAddr32(0, 0)),
- gfx::PNGCodec::FORMAT_SkBitmap,
- gfx::Size(frame_.width(), frame_.height()),
- frame_.width() * frame_.bytesPerPixel(),
- false, std::vector<gfx::PNGCodec::Comment>(), &data);
- if (encoded) {
- std::string encoded_data;
- base::Base64Encode(
- base::StringPiece(reinterpret_cast<char*>(&data[0]), data.size()),
- &encoded_data);
- out->append(encoded_data);
- }
- }
- out->append("\"");
- }
-
private:
- ~DevToolsFrameTraceRecorderData() override {
- if (!frame_.drawsNothing())
- base::subtle::NoBarrier_AtomicIncrement(&frame_data_count, -1);
- }
+ friend class base::RefCounted<DevToolsFrameTraceRecorderData>;
+ ~DevToolsFrameTraceRecorderData() {}
cc::CompositorFrameMetadata metadata_;
- SkBitmap frame_;
- base::WeakPtrFactory<DevToolsFrameTraceRecorderData> weak_factory_;
+ base::TraceTicks timestamp_;
DISALLOW_COPY_AND_ASSIGN(DevToolsFrameTraceRecorderData);
};
@@ -118,26 +126,18 @@ void DevToolsFrameTraceRecorder::OnSwapCompositorFrame(
RenderFrameHostImpl* host,
const cc::CompositorFrameMetadata& frame_metadata) {
if (!host)
- return;
+ return;
bool enabled;
TRACE_EVENT_CATEGORY_GROUP_ENABLED(
TRACE_DISABLED_BY_DEFAULT("devtools.screenshot"), &enabled);
- if (!enabled)
+ if (!enabled) {
+ pending_frame_data_ = nullptr;
return;
-
- if (last_event_data_.get())
- last_event_data_->CaptureFrame(host);
-
- scoped_refptr<DevToolsFrameTraceRecorderData> data(
- new DevToolsFrameTraceRecorderData(frame_metadata));
- last_event_data_ = data->GetWeakPtr();
- TRACE_EVENT_INSTANT1(
- TRACE_DISABLED_BY_DEFAULT("devtools.screenshot"),
- "CaptureFrame",
- TRACE_EVENT_SCOPE_THREAD,
- "data",
- scoped_refptr<base::trace_event::ConvertableToTraceFormat>(data));
+ }
+ if (pending_frame_data_.get())
+ pending_frame_data_->CaptureFrame(host);
+ pending_frame_data_ = new DevToolsFrameTraceRecorderData(frame_metadata);
}
} // namespace content
« no previous file with comments | « content/browser/devtools/devtools_frame_trace_recorder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698