From: Michel Dänzer <michel.daenzer@xxxxxxx> If a reference count is <= 0, call FatalError with the call location (in case it doesn't get resolved in the backtrace printed by FatalError). (Ported from amdgpu commit 1b6ff5fd9933c00ec1ec90dfc62e0b531927749b) Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> --- src/drmmode_display.h | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/drmmode_display.h b/src/drmmode_display.h index db68054a7..dde27a009 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -141,29 +141,36 @@ enum drmmode_flip_sync { static inline void -drmmode_fb_reference(int drm_fd, struct drmmode_fb **old, struct drmmode_fb *new) +drmmode_fb_reference_loc(int drm_fd, struct drmmode_fb **old, struct drmmode_fb *new, + const char *caller, unsigned line) { if (new) { - if (new->refcnt <= 0) - ErrorF("New FB's refcnt was %d in %s\n", new->refcnt, __func__); - else - new->refcnt++; + if (new->refcnt <= 0) { + FatalError("New FB's refcnt was %d at %s:%u", + new->refcnt, caller, line); + } + + new->refcnt++; } if (*old) { if ((*old)->refcnt <= 0) { - ErrorF("Old FB's refcnt was %d in %s\n", (*old)->refcnt, __func__); - } else { - if (--(*old)->refcnt == 0) { - drmModeRmFB(drm_fd, (*old)->handle); - free(*old); - } + FatalError("Old FB's refcnt was %d at %s:%u", + (*old)->refcnt, caller, line); + } + + if (--(*old)->refcnt == 0) { + drmModeRmFB(drm_fd, (*old)->handle); + free(*old); } } *old = new; } +#define drmmode_fb_reference(fd, old, new) \ + drmmode_fb_reference_loc(fd, old, new, __func__, __LINE__) + extern int drmmode_page_flip_target_absolute(RADEONEntPtr pRADEONEnt, drmmode_crtc_private_ptr drmmode_crtc, -- 2.13.1