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);                                      \
+       *(ptr) = (typeof(*ptr))0;                                       \
+       T__;                                                            \
+})
+
 #endif
-- 
2.8.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to