Skip to content

Commit

Permalink
starting rendering job, it try shared lock, else cancel
Browse files Browse the repository at this point in the history
  • Loading branch information
janbar committed Feb 2, 2024
1 parent 8a0b70c commit 578112c
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 12 deletions.
12 changes: 9 additions & 3 deletions libosmscout-client-qt/include/osmscoutclientqt/MapRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,18 @@ namespace osmscout {
*/
class OSMSCOUT_CLIENT_QT_API DBRenderJob : public QObject, public DBJob{
Q_OBJECT
public:
enum RunStatus {
RunNotCompleted = 0,
RunSucceeded = 1,
RunFailed
};
private:
osmscout::MercatorProjection renderProjection;
QMap<QString,QMap<osmscout::TileKey,osmscout::TileRef>> tiles;
osmscout::MapParameter *drawParameter;
QPainter *p;
bool success;
RunStatus status;
bool drawCanvasBackground;
bool renderBasemap;
bool renderDatabases;
Expand All @@ -70,8 +76,8 @@ class OSMSCOUT_CLIENT_QT_API DBRenderJob : public QObject, public DBJob{
const std::list<DBInstanceRef> &allDatabases,
ReadLock &&locker) override;

inline bool IsSuccess() const{
return success;
inline RunStatus Status() const{
return status;
};

private:
Expand Down
5 changes: 3 additions & 2 deletions libosmscout-client-qt/src/osmscoutclientqt/MapRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ DBRenderJob::DBRenderJob(osmscout::MercatorProjection renderProjection,
tiles(tiles),
drawParameter(drawParameter),
p(p),
success(false),
status(RunNotCompleted),
drawCanvasBackground(drawCanvasBackground),
renderBasemap(renderBasemap),
renderDatabases(renderDatabases),
Expand All @@ -262,7 +262,7 @@ void DBRenderJob::Run(const osmscout::BasemapDatabaseRef& basemapDatabase,
}
DBJob::Run(basemapDatabase,databases,std::move(locker));

success=true;
bool success = true;

// draw background
if (drawCanvasBackground){
Expand Down Expand Up @@ -369,6 +369,7 @@ void DBRenderJob::Run(const osmscout::BasemapDatabaseRef& basemapDatabase,
success &= batch.paint(renderProjection,
*drawParameter,
p);
status = (success ? RunSucceeded : RunFailed);
Close();
}

Expand Down
13 changes: 10 additions & 3 deletions libosmscout-client-qt/src/osmscoutclientqt/PlaneMapRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ void PlaneMapRenderer::DrawMap()
osmscout::GeoBox renderBox(projection.GetDimensions());
getOverlayObjects(overlayObjects, renderBox);

bool success;
DBRenderJob::RunStatus status;
{
DBRenderJob job(renderProjection,
loadJob->GetAllTiles(),
Expand All @@ -400,7 +400,7 @@ void PlaneMapRenderer::DrawMap()
dbThread->GetEmptyStyleConfig(),
/*drawCanvasBackground*/ true);
dbThread->RunJob(std::bind(&DBRenderJob::Run, &job, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
success=job.IsSuccess();
status=job.Status();
}

#ifdef DRAW_DEBUG
Expand All @@ -417,10 +417,17 @@ void PlaneMapRenderer::DrawMap()
loadJob=nullptr;
}

if (!success) {
switch (status) {
case DBRenderJob::RunFailed:
osmscout::log.Error() << "*** Rendering of data has error or was interrupted";
return;
case DBRenderJob::RunNotCompleted:
osmscout::log.Info() << "Rendering was cancelled";
return;
default:
break;
}

{
QMutexLocker finishedLocker(&finishedMutex);
std::swap(currentImage,finishedImage);
Expand Down
12 changes: 9 additions & 3 deletions libosmscout-client-qt/src/osmscoutclientqt/TiledMapRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@ void TiledMapRenderer::onLoadJobFinished(QMap<QString,QMap<osmscout::TileKey,osm
getOverlayObjects(overlayObjects, renderBox);

//DrawMap(p, tileVisualCenter, loadZ, canvas.width(), canvas.height());
bool success;
DBRenderJob::RunStatus status;
{
DBRenderJob job(projection,
tiles,
Expand All @@ -484,16 +484,22 @@ void TiledMapRenderer::onLoadJobFinished(QMap<QString,QMap<osmscout::TileKey,osm
/*renderBasemap*/ !onlineTilesEnabled,
offlineTilesEnabled);
dbThread->RunJob(std::bind(&DBRenderJob::Run, &job, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
success=job.IsSuccess();
status=job.Status();
}

// this slot is called from DBLoadJob, we can't delete it now
loadJob->deleteLater();
loadJob=nullptr;

if (!success) {
switch (status) {
case DBRenderJob::RunFailed:
osmscout::log.Error() << "*** Rendering of data has error or was interrupted";
return;
case DBRenderJob::RunNotCompleted:
osmscout::log.Info() << "Rendering was cancelled";
return;
default:
break;
}

p.end();
Expand Down
8 changes: 7 additions & 1 deletion libosmscout-client/src/osmscoutclient/DBThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,13 @@ CancelableFuture<bool> DBThread::FlushCaches(const std::chrono::milliseconds &id

void DBThread::RunJob(AsynchronousDBJob job)
{
ReadLock locker(latch);
// try lock shared, else cancel
if (!latch.try_lock_shared()) {
return;
}
// keep the shared lock before handing over
ReadLock locker(latch, std::adopt_lock);

if (!isInitializedInternal()){
locker.unlock();
osmscout::log.Warn() << "ignore request, dbs is not initialized";
Expand Down

0 comments on commit 578112c

Please sign in to comment.