On Thu, Nov 28, 2013 at 17:06:09 +0100, Michal Privoznik wrote: > https://bugzilla.redhat.com/show_bug.cgi?id=1033061 > > Since our transformation into virObject is not complete and we must do > ref and unref ourselves there's a chance that we will get it wrong. That > is, while one thread is doing unref and subsequent dispose another > thread may come and do the ref & unref on stale pointer. This results in > dispose being called twice (and possibly simultaneously). These kind of > errors are hard to catch so we should at least throw an error into logs > if such situation occurs. In fact, I've seen a stack trace showing this > error had happen (obj = 0x7f4968018260): ... > diff --git a/src/util/viratomic.h b/src/util/viratomic.h > index 4d7f7e5..877900e 100644 > --- a/src/util/viratomic.h > +++ b/src/util/viratomic.h > @@ -68,6 +68,18 @@ VIR_STATIC int virAtomicIntInc(volatile int *atomic) > ATTRIBUTE_NONNULL(1); > > /** > + * virAtomicIntDec: > + * Decrements the value of atomic by 1. > + * > + * Think of this operation as an atomic version of > + * { *atomic -= 1; return *atomic == 0; } I believe you didn't want to copy&paste from virAtomicIntDecAndTest without modifications :-). This one is an atomic version of { *atomic -= 1; return *atomic; } > + * > + * This call acts as a full compiler and hardware memory barrier. > + */ > +VIR_STATIC int virAtomicIntDec(volatile int *atomic) > + ATTRIBUTE_NONNULL(1); > + > +/** ... Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list