On Tue, Oct 28, 2003 at 12:48:36PM +0100, Frank Gießler wrote: >David Dawes wrote: >> On Wed, Oct 15, 2003 at 04:17:35PM -0400, David Dawes wrote: >> >>>On Wed, Oct 15, 2003 at 12:53:32PM -0400, Mark Vojkovich wrote: >>> >>>> Start the server with no clients and access control disabled >>>>"XFree86 -ac". Run a client and kill it, or run a client that >>>>terminates itself (like xset) and the server segfaults on the >>>>server regeneration. I'm having a hard time getting a back trace. >>>>It looks like the stack is trashed pretty badly. This appears >>>>to be a recent regression. >>> >>>It looks like a malloc/free bug -- maybe a double free somewhere. I >>>see it crashing in free(), called from CMapUnwrapScreen(). If I add >>>some debugging ErrorF's the caller of the crashing free() moves. I'll >>>try a build on FreeBSD and enable some of its malloc debugging flags. >> >> >> That located the problem nicely, aborting at the actual double-free. >> The screen saver timers get freed in TimerInit() for each generation. >> However, the timer pointers kept by the screen saver code weren't being >> cleared for each generation, so the old values kept being used and added >> back to the timers list. Then they'd get freed again in TimerInit() at >> the second regeneration. Not to mention that freed memory was still >> being used. I'm going to commit a fix that clears the Screensaver and >> DPMS timers at each regeneration. >> >> David > >Is this fix available as a single patch? I would like to check whether this also >fixes >Bugzilla's #776.
cvs rdiff -D "15 October 2003" -D "16 October 2003" Xserver/os gives: Index: xc/programs/Xserver/os/WaitFor.c diff -u xc/programs/Xserver/os/WaitFor.c:3.41 xc/programs/Xserver/os/WaitFor.c:3.42 --- xc/programs/Xserver/os/WaitFor.c:3.41 Thu Sep 25 09:26:27 2003 +++ xc/programs/Xserver/os/WaitFor.c Wed Oct 15 21:33:35 2003 @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/os/WaitFor.c,v 3.41 2003/09/25 13:26:27 pascal Exp $ */ +/* $XFree86: xc/programs/Xserver/os/WaitFor.c,v 3.42 2003/10/16 01:33:35 dawes Exp $ */ /*********************************************************** Copyright 1987, 1998 The Open Group @@ -112,7 +112,7 @@ }; static void DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev); -static OsTimerPtr timers; +static OsTimerPtr timers = NULL; /***************** * WaitForSomething: @@ -568,10 +568,15 @@ } static OsTimerPtr ScreenSaverTimer = NULL; +static int ScreenSaverGeneration = -1; void SetScreenSaverTimer(void) { + if (ScreenSaverGeneration != serverGeneration) { + ScreenSaverTimer = NULL; + ScreenSaverGeneration = serverGeneration; + } if (ScreenSaverTime > 0) { ScreenSaverTimer = TimerSet(ScreenSaverTimer, 0, ScreenSaverTime, ScreenSaverTimeoutExpire, NULL); @@ -586,6 +591,7 @@ static OsTimerPtr DPMSStandbyTimer = NULL; static OsTimerPtr DPMSSuspendTimer = NULL; static OsTimerPtr DPMSOffTimer = NULL; +static int DPMSGeneration = -1; static CARD32 DPMSStandbyTimerExpire(OsTimerPtr timer,CARD32 now,pointer arg) @@ -635,12 +641,19 @@ if (!DPMSEnabled) return; + if (DPMSGeneration != serverGeneration) { + DPMSStandbyTimer = NULL; + DPMSSuspendTimer = NULL; + DPMSOffTimer = NULL; + DPMSGeneration = serverGeneration; + } + if (DPMSStandbyTime > 0) { DPMSStandbyTimer = TimerSet(DPMSStandbyTimer, 0, DPMSStandbyTime, DPMSStandbyTimerExpire, NULL); } if (DPMSSuspendTime > 0) { - DPMSStandbyTimer = TimerSet(DPMSSuspendTimer, 0, DPMSSuspendTime, + DPMSSuspendTimer = TimerSet(DPMSSuspendTimer, 0, DPMSSuspendTime, DPMSSuspendTimerExpire, NULL); } if (DPMSOffTime > 0) { Also, cvsweb.xfree86.org allows easy viewing of changes. A better approach is to explicitly free the timers at the end of each generation. I committed that last night. David -- David Dawes X-Oz Technologies www.XFree86.org/~dawes www.x-oz.com _______________________________________________ Devel mailing list [EMAIL PROTECTED] http://XFree86.Org/mailman/listinfo/devel