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:
Marco Bubke
2023-10-18 13:14:58 +02:00
parent ecba81097c
commit 9026338ec3
8 changed files with 74 additions and 44 deletions
@@ -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
{