[UI] Correct a crash due to concurrent accesses to a dbo session
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) );
|
||||
|
||||
@@ -42,7 +42,6 @@ class TranscodeResource : public Wt::WResource
|
||||
|
||||
private:
|
||||
|
||||
std::mutex _mutex;
|
||||
Database::Handler& _db;
|
||||
|
||||
static const std::size_t _bufferSize = 65536;
|
||||
|
||||
Reference in New Issue
Block a user