From 35a2a68e3e74847ee56f606efa9943e17aae932a 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 | 16 +++++++--------- hw/xfree86/modes/xf86Crtc.h | 2 -- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 5b169dc95..ee41d16b2 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -29,6 +29,8 @@ #include #include +#include "dix/screen_hooks_priv.h" + #include "xf86.h" #include "xf86DDC_priv.h" #include "xf86Crtc.h" @@ -765,9 +767,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; @@ -788,20 +792,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; } /* @@ -843,8 +842,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;