summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2017-06-27 18:32:28 +0900
committerMichel Dänzer <michel@daenzer.net>2017-06-30 17:39:53 +0900
commit19626bce4e5e31c863eedb503ea3884ac3f60bea (patch)
tree8bde72cba665f70459c3873724a5e370013c3326
parentbc46ffdf71ab3dfa0f95572529e818f2b619d380 (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.h29
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,