About tdf#90566: Theme::disposing(void) memory leak: maChangeListeners is not properly disposed

Stephan Bergmann sbergman at redhat.com
Mon Apr 13 00:48:40 PDT 2015


On 04/12/2015 08:50 AM, julien2412 wrote:
> I read about tdf#90566, Theme::disposing(void) memory leak:
> maChangeListeners is not properly disposed and wondered why we couldn't just
> remove the 2 first lines of the disposing function (see
> http://opengrok.libreoffice.org/xref/core/sfx2/source/sidebar/Theme.cxx#390)
> + replace "aListeners" by "maChangeListeners"?
> I mean why adding an intermediate variable instead of just using the initial
> variable?

The general reason for this construct is multi-threading:  Access to the 
maChangeListeners member typically needs to be guarded by some mutex 
(typically a member of the same class instance as maChangeListeners), 
and the calls "out of that instance" to the

   (*iListener)->disposing(aEvent);

must be done with that mutex not locked (to avoid deadlock).  That is 
why the generic skeleton is

   Listeners copy;
   {
     Guard g(mMutex);
     copy = mListeners;
   }
   for (i: copy) i->...

However, in this particular case, the access to maChangeListeners is not 
guarded, but likely out of ignorance of the original author.



More information about the LibreOffice mailing list