mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-03-24 09:49:42 +01:00
Safer locking of id() to prevent deadlocks
This commit is contained in:
parent
cd3eeb2951
commit
3f2906d4d1
src/libtomahawk
@ -29,6 +29,8 @@
|
||||
|
||||
#include "utils/Logger.h"
|
||||
|
||||
#include <QReadWriteLock>
|
||||
|
||||
using namespace Tomahawk;
|
||||
|
||||
QHash< QString, album_ptr > Album::s_albumsByName = QHash< QString, album_ptr >();
|
||||
@ -36,7 +38,7 @@ QHash< unsigned int, album_ptr > Album::s_albumsById = QHash< unsigned int, albu
|
||||
|
||||
static QMutex s_nameCacheMutex;
|
||||
static QMutex s_idCacheMutex;
|
||||
static QMutex s_idMutex;
|
||||
static QReadWriteLock s_idMutex;
|
||||
|
||||
Album::~Album()
|
||||
{
|
||||
@ -155,18 +157,25 @@ Album::loadId( bool autoCreate )
|
||||
unsigned int
|
||||
Album::id() const
|
||||
{
|
||||
QMutexLocker l( &s_idMutex );
|
||||
s_idMutex.lockForRead();
|
||||
const bool waiting = m_waitingForId;
|
||||
unsigned int finalId = m_id;
|
||||
s_idMutex.unlock();
|
||||
|
||||
if ( m_waitingForId )
|
||||
if ( waiting )
|
||||
{
|
||||
m_id = m_idFuture.get();
|
||||
finalId = m_idFuture.get();
|
||||
|
||||
s_idMutex.lockForWrite();
|
||||
m_id = finalId;
|
||||
m_waitingForId = false;
|
||||
|
||||
if ( m_id > 0 )
|
||||
s_albumsById[ m_id ] = m_ownRef.toStrongRef();
|
||||
s_idMutex.unlock();
|
||||
}
|
||||
|
||||
return m_id;
|
||||
return finalId;
|
||||
}
|
||||
|
||||
|
||||
|
@ -30,6 +30,8 @@
|
||||
|
||||
#include "utils/Logger.h"
|
||||
|
||||
#include <QReadWriteLock>
|
||||
|
||||
using namespace Tomahawk;
|
||||
|
||||
QHash< QString, artist_ptr > Artist::s_artistsByName = QHash< QString, artist_ptr >();
|
||||
@ -37,7 +39,7 @@ QHash< unsigned int, artist_ptr > Artist::s_artistsById = QHash< unsigned int, a
|
||||
|
||||
static QMutex s_nameCacheMutex;
|
||||
static QMutex s_idCacheMutex;
|
||||
static QMutex s_idMutex;
|
||||
static QReadWriteLock s_idMutex;
|
||||
|
||||
Artist::~Artist()
|
||||
{
|
||||
@ -235,14 +237,22 @@ Artist::loadId( bool autoCreate )
|
||||
unsigned int
|
||||
Artist::id() const
|
||||
{
|
||||
QMutexLocker l( &s_idMutex );
|
||||
if ( m_waitingForFuture )
|
||||
s_idMutex.lockForRead();
|
||||
const bool waiting = m_waitingForFuture;
|
||||
unsigned int finalid = m_id;
|
||||
s_idMutex.unlock();
|
||||
|
||||
if ( waiting )
|
||||
{
|
||||
m_id = m_idFuture.get();
|
||||
finalid = m_idFuture.get();
|
||||
|
||||
s_idMutex.lockForWrite();
|
||||
m_id = finalid;
|
||||
m_waitingForFuture = false;
|
||||
|
||||
if ( m_id > 0 )
|
||||
s_artistsById[ m_id ] = m_ownRef.toStrongRef();
|
||||
s_idMutex.unlock();
|
||||
}
|
||||
|
||||
return m_id;
|
||||
|
Loading…
x
Reference in New Issue
Block a user