lottie/render: Construct on first use of thread pool instance by moving into a singleton instance() api.

Starting in C++11, scoped static initialization is now thread-safe

Change-Id: Ia6933b439407e9dd635be67328eb750acf5b0367
This commit is contained in:
sub.mohanty@samsung.com 2018-12-19 20:48:15 +09:00 committed by subhransu mohanty
parent d1c3b19e01
commit d00a8fe714
2 changed files with 16 additions and 8 deletions

View File

@ -120,7 +120,6 @@ class RenderTaskScheduler {
} }
} }
public:
RenderTaskScheduler() RenderTaskScheduler()
{ {
for (unsigned n = 0; n != _count; ++n) { for (unsigned n = 0; n != _count; ++n) {
@ -128,6 +127,13 @@ public:
} }
} }
public:
static RenderTaskScheduler& instance()
{
static RenderTaskScheduler singleton;
return singleton;
}
~RenderTaskScheduler() ~RenderTaskScheduler()
{ {
for (auto &e : _q) e.done(); for (auto &e : _q) e.done();
@ -159,7 +165,6 @@ public:
return async(std::move(task)); return async(std::move(task));
} }
}; };
static RenderTaskScheduler render_scheduler;
/** /**
* \breif Brief abput the Api. * \breif Brief abput the Api.
@ -236,7 +241,7 @@ Animation::renderTree(size_t frameNo, size_t width, size_t height) const
std::future<Surface> Animation::render(size_t frameNo, Surface surface) std::future<Surface> Animation::render(size_t frameNo, Surface surface)
{ {
return render_scheduler.render(d.get(), frameNo, std::move(surface)); return RenderTaskScheduler::instance().render(d.get(), frameNo, std::move(surface));
} }
void Animation::renderSync(size_t frameNo, Surface surface) void Animation::renderSync(size_t frameNo, Surface surface)

View File

@ -355,13 +355,18 @@ class RleTaskScheduler {
SW_FT_Stroker_Done(stroker); SW_FT_Stroker_Done(stroker);
} }
public:
RleTaskScheduler() RleTaskScheduler()
{ {
for (unsigned n = 0; n != _count; ++n) { for (unsigned n = 0; n != _count; ++n) {
_threads.emplace_back([&, n] { run(n); }); _threads.emplace_back([&, n] { run(n); });
} }
} }
public:
static RleTaskScheduler& instance()
{
static RleTaskScheduler singleton;
return singleton;
}
~RleTaskScheduler() ~RleTaskScheduler()
{ {
@ -412,8 +417,6 @@ public:
} }
}; };
static RleTaskScheduler raster_scheduler;
void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle, void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle,
FillRule fillRule, const VRect &clip) FillRule fillRule, const VRect &clip)
{ {
@ -421,7 +424,7 @@ void VRaster::generateFillInfo(RleShare &promise, VPath &&path, VRle &&rle,
promise->set_value(VRle()); promise->set_value(VRle());
return; return;
} }
return raster_scheduler.fillRle(promise, std::move(path), std::move(rle), fillRule, clip); return RleTaskScheduler::instance().fillRle(promise, std::move(path), std::move(rle), fillRule, clip);
} }
void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap, void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, CapStyle cap,
@ -432,7 +435,7 @@ void VRaster::generateStrokeInfo(RleShare &promise, VPath &&path, VRle &&rle, Ca
promise->set_value(VRle()); promise->set_value(VRle());
return; return;
} }
return raster_scheduler.strokeRle(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip); return RleTaskScheduler::instance().strokeRle(promise, std::move(path), std::move(rle), cap, join, width, meterLimit, clip);
} }
V_END_NAMESPACE V_END_NAMESPACE