From 9872cf066d9c6f6bc7f1e4f5a49c4cb76ce2ff9c Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 9 Nov 2020 14:36:22 +0900 Subject: [PATCH] common taskScheduler: thread sync optmization replaced future/promise with mutex since they use a lot of memory allocation number. plus, binary size is reduced from 2094896 -> 1746864 --- src/lib/sw_engine/tvgSwRenderer.cpp | 10 +++--- src/lib/tvgTaskScheduler.cpp | 13 ++++++-- src/lib/tvgTaskScheduler.h | 49 ++++++++++++++++------------- src/loaders/svg/tvgSvgLoader.cpp | 4 +-- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/lib/sw_engine/tvgSwRenderer.cpp b/src/lib/sw_engine/tvgSwRenderer.cpp index cd4c1ddf..83fcada1 100644 --- a/src/lib/sw_engine/tvgSwRenderer.cpp +++ b/src/lib/sw_engine/tvgSwRenderer.cpp @@ -139,7 +139,7 @@ SwRenderer::~SwRenderer() bool SwRenderer::clear() { - for (auto task : tasks) task->get(); + for (auto task : tasks) task->done(); tasks.clear(); return true; @@ -181,7 +181,7 @@ bool SwRenderer::postRender() bool SwRenderer::render(const Shape& shape, void *data) { auto task = static_cast(data); - task->get(); + task->done(); uint8_t r, g, b, a; if (auto fill = task->sdata->fill()) { @@ -205,7 +205,7 @@ bool SwRenderer::dispose(TVG_UNUSED const Shape& sdata, void *data) auto task = static_cast(data); if (!task) return true; - task->get(); + task->done(); shapeFree(&task->shape); if (task->transform) free(task->transform); delete(task); @@ -226,13 +226,13 @@ void* SwRenderer::prepare(const Shape& sdata, void* data, const RenderTransform* if (flags == RenderUpdateFlag::None) return task; //Finish previous task if it has duplicated request. - if (task->valid()) task->get(); + task->done(); task->sdata = &sdata; if (compList.size() > 0) { //Guarantee composition targets get ready. - for (auto comp : compList) static_cast(comp.edata)->get(); + for (auto comp : compList) static_cast(comp.edata)->done(); task->compList.assign(compList.begin(), compList.end()); } diff --git a/src/lib/tvgTaskScheduler.cpp b/src/lib/tvgTaskScheduler.cpp index 2ad4ca60..f1a4f866 100644 --- a/src/lib/tvgTaskScheduler.cpp +++ b/src/lib/tvgTaskScheduler.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include "tvgTaskScheduler.h" /************************************************************************/ @@ -179,7 +181,12 @@ void TaskScheduler::term() void TaskScheduler::request(Task* task) { - if (inst) { - inst->request(task); - } + if (inst) inst->request(task); } + + +unsigned TaskScheduler::threads() +{ + if (inst) return inst->threadCnt; + return 0; +} \ No newline at end of file diff --git a/src/lib/tvgTaskScheduler.h b/src/lib/tvgTaskScheduler.h index 1db434a9..550cd804 100644 --- a/src/lib/tvgTaskScheduler.h +++ b/src/lib/tvgTaskScheduler.h @@ -22,31 +22,40 @@ #ifndef _TVG_TASK_SCHEDULER_H_ #define _TVG_TASK_SCHEDULER_H_ -#include +#include #include "tvgCommon.h" namespace tvg { +struct Task; + +struct TaskScheduler +{ + static unsigned threads(); + static void init(unsigned threads); + static void term(); + static void request(Task* task); +}; + struct Task { private: - promise sender; - future receiver; + mutex mtx; + bool working = false; public: virtual ~Task() = default; - void get() + void done() { - if (receiver.valid()) { - receiver.get(); - } - } + if (!working) return; - bool valid() - { - return receiver.valid(); + if (TaskScheduler::threads() > 0) { + mtx.lock(); + working = false; + mtx.unlock(); + } } protected: @@ -56,25 +65,23 @@ private: void operator()(unsigned tid) { run(tid); - sender.set_value(); + + if (TaskScheduler::threads() > 0) mtx.unlock(); } void prepare() { - sender = promise(); - receiver = sender.get_future(); + if (TaskScheduler::threads() > 0) { + working = true; + mtx.lock(); + } } friend class TaskSchedulerImpl; }; -struct TaskScheduler -{ - static void init(unsigned threads); - static void term(); - static void request(Task* task); -}; + } -#endif //_TVG_TASK_SCHEDULER_H_ \ No newline at end of file +#endif //_TVG_TASK_SCHEDULER_H_ diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 9aeca5c4..23fe67a2 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -2518,7 +2518,7 @@ bool SvgLoader::read() bool SvgLoader::close() { - this->get(); + this->done(); if (loaderData.svgParse) { free(loaderData.svgParse); @@ -2541,7 +2541,7 @@ bool SvgLoader::close() unique_ptr SvgLoader::data() { - this->get(); + this->done(); if (root) return move(root); else return nullptr; }