Index: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
index 01136649524082b8b79b83dda662a2a4852c957e..c0830271c4e9e1402f7ae7e7925f56d1bfda80c7 100644 |
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
@@ -5,6 +5,7 @@ |
#include "core/html/canvas/CanvasAsyncBlobCreator.h" |
#include "core/fileapi/Blob.h" |
+#include "platform/Histogram.h" |
#include "platform/ThreadSafeFunctional.h" |
#include "platform/graphics/ImageBuffer.h" |
#include "platform/image-encoders/JPEGImageEncoder.h" |
@@ -94,6 +95,7 @@ CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(DOMUint8ClampedArray* data, MimeT |
m_pixelRowStride = size.width() * NumChannelsPng; |
m_idleTaskStatus = IdleTaskNotSupported; |
m_numRowsCompleted = 0; |
+ m_startTime = WTF::monotonicallyIncreasingTime(); |
xlai (Olivia)
2016/06/07 16:08:14
To measure the total elapsed time of toBlob API ca
xidachen
2016/06/07 20:46:29
Yes, that makes total sense. I place the start aft
|
} |
CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() |
@@ -118,7 +120,8 @@ void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodSche |
} |
// We post the below task to check if the above idle task isn't late. |
// There's no risk of concurrency as both tasks are on main thread. |
- this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, this, quality), IdleTaskStartTimeoutDelay); |
+ double startTime = WTF::monotonicallyIncreasingTime(); |
+ this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, this, quality, startTime), IdleTaskStartTimeoutDelay); |
} else if (m_mimeType == MimeTypeWebp) { |
BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.width() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTask : BackgroundTaskRunner::TaskSizeShortRunningTask; |
BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, wrapCrossThreadPersistent(this), quality), taskSize); |
@@ -260,6 +263,20 @@ void CanvasAsyncBlobCreator::createBlobAndInvokeCallback() |
// non-GC members to allow teardown of CanvasAsyncBlobCreator. |
m_data.clear(); |
m_callback.clear(); |
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime; |
+ if (m_mimeType == MimeTypePng) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.PNG.Succeed", 0, 10000000, 50)); |
+ toBlobPNGCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeJpeg) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.JPEG.Succeed", 0, 10000000, 50)); |
+ toBlobJPEGCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeWebp) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.WEBP.Succeed", 0, 10000000, 50)); |
+ toBlobWEBPCounter.count(elapsedTime * 1000000.0); |
+ } else { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobUnknownCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.Unknown.Succeed", 0, 10000000, 50)); |
xlai (Olivia)
2016/06/07 16:08:14
"Unknown" type is impossible to reach here. See "A
xidachen
2016/06/07 20:46:28
Done.
|
+ toBlobUnknownCounter.count(elapsedTime * 1000000.0); |
+ } |
} |
void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
@@ -270,6 +287,20 @@ void CanvasAsyncBlobCreator::createNullAndInvokeCallback() |
// clear non-GC members to allow teardown of CanvasAsyncBlobCreator. |
m_data.clear(); |
m_callback.clear(); |
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - m_startTime; |
+ if (m_mimeType == MimeTypePng) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.PNG.Failed", 0, 10000000, 50)); |
xlai (Olivia)
2016/06/07 16:08:14
I sincerely feels that such a detailed histogram f
xidachen
2016/06/07 20:46:28
Done.
|
+ toBlobPNGCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeJpeg) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.JPEG.Failed", 0, 10000000, 50)); |
+ toBlobJPEGCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeWebp) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.WEBP.Failed", 0, 10000000, 50)); |
+ toBlobWEBPCounter.count(elapsedTime * 1000000.0); |
+ } else { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobUnknownCounter, new CustomCountHistogram("Blink.Canvas.ToBlob.Unknown.Failed", 0, 10000000, 50)); |
+ toBlobUnknownCounter.count(elapsedTime * 1000000.0); |
+ } |
} |
void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) |
@@ -305,11 +336,45 @@ bool CanvasAsyncBlobCreator::initializeJpegStruct(double quality) |
return true; |
} |
-void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality) |
+void CanvasAsyncBlobCreator::recordTimeoutEvent(IdleTaskTimeoutType type) |
{ |
+ if (m_mimeType == MimeTypePng) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskTimeoutEventPNG, new EnumerationHistogram("Canvas.ToBlob.IdleTaskTimeout.PNG", IdleTaskTimeoutSupported)); |
xlai (Olivia)
2016/06/07 16:08:14
What is the purpose of this histogram?
xidachen
2016/06/07 20:46:29
Change this to record the occurrence of switch fro
|
+ idleTaskTimeoutEventPNG.count(type); |
+ } else if (m_mimeType == MimeTypeJpeg) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskTimeoutEventJPEG, new EnumerationHistogram("Canvas.ToBlob.IdleTaskTimeout.JPEG", IdleTaskTimeoutSupported)); |
+ idleTaskTimeoutEventJPEG.count(type); |
+ } else if (m_mimeType == MimeTypeWebp) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskTimeoutEventWEBP, new EnumerationHistogram("Canvas.ToBlob.IdleTaskTimeout.WEBP", IdleTaskTimeoutSupported)); |
+ idleTaskTimeoutEventWEBP.count(type); |
+ } else { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, idleTaskTimeoutEventUnknown, new EnumerationHistogram("Canvas.ToBlob.IdleTaskTimeout.Unknown", IdleTaskTimeoutSupported)); |
+ idleTaskTimeoutEventUnknown.count(type); |
+ } |
+} |
+ |
+void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality, double startTime) |
+{ |
+ recordTimeoutEvent(IdleTaskStartTimeout); |
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - startTime; |
+ if (m_mimeType == MimeTypePng) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.PNG.Start", 0, 10000000, 50)); |
+ toBlobPNGStartTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeJpeg) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.JPEG.Start", 0, 10000000, 50)); |
+ toBlobJPEGStartTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeWebp) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.WEBP.Start", 0, 10000000, 50)); |
+ toBlobWEBPStartTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } else { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobUnknownStartTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.Unknown.Start", 0, 10000000, 50)); |
xlai (Olivia)
2016/06/07 16:08:14
Same comment for "unknown".
xidachen
2016/06/07 20:46:28
Done.
|
+ toBlobUnknownStartTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } |
+ |
if (m_idleTaskStatus == IdleTaskStarted) { |
// Even if the task started quickly, we still want to ensure completion |
- this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent, this), IdleTaskCompleteTimeoutDelay); |
+ startTime = WTF::monotonicallyIncreasingTime(); |
+ this->postDelayedTaskToMainThread(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent, this, startTime), IdleTaskCompleteTimeoutDelay); |
} else if (m_idleTaskStatus == IdleTaskNotStarted) { |
// If the idle task does not start after a delay threshold, we will |
// force it to happen on main thread (even though it may cause more |
@@ -340,9 +405,24 @@ void CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent(double quality) |
} |
-void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent() |
+void CanvasAsyncBlobCreator::idleTaskCompleteTimeoutEvent(double startTime) |
{ |
ASSERT(m_idleTaskStatus != IdleTaskNotStarted); |
+ recordTimeoutEvent(IdleTaskCompleteTimeout); |
+ double elapsedTime = WTF::monotonicallyIncreasingTime() - startTime; |
+ if (m_mimeType == MimeTypePng) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobPNGCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.PNG.Complete", 0, 10000000, 50)); |
+ toBlobPNGCompleteTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeJpeg) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobJPEGCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.JPEG.Complete", 0, 10000000, 50)); |
+ toBlobJPEGCompleteTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } else if (m_mimeType == MimeTypeWebp) { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobWEBPCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.WEBP.Complete", 0, 10000000, 50)); |
+ toBlobWEBPCompleteTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } else { |
+ DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, toBlobUnknownCompleteTimeoutCounter, new CustomCountHistogram("Blink.Canvas.ToBlobTimeoutDuration.Unknown.Complete", 0, 10000000, 50)); |
+ toBlobUnknownCompleteTimeoutCounter.count(elapsedTime * 1000000.0); |
+ } |
if (m_idleTaskStatus == IdleTaskStarted) { |
// It has taken too long to complete for the idle task. |