From 94df478324202a64d9c56e7e07a0772142a3827b Mon Sep 17 00:00:00 2001 From: emeric Date: Sun, 22 Mar 2015 13:08:43 +0100 Subject: [PATCH] [ui] Corrected concurrent accesses for covers --- src/ui/resource/CoverResource.cpp | 32 ++++++++++++++++++++++--------- src/ui/resource/CoverResource.hpp | 3 +++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/ui/resource/CoverResource.cpp b/src/ui/resource/CoverResource.cpp index 6866512e..33f917fa 100644 --- a/src/ui/resource/CoverResource.cpp +++ b/src/ui/resource/CoverResource.cpp @@ -72,6 +72,7 @@ CoverResource::getTrackUrl(Database::Track::id_type trackId) void CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Response& response) { + // Get the id of the track const std::string *trackIdStr = request.getParameter("trackid"); const std::string *releaseStr = request.getParameter("release"); @@ -80,22 +81,35 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons if (trackIdStr) { - Database::Track::id_type trackId; + Database::Track::id_type trackId = std::stol(*trackIdStr); + std::string path; + bool hasCover = false;; + { - std::istringstream iss(*trackIdStr); - iss >> trackId; + // transactions are not thread safe + std::unique_lock lock(_mutex); + + Wt::Dbo::Transaction transaction(_db.getSession()); + + Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId); + if (track) + { + hasCover = track->hasCover();; + path = track->getPath(); + } } - Wt::Dbo::Transaction transaction(_db.getSession()); - - Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId); - covers = CoverArt::Grabber::getFromTrack(track); - - transaction.commit(); + if (hasCover) + { + covers = CoverArt::Grabber::getFromTrack(path); + } } else if (releaseStr) { + // transactions are not thread safe + std::unique_lock lock(_mutex); Wt::Dbo::Transaction transaction(_db.getSession()); + covers = CoverArt::Grabber::getFromRelease(_db.getSession(), *releaseStr); } diff --git a/src/ui/resource/CoverResource.hpp b/src/ui/resource/CoverResource.hpp index 9436899f..c1625718 100644 --- a/src/ui/resource/CoverResource.hpp +++ b/src/ui/resource/CoverResource.hpp @@ -20,6 +20,8 @@ #ifndef COVER_RESOURCE_HPP_ #define COVER_RESOURCE_HPP_ +#include + #include #include @@ -45,6 +47,7 @@ class CoverResource : public Wt::WResource private: + std::mutex _mutex; Database::Handler& _db; std::size_t _size; CoverArt::CoverArt _defaultCover;