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