> On 2010-09-10 23:56:04, Aaron Seigo wrote:
> > if there is nothing connected to it, why would it want to fill that data? 
> > if nothing is connected, then there is precisely no reason to deliver that 
> > data. it sounds like the system monitor engine is doing something wrong.
> 
> Alex Merry wrote:
>     System monitor maintains its list of sources (ie: things that can be 
> monitored) by maintaining a bunch of DataContainers.  Ordinarily, these just 
> have some meta-information about the thing being monitored, such as a 
> human-readable name and the units.  Only when a source is connected to are 
> the values updated.
>     
>     This is not an unusual approach to take, as far as I'm aware - that's 
> kind of the point of DataContainer, right?  It's just that systemmonitor 
> doesn't bother subclassing DataContainer, but instead uses it directly.
>     
>     Note that the way KSysGuard works means that if it fetches the list of 
> things that can be monitored, it has to fetch the meta-info as well, so it 
> may as well store it.  The issue is simply that it has to fetch this 
> asynchonously, and visualizations may request a source before it has done so.
> 
> Aaron Seigo wrote:
>     "This is not an unusual approach to take"
>     
>     no, it is quite unusual. a DataContainer, once added to an engine due to 
> a sourceRequestEvents not only represents that source but the source has the 
> lifespan of the request.
>     
>     instead, what it ought to do is add all the DataContainers using 
> DataEngine::addSource(DataContainer *) and then update them in 
> updateRequestEvent. this behaviour can be triggered with 
> setMinimumPollingInterval(0). this is documented in the apidox and is the way 
> to get the desired behavior.
>     
>     so, yes, SystemMonitor is at fault here :)
> 
> Alex Merry wrote:
>     I don't see how that would help.
>     
>     The issue systemmonitor is trying to deal with is that it finds out what 
> sources it should add *after* one of them is requested.  So it has the option 
> of refusing to deal with the request at all (in which case visualizations 
> would need to listen to sourceAdded() - not a problem in itself, but this 
> make break existing visualizations using systemmonitor) or adding it in the 
> hope that it will be created (the current behaviour, and the cause of the 
> problems).
>     
>     With the latter approach, when it finds out what sources are available, 
> it has the choice of populating the existing source (in which case it may 
> well be removed by DataEngine at some point) or removing it and re-adding it 
> (disconnecting the visualization in the process, defeating the purpose of 
> creating the dummy source in the first place).
> 
> Aaron Seigo wrote:
>     an easier way around this is to disconnect the DataContainer's 
> becameUnused signal:
>     
>     DataContainer *s = containerForSource(source);
>     if (s) {
>         disconnect(s, SIGNAL(becameUnused(QString))), this, 
> SLOT(removeSource(QString)));
>     }
> 
> Alex Merry wrote:
>     Sure, but this is awful hackish.
>     
>     Or do we put this down to "we have to be hacky to maintain backwards 
> compatibility with something that was doing it wrong"?
>     
>     Well, that's what I've gone for, anyway.  Along with warning comments not 
> to copy the pattern.
> 
> Aaron Seigo wrote:
>     "Sure, but this is awful hackish."
>     
>     considerably less so than adding API to DataEngine that breaks the 
> pattern of usage, and doesn't take into consideration issues such as only 
> wanting a specific source to not be autoremoved. the patch proposed creates 
> several new corner cases and, when the new feature is used, makes writing and 
> maintaining a DataEngine more complex.
>     
>     if your complaint is that disconnecting the signal requires knowing that 
> the signal is connected in the first place, it could be replaced by a method 
> added to DataContainer that does similarly, hiding the "how it is done"
>     
>     however, it remains that the system monitor DataEngine is _doing is 
> wrong_, which is why i have very little motivation to work around its quirks. 
> if nothing is listening to the source, then the source does not need to be 
> updated, and the DataContainer associated with that source can be removed. if 
> the system monitor DataEngine is using that DataContainer to cache some data 
> that should outlive the DataContainer, then it should be caching the 
> information elsewhere. the alternative is to not create the source on-demand.
>     
>     looking at the system monitor engine, however, i see absolutely no reason 
> why the data must be set or updated at all unless something is connected to 
> it. it shouldn't be creating all the sources in the id == -1 branch of 
> SystemMonitorEngine::answerReceived; it should simply populate m_sensors as 
> it already does and populate entries that already have been requested. it 
> already has an updateSourceEvent, so it should all "just work" if it doesn't 
> try to fight the DataEngine pattern :)
>

*shrugs*  It's not my work, I just wanted to fix a bug that appeared in 
bubblemon.

I might fix the trunk version to work sensibly at some point, though, if I get 
time and motivation.


- Alex


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://svn.reviewboard.kde.org/r/5312/#review7530
-----------------------------------------------------------


On 2010-09-10 23:30:32, Alex Merry wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://svn.reviewboard.kde.org/r/5312/
> -----------------------------------------------------------
> 
> (Updated 2010-09-10 23:30:32)
> 
> 
> Review request for Plasma.
> 
> 
> Summary
> -------
> 
> Allow DataEngine implementations to prevent DataEngine from automatically 
> deleting sources create in sourceRequestEvent.
> 
> Rationale: engines that fetch a list of sources asynchronously at creation 
> time (such as systemmonitor) may reasonably want to create dummy data sources 
> when they are requested before the list has been fetched.  However, they 
> probably don't want these to be removed again when disconnected from.
> 
> 
> Diffs
> -----
> 
>   /trunk/KDE/kdelibs/plasma/dataengine.cpp 1173953 
>   /trunk/KDE/kdelibs/plasma/private/dataengine_p.h 1173953 
>   /trunk/KDE/kdelibs/plasma/dataengine.h 1173953 
> 
> Diff: http://svn.reviewboard.kde.org/r/5312/diff
> 
> 
> Testing
> -------
> 
> It makes the systemmonitor engine work properly.  Specifically, it solves the 
> bug in bubblemon where if you had the bubblemon displaying, say, CPU Total 
> Load when plasma started and then changed it to, say, CPU Idle Load, the CPU 
> Total Load source would be removed and there would be an empty place where it 
> should be in the list in the config dialog.
> 
> 
> Thanks,
> 
> Alex
> 
>

_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel

Reply via email to