From 866afe931a758f5591b87db8ab064e2b46e11872 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Tue, 29 Apr 2025 17:35:44 +0200 Subject: [PATCH] xfree86: crtc: use CloseScreen hook Wrapping ScreenRec's function pointers is problematic for many reasons, so use the new screen close notify hook instead. This one doesn't look so trivial at first glance, but I've checked that other functions called by xf86CrtcCloseScreen() just free'ing up some memory and removing the CRTCs from some lists - thus a change in execution order really shouldn't matter at all. Signed-off-by: Enrico Weigelt, metux IT consult --- hw/xfree86/modes/xf86Crtc.c | 15 ++++++--------- hw/xfree86/modes/xf86Crtc.h | 2 -- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index b2abf86be..4808ba236 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -29,6 +29,7 @@ #include #include +#include "dix/screen_hooks_priv.h" #include "randr/randrstr_priv.h" #include "xf86.h" @@ -768,9 +769,11 @@ xf86CrtcCreateScreenResources(ScreenPtr screen) /* * Clean up config on server reset */ -static Bool -xf86CrtcCloseScreen(ScreenPtr screen) +static void xf86CrtcCloseScreen(CallbackListPtr *pcbl, + ScreenPtr screen, void *unused) { + dixScreenUnhookClose(screen, xf86CrtcCloseScreen); + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); int o, c; @@ -791,20 +794,15 @@ xf86CrtcCloseScreen(ScreenPtr screen) crtc->randr_crtc = NULL; } - screen->CloseScreen = config->CloseScreen; - xf86RotateCloseScreen(screen); xf86RandR12CloseScreen(screen); - screen->CloseScreen(screen); - /* detach any providers */ if (config->randr_provider) { RRProviderDestroy(config->randr_provider); config->randr_provider = NULL; } - return TRUE; } /* @@ -846,8 +844,7 @@ xf86CrtcScreenInit(ScreenPtr screen) config->CreateScreenResources = screen->CreateScreenResources; screen->CreateScreenResources = xf86CrtcCreateScreenResources; - config->CloseScreen = screen->CloseScreen; - screen->CloseScreen = xf86CrtcCloseScreen; + dixScreenHookClose(screen, xf86CrtcCloseScreen); /* This might still be marked wrapped from a previous generation */ config->BlockHandler = NULL; diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 46f2211b4..4bb4185a6 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -799,8 +799,6 @@ typedef struct _xf86CrtcConfig { CreateScreenResourcesProcPtr CreateScreenResources; - CloseScreenProcPtr CloseScreen; - /* Cursor information */ xf86CursorInfoPtr cursor_info; CursorPtr cursor;