[Amarok] Fix: Automatic playlist scrolling was broken in so

Mark Kretschmann kretschmann at kde.org
Wed Oct 7 13:45:45 CEST 2009


On Wed, Oct 7, 2009 at 1:22 PM, Seb Ruiz <ruiz at kde.org> wrote:
> 2009/10/7 Mark Kretschmann <kretschmann at kde.org>:
>> commit a9a46b6ceab835c646b89d744bfcc5a7176ef5c1
>> Author:     Mark Kretschmann <kretschmann at kde.org>
>> AuthorDate: Wed Oct 7 12:50:25 2009 +0200
>> Commit:     Mark Kretschmann <kretschmann at kde.org>
>> CommitDate: Wed Oct 7 12:50:25 2009 +0200
>>
>>    Fix: Automatic playlist scrolling was broken in some cases.
>>
>>    The actual bug was very very nasty. EngineObserver used QSet for storing
>>    observer pointers. This is what Qt docs say:
>>    "QSet is unordered, so an iterator's sequence cannot be assumed to be predictable."
>>    Now we're using QList, whose iteration order is predictable.
>>
>>    Thanks to Anthony Vital for pointing this out.
>>
>>    BUG: 193459
>>
>> diff --git a/ChangeLog b/ChangeLog
>> index 2518826..b89cadf 100644
>> --- a/ChangeLog
>> +++ b/ChangeLog
>> @@ -38,6 +38,7 @@ VERSION 2.2.1
>>       the lyrics applet.
>>
>>   BUGFIXES:
>> +    * Automatic playlist scrolling was broken in some cases. (BR 193459)
>>     * The On Screen Display now uses a sane font size with all display
>>       resolutions. (BR 195186)
>>     * Fix rare regression where inaccessible subfolders (due to permissions)
>> diff --git a/src/EngineObserver.cpp b/src/EngineObserver.cpp
>> index d62f40d..37b85fe 100644
>> --- a/src/EngineObserver.cpp
>> +++ b/src/EngineObserver.cpp
>> @@ -209,13 +209,13 @@ EngineSubject::attach( EngineObserver *observer )
>>     if( object )
>>         connect( object, SIGNAL( destroyed( QObject* ) ), this, SLOT( observerDestroyed( QObject* ) ) );
>>
>> -    Observers.insert( observer );
>> +    Observers.append( observer );
>>  }
>>
>>  void
>>  EngineSubject::detach( EngineObserver *observer )
>>  {
>> -    Observers.remove( observer );
>> +    Observers.removeAll( observer );
>>  }
>>
>>  void
>> @@ -224,7 +224,7 @@ EngineSubject::observerDestroyed( QObject* object ) //SLOT
>>     DEBUG_BLOCK
>>
>>     EngineObserver* observer = reinterpret_cast<EngineObserver*>( object ); // cast is OK, it's guaranteed to be an EngineObserver
>> -    Observers.remove( observer );
>> +    Observers.removeAll( observer );
>>
>>     debug() << "Removed EngineObserver: " << observer;
>>  }
>> diff --git a/src/EngineObserver.h b/src/EngineObserver.h
>> index c9f023c..92f15f6 100644
>> --- a/src/EngineObserver.h
>> +++ b/src/EngineObserver.h
>> @@ -24,7 +24,6 @@
>>  #include <Phonon/Global>
>>  #include <QHash>
>>  #include <QPointer>
>> -#include <QSet>
>>
>>  class EngineSubject;
>>  class QString;
>> @@ -187,7 +186,7 @@ private:
>>     bool isMetaDataSpam( QHash<qint64, QString> newMetaData );
>>
>>     QList<QHash<qint64, QString> > m_metaDataHistory;
>> -    QSet<EngineObserver*> Observers;
>> +    QList<EngineObserver*> Observers;
>>     Phonon::State m_realState; // To work around the buffering issue
>>  };
>>
>
> Curious - how does this solve the problem? Why should it matter what
> order the observers are in - I dislike that there is any code that
> relies on some deterministic order for iterating over them (each
> observer should be disjoint from the other)

I agree that relying on the order is dangerous. So maybe the real
problem is in some other part of Amarok, design wise.

-- 
Mark Kretschmann
Amarok Developer
www.kde.org - amarok.kde.org


More information about the Amarok-devel mailing list