[UI] Correct a crash due to concurrent accesses to a dbo session

This commit is contained in:
emeric
2016-01-13 19:03:53 +01:00
parent e2dee6d4b8
commit 18a979a67a
4 changed files with 39 additions and 36 deletions
+4 -2
View File
@@ -21,6 +21,7 @@
#include <Wt/Http/Response>
#include "logger/Logger.hpp"
#include "LmsApplication.hpp"
#include "cover/CoverArtGrabber.hpp"
@@ -121,7 +122,7 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
{
// transactions are not thread safe
std::unique_lock<std::mutex> lock(_mutex);
Wt::WApplication::UpdateLock lock(LmsApplication::instance());
Wt::Dbo::Transaction transaction(_db.getSession());
@@ -147,8 +148,9 @@ CoverResource::handleRequest(const Wt::Http::Request& request, Wt::Http::Respons
else if (releaseIdStr)
{
Database::Release::id_type releaseId = std::stol(*releaseIdStr);
// transactions are not thread safe
std::unique_lock<std::mutex> lock(_mutex);
Wt::WApplication::UpdateLock lock(LmsApplication::instance());
Wt::Dbo::Transaction transaction(_db.getSession());
covers = CoverArt::Grabber::instance().getFromRelease(_db.getSession(), releaseId);
+1
View File
@@ -51,6 +51,7 @@ class CoverResource : public Wt::WResource
Image::Image getDefaultCover(std::size_t size);
void putCover(Wt::Http::Response& response, Image::Image image);
// Used to protect transactions since they are not thread safe
std::mutex _mutex;
Database::Handler& _db;
+4 -3
View File
@@ -20,6 +20,7 @@
#include <Wt/Http/Response>
#include "logger/Logger.hpp"
#include "LmsApplication.hpp"
#include "TranscodeResource.hpp"
@@ -94,7 +95,8 @@ TranscodeResource::handleRequest(const Wt::Http::Request& request,
Database::Track::id_type trackId = std::stol(*trackIdStr);
// transactions are not thread safe
std::unique_lock<std::mutex> lock(_mutex);
{
Wt::WApplication::UpdateLock lock(LmsApplication::instance());
Wt::Dbo::Transaction transaction(_db.getSession());
@@ -126,8 +128,7 @@ TranscodeResource::handleRequest(const Wt::Http::Request& request,
LMS_LOG(UI, DEBUG) << "Offset set to " << parameters.getOffset();
transcoder = std::make_shared<Av::Transcoder>(track->getPath(), parameters);
transaction.commit();
}
LMS_LOG(UI, DEBUG) << "Mime type set to '" << Av::encoding_to_mimetype(Av::Encoding::MP3);
response.setMimeType( Av::encoding_to_mimetype(Av::Encoding::MP3) );
-1
View File
@@ -42,7 +42,6 @@ class TranscodeResource : public Wt::WResource
private:
std::mutex _mutex;
Database::Handler& _db;
static const std::size_t _bufferSize = 65536;