[Nepomuk] [Kde-pim] nepomukqueryservice crash
David Faure
faure at kde.org
Tue Jul 10 14:10:56 UTC 2012
On Tuesday 10 July 2012 17:30:47 Vishesh Handa wrote:
> On Mon, Jul 9, 2012 at 7:18 PM, David Faure <faure at kde.org> wrote:
> > On Monday 09 July 2012 16:53:31 Vishesh Handa wrote:
> > > I don't think it's a threading problem cause m_initMutex is locked
> > > before
> > > deleting it, and before accessing it.
> >
> > That doesn't help. MainModel::executeQuery gets a pointer to a ClientModel
> > inside the lock, and then return an iterator which keeps using that
> > ClientModel outside the lock (or its ClientConnection, more precisely).
>
> Yes, but the iterator which it receives is of type
> Soprano::Client::ClientQueryResultIterator. This iterator just contains an
> iterator id, and a pointer to the model. Before each operation performed on
> the iterator, it check if the model pointer is not null .. aha!
> The pointer will always be 'not null'.
Yep, it becomes dangling.
> > So this opens the door for crashes, whenever the code that deletes the
> > model is run.
>
> So you're right, we cannot delete the model.
>
> Or maybe we could use some kind of pointer wrapper which check for
> deletions. I'm not sure if Qt provides this. Either way it seems messy.
Qt has QPointer/QWeakPointer, but this can't be used in a multithreaded case
like here, the deletion and the use of the pointer will race. Of course one
could use a mutex around the use (and the deletion) of the model, then.
But I think it's a bit more complicated, valgrind was pointing to a
ClientConnection pointer, not to a model pointer.
I'll commit the "don't delete" patch for now, but let's keep looking into this
:)
--
David Faure, faure at kde.org, http://www.davidfaure.fr
Sponsored by Nokia to work on KDE, incl. KDE Frameworks 5
More information about the Nepomuk
mailing list