diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2017-06-27 18:32:28 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2017-06-30 17:39:53 +0900 |
commit | 19626bce4e5e31c863eedb503ea3884ac3f60bea (patch) | |
tree | 8bde72cba665f70459c3873724a5e370013c3326 | |
parent | bc46ffdf71ab3dfa0f95572529e818f2b619d380 (diff) |
Improve drmmode_fb_reference debugging code
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)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/drmmode_display.h | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/drmmode_display.h b/src/drmmode_display.h index db68054a..dde27a00 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, |