Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuri Gorshenin <ygorshenin@chromium.org>2015-03-13 17:55:10 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:41:24 +0300
commit2b0f4125289657beaa71b80f5897052d36521104 (patch)
tree31a656501d5afcc9d296c878ebed88aa9b71ce1f /drape_frontend
parentf7203eb9b75a01270d63e74e8eccebdf531c5742 (diff)
[thread] Refactored lifetime management of multithreaded tasks.
Diffstat (limited to 'drape_frontend')
-rw-r--r--drape_frontend/backend_renderer.cpp28
-rw-r--r--drape_frontend/backend_renderer.hpp19
-rw-r--r--drape_frontend/frontend_renderer.cpp28
-rw-r--r--drape_frontend/frontend_renderer.hpp20
-rw-r--r--drape_frontend/message_acceptor.hpp3
5 files changed, 56 insertions, 42 deletions
diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp
index de19ea017c..d620e4c8fc 100644
--- a/drape_frontend/backend_renderer.cpp
+++ b/drape_frontend/backend_renderer.cpp
@@ -86,28 +86,16 @@ void BackendRenderer::AcceptMessage(dp::RefPointer<Message> message)
/////////////////////////////////////////
void BackendRenderer::StartThread()
{
- m_selfThread.Create(this);
+ m_selfThread.Create(make_unique<Routine>(*this));
}
void BackendRenderer::StopThread()
{
- IRoutine::Cancel();
+ m_selfThread.GetRoutine()->Cancel();
CloseQueue();
m_selfThread.Join();
}
-void BackendRenderer::ThreadMain()
-{
- m_contextFactory->getResourcesUploadContext()->makeCurrent();
-
- InitGLDependentResource();
-
- while (!IsCancelled())
- ProcessSingleMessage();
-
- ReleaseResources();
-}
-
void BackendRenderer::ReleaseResources()
{
m_readManager->Stop();
@@ -119,9 +107,17 @@ void BackendRenderer::ReleaseResources()
m_textures.Destroy();
}
-void BackendRenderer::Do()
+BackendRenderer::Routine::Routine(BackendRenderer & renderer) : m_renderer(renderer) {}
+
+void BackendRenderer::Routine::Do()
{
- ThreadMain();
+ m_renderer.m_contextFactory->getResourcesUploadContext()->makeCurrent();
+ m_renderer.InitGLDependentResource();
+
+ while (!IsCancelled())
+ m_renderer.ProcessSingleMessage();
+
+ m_renderer.ReleaseResources();
}
void BackendRenderer::InitGLDependentResource()
diff --git a/drape_frontend/backend_renderer.hpp b/drape_frontend/backend_renderer.hpp
index 4a85778498..562ee120b2 100644
--- a/drape_frontend/backend_renderer.hpp
+++ b/drape_frontend/backend_renderer.hpp
@@ -25,15 +25,14 @@ class ThreadsCommutator;
class BatchersPool;
class ReadManager;
-class BackendRenderer : public MessageAcceptor,
- public threads::IRoutine
+class BackendRenderer : public MessageAcceptor
{
public:
BackendRenderer(dp::RefPointer<ThreadsCommutator> commutator,
dp::RefPointer<dp::OGLContextFactory> oglcontextfactory,
MapDataProvider const & model);
- ~BackendRenderer();
+ ~BackendRenderer() override;
private:
MapDataProvider m_model;
@@ -51,11 +50,21 @@ private:
// ThreadPart //
/////////////////////////////////////////
private:
+ class Routine : public threads::IRoutine
+ {
+ public:
+ Routine(BackendRenderer & renderer);
+
+ // threads::IRoutine overrides:
+ void Do() override;
+
+ private:
+ BackendRenderer & m_renderer;
+ };
+
void StartThread();
void StopThread();
- void ThreadMain();
void ReleaseResources();
- virtual void Do();
void InitGLDependentResource();
void FlushGeometry(dp::TransferPointer<Message> message);
diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp
index aaadba48ef..fbbc1ba2d2 100644
--- a/drape_frontend/frontend_renderer.cpp
+++ b/drape_frontend/frontend_renderer.cpp
@@ -303,29 +303,32 @@ set<TileKey> & FrontendRenderer::GetTileKeyStorage()
void FrontendRenderer::StartThread()
{
- m_selfThread.Create(this);
+ m_selfThread.Create(make_unique<Routine>(*this));
}
void FrontendRenderer::StopThread()
{
- IRoutine::Cancel();
+ m_selfThread.GetRoutine()->Cancel();
CloseQueue();
m_selfThread.Join();
}
-void FrontendRenderer::ThreadMain()
+FrontendRenderer::Routine::Routine(FrontendRenderer & renderer) : m_renderer(renderer) {}
+
+void FrontendRenderer::Routine::Do()
{
- dp::OGLContext * context = m_contextFactory->getDrawContext();
+ dp::OGLContext * context = m_renderer.m_contextFactory->getDrawContext();
context->makeCurrent();
my::Timer timer;
- //double processingTime = InitAvarageTimePerMessage; // By init we think that one message processed by 1ms
+ // double processingTime = InitAvarageTimePerMessage; // By init we think that one message
+ // processed by 1ms
timer.Reset();
while (!IsCancelled())
{
context->setDefaultFramebuffer();
- RenderScene();
+ m_renderer.RenderScene();
double availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/);
@@ -334,18 +337,18 @@ void FrontendRenderer::ThreadMain()
while (availableTime > 0)
{
- ProcessSingleMessage(availableTime * 1000.0);
+ m_renderer.ProcessSingleMessage(availableTime * 1000.0);
availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/);
- //messageCount++;
+ // messageCount++;
}
- //processingTime = (timer.ElapsedSeconds() - processingTime) / messageCount;
+ // processingTime = (timer.ElapsedSeconds() - processingTime) / messageCount;
context->present();
timer.Reset();
}
- ReleaseResources();
+ m_renderer.ReleaseResources();
}
void FrontendRenderer::ReleaseResources()
@@ -354,11 +357,6 @@ void FrontendRenderer::ReleaseResources()
m_gpuProgramManager.Destroy();
}
-void FrontendRenderer::Do()
-{
- ThreadMain();
-}
-
void FrontendRenderer::DeleteRenderData()
{
(void)GetRangeDeletor(m_renderGroups, DeleteFunctor())();
diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp
index 33b6360bc4..19504da46a 100644
--- a/drape_frontend/frontend_renderer.hpp
+++ b/drape_frontend/frontend_renderer.hpp
@@ -32,15 +32,14 @@ namespace dp { class RenderBucket; }
namespace df
{
-class FrontendRenderer : public MessageAcceptor,
- public threads::IRoutine
+class FrontendRenderer : public MessageAcceptor
{
public:
FrontendRenderer(dp::RefPointer<ThreadsCommutator> commutator,
dp::RefPointer<dp::OGLContextFactory> oglcontextfactory,
Viewport viewport);
- ~FrontendRenderer();
+ ~FrontendRenderer() override;
#ifdef DRAW_INFO
double m_tpf;
@@ -71,13 +70,22 @@ private:
void InvalidateRenderGroups(set<TileKey> & keyStorage);
private:
+ class Routine : public threads::IRoutine
+ {
+ public:
+ Routine(FrontendRenderer & renderer);
+
+ // threads::IRoutine overrides:
+ void Do() override;
+
+ private:
+ FrontendRenderer & m_renderer;
+ };
+
void StartThread();
void StopThread();
- void ThreadMain();
void ReleaseResources();
- virtual void Do();
-
private:
void DeleteRenderData();
diff --git a/drape_frontend/message_acceptor.hpp b/drape_frontend/message_acceptor.hpp
index 99360d727f..56b6dfa6a0 100644
--- a/drape_frontend/message_acceptor.hpp
+++ b/drape_frontend/message_acceptor.hpp
@@ -11,6 +11,9 @@ class Message;
class MessageAcceptor
{
+public:
+ virtual ~MessageAcceptor() {}
+
protected:
virtual void AcceptMessage(dp::RefPointer<Message> message) = 0;