[libvirt] [PATCH] virObject: Error on suspicious ref and unref

Jiri Denemark jdenemar at redhat.com
Thu Nov 28 22:11:01 UTC 2013


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




More information about the libvir-list mailing list