On pe, 2016-08-12 at 07:54 +0100, Chris Wilson wrote:
> A simple little macro to clear a pointer and return the old value. This
> is useful for writing
> 
>       value = *ptr;
>       if (!value)
>               return;
> 
>       *ptr = 0;
>       ...
>       free(value);
> 
> in a slightly more concise form:
> 
>       value = fetch_and_zero(ptr);
>       if (!value)
>               return;
> 
>       ...
>       free(value);
> 
> with the idea that this establishes a pattern that may be extended for
> atomic use (using xchg or cmpxchg) i.e. atomic_fetch_and_zero() and
> similar to llist.
> 
> Signed-off-by: Chris Wilson <[email protected]>
> Cc: Joonas Lahtinen <[email protected]>
> Cc: Daniel Vetter <[email protected]>
> ---
>  drivers/gpu/drm/i915/i915_drv.h | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index a4203ff0cf7f..731c67fc9796 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3903,4 +3903,10 @@ static inline bool __i915_request_irq_complete(struct 
> drm_i915_gem_request *req)
>       return false;
>  }
>  
> +#define fetch_and_zero(ptr) ({                                       \
> +     typeof(*ptr) T__ = *(ptr);                                      \

Looking at container_of etc. it's always __ as prefix.

        const typeof(*ptr) __val = *(ptr);

And we're good to go (with kerneldoc almost ready for core submission
:P);

Reviewed-by: Joonas Lahtinen <[email protected]>

> +     *(ptr) = (typeof(*ptr))0;                                       \
> +     T__;                                                            \
> +})
> +
>  #endif
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to