[PATCH xf86-video-amdgpu] Improve drmmode_fb_reference debugging code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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).

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/drmmode_display.h | 28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index b64a938cd..f351bb09c 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -133,32 +133,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++;
+			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(AMDGPUEntPtr pAMDGPUEnt,
 					     drmmode_crtc_private_ptr drmmode_crtc,
-- 
2.11.0



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux