forked from qt-creator/qt-creator
QmlDesigner: Use flows
Change-Id: I46f4f4eeccfb61fbc24bbe774cc04a62c0c4bce5 Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io> Reviewed-by: Tim Jenssen <tim.jenssen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
@@ -56,9 +56,15 @@ void AsynchronousImageCache::request(Utils::SmallStringView name,
|
||||
const auto id = extraId.empty() ? Utils::PathString{name}
|
||||
: Utils::PathString::join({name, "+", extraId});
|
||||
|
||||
auto [durationToken, flowToken] = traceToken.beginDurationWithFlow(
|
||||
"AsynchronousImageCache works on the image request"_t);
|
||||
|
||||
auto timeStrampToken = durationToken.beginDuration("getting timestamp"_t);
|
||||
const auto timeStamp = timeStampProvider.timeStamp(name);
|
||||
timeStrampToken.end();
|
||||
|
||||
auto storageTraceToken = durationToken.beginDuration("fetching image from storage"_t);
|
||||
auto requestImageFromStorage = [&](RequestType requestType) {
|
||||
auto storageTraceToken = traceToken.begin("fetching image from storage"_t);
|
||||
switch (requestType) {
|
||||
case RequestType::Image:
|
||||
return storage.fetchImage(id, timeStamp);
|
||||
@@ -74,6 +80,7 @@ void AsynchronousImageCache::request(Utils::SmallStringView name,
|
||||
};
|
||||
|
||||
const auto entry = requestImageFromStorage(requestType);
|
||||
storageTraceToken.end();
|
||||
|
||||
if (entry) {
|
||||
if (entry->isNull()) {
|
||||
@@ -82,7 +89,6 @@ void AsynchronousImageCache::request(Utils::SmallStringView name,
|
||||
} else {
|
||||
captureCallback(*entry);
|
||||
}
|
||||
traceToken.end();
|
||||
} else {
|
||||
auto imageGeneratedCallback =
|
||||
[captureCallback = std::move(captureCallback),
|
||||
@@ -90,6 +96,7 @@ void AsynchronousImageCache::request(Utils::SmallStringView name,
|
||||
const QImage &midSizeImage,
|
||||
const QImage &smallImage,
|
||||
ImageCache::TraceToken traceToken) {
|
||||
auto token = traceToken.beginDuration("call capture callback"_t);
|
||||
auto selectImage = [](RequestType requestType,
|
||||
const QImage &image,
|
||||
const QImage &midSizeImage,
|
||||
@@ -107,7 +114,6 @@ void AsynchronousImageCache::request(Utils::SmallStringView name,
|
||||
|
||||
return image;
|
||||
};
|
||||
traceToken.end();
|
||||
captureCallback(selectImage(requestType, image, midSizeImage, smallImage));
|
||||
};
|
||||
|
||||
@@ -115,7 +121,6 @@ void AsynchronousImageCache::request(Utils::SmallStringView name,
|
||||
[abortCallback = std::move(abortCallback)](ImageCache::AbortReason reason,
|
||||
ImageCache::TraceToken traceToken) {
|
||||
traceToken.tick("image could not be created"_t);
|
||||
traceToken.end();
|
||||
abortCallback(reason);
|
||||
};
|
||||
|
||||
@@ -137,16 +142,16 @@ void AsynchronousImageCache::requestImage(Utils::SmallStringView name,
|
||||
Utils::SmallStringView extraId,
|
||||
ImageCache::AuxiliaryData auxiliaryData)
|
||||
{
|
||||
auto traceToken = ImageCache::category().beginAsynchronous(
|
||||
"request image in asynchornous image cache"_t);
|
||||
m_taskQueue.addTask(traceToken.createToken(),
|
||||
auto [trace, flowToken] = ImageCache::category().beginDurationWithFlow(
|
||||
"request image in asynchronous image cache"_t);
|
||||
m_taskQueue.addTask(trace.createToken(),
|
||||
std::move(name),
|
||||
std::move(extraId),
|
||||
std::move(captureCallback),
|
||||
std::move(abortCallback),
|
||||
std::move(auxiliaryData),
|
||||
RequestType::Image,
|
||||
std ::move(traceToken));
|
||||
std ::move(flowToken));
|
||||
}
|
||||
|
||||
void AsynchronousImageCache::requestMidSizeImage(Utils::SmallStringView name,
|
||||
@@ -155,8 +160,8 @@ void AsynchronousImageCache::requestMidSizeImage(Utils::SmallStringView name,
|
||||
Utils::SmallStringView extraId,
|
||||
ImageCache::AuxiliaryData auxiliaryData)
|
||||
{
|
||||
auto traceToken = ImageCache::category().beginAsynchronous(
|
||||
"request mid size image in asynchornous image cache"_t);
|
||||
auto [traceToken, flowToken] = ImageCache::category().beginDurationWithFlow(
|
||||
"request mid size image in asynchronous image cache"_t);
|
||||
m_taskQueue.addTask(traceToken.createToken(),
|
||||
std::move(name),
|
||||
std::move(extraId),
|
||||
@@ -164,7 +169,7 @@ void AsynchronousImageCache::requestMidSizeImage(Utils::SmallStringView name,
|
||||
std::move(abortCallback),
|
||||
std::move(auxiliaryData),
|
||||
RequestType::MidSizeImage,
|
||||
std ::move(traceToken));
|
||||
std ::move(flowToken));
|
||||
}
|
||||
|
||||
void AsynchronousImageCache::requestSmallImage(Utils::SmallStringView name,
|
||||
@@ -173,8 +178,8 @@ void AsynchronousImageCache::requestSmallImage(Utils::SmallStringView name,
|
||||
Utils::SmallStringView extraId,
|
||||
ImageCache::AuxiliaryData auxiliaryData)
|
||||
{
|
||||
auto traceToken = ImageCache::category().beginAsynchronous(
|
||||
"request small size image in asynchornous image cache"_t);
|
||||
auto [traceToken, flowtoken] = ImageCache::category().beginDurationWithFlow(
|
||||
"request small size image in asynchronous image cache"_t);
|
||||
m_taskQueue.addTask(traceToken.createToken(),
|
||||
std::move(name),
|
||||
std::move(extraId),
|
||||
@@ -182,7 +187,7 @@ void AsynchronousImageCache::requestSmallImage(Utils::SmallStringView name,
|
||||
std::move(abortCallback),
|
||||
std::move(auxiliaryData),
|
||||
RequestType::SmallImage,
|
||||
std ::move(traceToken));
|
||||
std ::move(flowtoken));
|
||||
}
|
||||
|
||||
void AsynchronousImageCache::clean()
|
||||
@@ -214,8 +219,6 @@ void AsynchronousImageCache::Clean::operator()(Entry &entry)
|
||||
entry.traceToken.tick("cleaning up in the cache"_t);
|
||||
|
||||
entry.abortCallback(ImageCache::AbortReason::Abort);
|
||||
|
||||
entry.traceToken.end();
|
||||
}
|
||||
|
||||
} // namespace QmlDesigner
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
|
||||
namespace QmlDesigner {
|
||||
|
||||
using namespace NanotraceHR::Literals;
|
||||
|
||||
AsynchronousImageFactory::AsynchronousImageFactory(ImageCacheStorageInterface &storage,
|
||||
TimeStampProviderInterface &timeStampProvider,
|
||||
ImageCacheCollectorInterface &collector)
|
||||
@@ -24,7 +26,13 @@ void AsynchronousImageFactory::generate(Utils::SmallStringView name,
|
||||
Utils::SmallStringView extraId,
|
||||
ImageCache::AuxiliaryData auxiliaryData)
|
||||
{
|
||||
m_taskQueue.addTask(name, extraId, std::move(auxiliaryData));
|
||||
auto [trace, flowToken] = ImageCache::category().beginDurationWithFlow(
|
||||
"request image in asynchronous image factory"_t);
|
||||
m_taskQueue.addTask(trace.createToken(),
|
||||
name,
|
||||
extraId,
|
||||
std::move(auxiliaryData),
|
||||
std::move(flowToken));
|
||||
}
|
||||
|
||||
AsynchronousImageFactory::~AsynchronousImageFactory() {}
|
||||
@@ -34,8 +42,10 @@ void AsynchronousImageFactory::request(Utils::SmallStringView name,
|
||||
ImageCache::AuxiliaryData auxiliaryData,
|
||||
ImageCacheStorageInterface &storage,
|
||||
TimeStampProviderInterface &timeStampProvider,
|
||||
ImageCacheCollectorInterface &collector)
|
||||
ImageCacheCollectorInterface &collector,
|
||||
ImageCache::TraceToken traceToken)
|
||||
{
|
||||
auto [storageTracer, flowToken] = traceToken.beginDurationWithFlow("starte image generator"_t);
|
||||
const auto id = extraId.empty() ? Utils::PathString{name}
|
||||
: Utils::PathString::join({name, "+", extraId});
|
||||
|
||||
@@ -58,11 +68,22 @@ void AsynchronousImageFactory::request(Utils::SmallStringView name,
|
||||
std::move(auxiliaryData),
|
||||
std::move(capture),
|
||||
ImageCache::InternalAbortCallback{},
|
||||
{});
|
||||
std::move(flowToken));
|
||||
}
|
||||
|
||||
void AsynchronousImageFactory::clean()
|
||||
{
|
||||
m_taskQueue.clean();
|
||||
}
|
||||
|
||||
void AsynchronousImageFactory::Dispatch::operator()(Entry &entry)
|
||||
{
|
||||
request(entry.name,
|
||||
entry.extraId,
|
||||
std::move(entry.auxiliaryData),
|
||||
storage,
|
||||
timeStampProvider,
|
||||
collector,
|
||||
std::move(entry.traceToken));
|
||||
}
|
||||
} // namespace QmlDesigner
|
||||
|
||||
@@ -39,17 +39,22 @@ private:
|
||||
struct Entry
|
||||
{
|
||||
Entry() = default;
|
||||
|
||||
Entry(Utils::PathString name,
|
||||
Utils::SmallString extraId,
|
||||
ImageCache::AuxiliaryData &&auxiliaryData)
|
||||
ImageCache::AuxiliaryData &&auxiliaryData,
|
||||
ImageCache::TraceToken traceToken)
|
||||
: name{std::move(name)}
|
||||
, extraId{std::move(extraId)}
|
||||
, auxiliaryData{std::move(auxiliaryData)}
|
||||
, traceToken{std::move(traceToken)}
|
||||
|
||||
{}
|
||||
|
||||
Utils::PathString name;
|
||||
Utils::SmallString extraId;
|
||||
ImageCache::AuxiliaryData auxiliaryData;
|
||||
NO_UNIQUE_ADDRESS ImageCache::TraceToken traceToken;
|
||||
};
|
||||
|
||||
static void request(Utils::SmallStringView name,
|
||||
@@ -57,19 +62,12 @@ private:
|
||||
ImageCache::AuxiliaryData auxiliaryData,
|
||||
ImageCacheStorageInterface &storage,
|
||||
TimeStampProviderInterface &timeStampProvider,
|
||||
ImageCacheCollectorInterface &collector);
|
||||
ImageCacheCollectorInterface &collector,
|
||||
ImageCache::TraceToken traceToken);
|
||||
|
||||
struct Dispatch
|
||||
{
|
||||
void operator()(Entry &entry)
|
||||
{
|
||||
request(entry.name,
|
||||
entry.extraId,
|
||||
std::move(entry.auxiliaryData),
|
||||
storage,
|
||||
timeStampProvider,
|
||||
collector);
|
||||
}
|
||||
void operator()(Entry &entry);
|
||||
|
||||
ImageCacheStorageInterface &storage;
|
||||
TimeStampProviderInterface &timeStampProvider;
|
||||
|
||||
@@ -77,7 +77,8 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
|
||||
ImageCache::TraceToken traceToken)
|
||||
{
|
||||
using namespace NanotraceHR::Literals;
|
||||
auto collectorTraceToken = traceToken.begin("generate image in standard collector"_t);
|
||||
auto [collectorTraceToken, flowtoken] = traceToken.beginDurationWithFlow(
|
||||
"generate image in standard collector"_t);
|
||||
|
||||
RewriterView rewriterView{m_externalDependencies, RewriterView::Amend};
|
||||
NodeInstanceView nodeInstanceView{m_connectionManager, m_externalDependencies};
|
||||
@@ -105,7 +106,7 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
|
||||
if (!rewriterView.errors().isEmpty() || (!rewriterView.rootModelNode().metaInfo().isGraphicalItem()
|
||||
&& !is3DRoot)) {
|
||||
if (abortCallback)
|
||||
abortCallback(ImageCache::AbortReason::Failed, std::move(traceToken));
|
||||
abortCallback(ImageCache::AbortReason::Failed, std::move(flowtoken));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -143,16 +144,16 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
|
||||
model->setRewriterView({});
|
||||
|
||||
if (isCrashed)
|
||||
abortCallback(ImageCache::AbortReason::Failed, std::move(traceToken));
|
||||
abortCallback(ImageCache::AbortReason::Failed, std::move(flowtoken));
|
||||
|
||||
if (!capturedDataArrived && abortCallback)
|
||||
abortCallback(ImageCache::AbortReason::Failed, std::move(traceToken));
|
||||
abortCallback(ImageCache::AbortReason::Failed, std::move(flowtoken));
|
||||
|
||||
if (nullImageHandling == ImageCacheCollectorNullImageHandling::CaptureNullImage
|
||||
|| !captureImage.isNull()) {
|
||||
QImage midSizeImage = scaleImage(captureImage, QSize{300, 300});
|
||||
QImage smallImage = scaleImage(midSizeImage, QSize{96, 96});
|
||||
captureCallback(captureImage, midSizeImage, smallImage, std::move(traceToken));
|
||||
captureCallback(captureImage, midSizeImage, smallImage, std::move(flowtoken));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -95,8 +95,6 @@ void ImageCacheGenerator::clean()
|
||||
|
||||
std::lock_guard lock{m_mutex};
|
||||
for (Task &task : m_tasks) {
|
||||
task.traceToken.tick("cleaning up in the generator"_t);
|
||||
task.traceToken.end();
|
||||
callCallbacks(task.abortCallbacks, ImageCache::AbortReason::Abort, std::move(task.traceToken));
|
||||
}
|
||||
m_tasks.clear();
|
||||
|
||||
@@ -107,18 +107,25 @@ private:
|
||||
|
||||
m_sleeping = false;
|
||||
|
||||
auto threadCreateToken = traceToken.beginDuration("thread is created in the task queue"_t);
|
||||
auto [threadCreateToken, flowToken] = traceToken.beginDurationWithFlow(
|
||||
"thread is created in the task queue"_t);
|
||||
m_backgroundThread = std::thread{[this](auto traceToken) {
|
||||
traceToken.tick("thread is ready"_t);
|
||||
auto duration = traceToken.beginDuration(
|
||||
"thread is ready"_t);
|
||||
while (true) {
|
||||
auto [lock, abort] = waitForTasks();
|
||||
duration.end();
|
||||
if (abort)
|
||||
return;
|
||||
if (auto task = getTask(std::move(lock)); task)
|
||||
auto getTaskToken = duration.beginDuration(
|
||||
"get task from queue"_t);
|
||||
if (auto task = getTask(std::move(lock)); task) {
|
||||
getTaskToken.end();
|
||||
m_dispatchCallback(*task);
|
||||
}
|
||||
}
|
||||
},
|
||||
std::move(traceToken)};
|
||||
std::move(flowToken)};
|
||||
}
|
||||
|
||||
void clearTasks(Tasks &tasks)
|
||||
|
||||
@@ -18,7 +18,7 @@ public:
|
||||
const ImageCache::AuxiliaryData &auxiliaryData,
|
||||
CaptureCallback captureCallback,
|
||||
AbortCallback abortCallback,
|
||||
ImageCache::TraceToken traceToken = {}) override;
|
||||
ImageCache::TraceToken traceToken) override;
|
||||
|
||||
ImageTuple createImage(Utils::SmallStringView filePath,
|
||||
Utils::SmallStringView state,
|
||||
|
||||
@@ -27,8 +27,10 @@ constexpr NanotraceHR::Tracing tracingStatus()
|
||||
}
|
||||
|
||||
using Category = NanotraceHR::StringViewCategory<tracingStatus()>;
|
||||
using TraceToken = Category::AsynchronousTokenType;
|
||||
Category &category();
|
||||
using TraceToken = Category::FlowTokenType;
|
||||
using FlowToken = Category::FlowTokenType;
|
||||
using Token = Category::TokenType;
|
||||
extern Category &category();
|
||||
|
||||
class FontCollectorSizeAuxiliaryData
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user