kdrive: memory/fd leaks fixed in fbdev/vesa/trident drivers

This commit is contained in:
Keith Packard 2000-09-27 20:47:37 +00:00
parent 367cab99ec
commit 6171187e92
8 changed files with 59 additions and 24 deletions

View File

@ -136,13 +136,14 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
priv->var.bits_per_pixel == 16) priv->var.bits_per_pixel == 16)
{ {
fake24 = TRUE; fake24 = TRUE;
scrpriv->shadow = TRUE;
scrpriv->rotate = FALSE;
screen->fb[0].redMask = 0xff0000; screen->fb[0].redMask = 0xff0000;
screen->fb[0].greenMask = 0x00ff00; screen->fb[0].greenMask = 0x00ff00;
screen->fb[0].blueMask = 0x0000ff; screen->fb[0].blueMask = 0x0000ff;
screen->width = priv->var.xres; screen->width = priv->var.xres;
screen->height = priv->var.yres; screen->height = priv->var.yres;
screen->softCursor = TRUE; screen->softCursor = TRUE;
return KdShadowScreenInit (screen);
} }
else else
#endif #endif
@ -164,9 +165,13 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
screen->width = priv->var.yres; screen->width = priv->var.yres;
screen->height = priv->var.xres; screen->height = priv->var.xres;
screen->softCursor = TRUE; screen->softCursor = TRUE;
return KdShadowScreenInit (screen);
} }
} }
if (scrpriv->rotate)
scrpriv->shadow = TRUE;
if (scrpriv->shadow)
return KdShadowScreenInit (screen);
return TRUE;
} }
Bool Bool
@ -293,23 +298,30 @@ fbdevInitScreen (ScreenPtr pScreen)
ShadowUpdateProc update; ShadowUpdateProc update;
ShadowWindowProc window; ShadowWindowProc window;
if (scrpriv->shadow)
{
window = fbdevWindowLinear;
#ifdef FAKE24_ON_16 #ifdef FAKE24_ON_16
if (pScreenPriv->screen->fb[0].bitsPerPixel == 24 && priv->var.bits_per_pixel == 16) if (pScreenPriv->screen->fb[0].bitsPerPixel == 24 && priv->var.bits_per_pixel == 16)
{ {
return KdShadowInitScreen (pScreen, fbdevUpdateFake24, fbdevWindowLinear); update = fbdevUpdateFake24;
} }
else else
#endif /* FAKE24_ON_16 */ #endif /* FAKE24_ON_16 */
if (scrpriv->rotate) {
{ update = shadowUpdatePacked;
window = fbdevWindowLinear; if (scrpriv->rotate)
switch (pScreenPriv->screen->fb[0].bitsPerPixel) { {
case 8: window = fbdevWindowLinear;
update = shadowUpdateRotate8; break; switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 16: case 8:
update = shadowUpdateRotate16; break; update = shadowUpdateRotate8; break;
case 32: case 16:
update = shadowUpdateRotate32; break; update = shadowUpdateRotate16; break;
case 32:
update = shadowUpdateRotate32; break;
}
}
} }
return KdShadowInitScreen (pScreen, update, window); return KdShadowInitScreen (pScreen, update, window);
} }
@ -405,6 +417,10 @@ fbdevRestore (KdCardInfo *card)
void void
fbdevScreenFini (KdScreenInfo *screen) fbdevScreenFini (KdScreenInfo *screen)
{ {
FbdevScrPriv *scrpriv = screen->driver;
if (scrpriv->shadow)
KdShadowScreenFini (screen);
} }
void void

View File

@ -40,11 +40,11 @@ typedef struct _fbdevPriv {
int fd; int fd;
char *fb; char *fb;
char *fb_base; char *fb_base;
Bool rotate;
} FbdevPriv; } FbdevPriv;
typedef struct _fbdevScrPriv { typedef struct _fbdevScrPriv {
Bool rotate; Bool rotate;
Bool shadow;
} FbdevScrPriv; } FbdevScrPriv;
Bool Bool

View File

@ -633,11 +633,6 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
pScreen->SaveScreen = KdSaveScreen; pScreen->SaveScreen = KdSaveScreen;
pScreen->CreateWindow = KdCreateWindow; pScreen->CreateWindow = KdCreateWindow;
#ifdef RENDER
if (!fbPictureInit (pScreen, 0, 0))
return FALSE;
#endif
#ifdef FB_OLD_SCREEN #ifdef FB_OLD_SCREEN
pScreenPriv->BackingStoreFuncs.SaveAreas = fbSaveAreas; pScreenPriv->BackingStoreFuncs.SaveAreas = fbSaveAreas;
pScreenPriv->BackingStoreFuncs.RestoreAreas = fbSaveAreas; pScreenPriv->BackingStoreFuncs.RestoreAreas = fbSaveAreas;
@ -685,6 +680,11 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
pScreen->BlockHandler = KdBlockHandler; pScreen->BlockHandler = KdBlockHandler;
pScreen->WakeupHandler = KdWakeupHandler; pScreen->WakeupHandler = KdWakeupHandler;
#ifdef RENDER
if (!fbPictureInit (pScreen, 0, 0))
return FALSE;
#endif
if (card->cfuncs->initScreen) if (card->cfuncs->initScreen)
if (!(*card->cfuncs->initScreen) (pScreen)) if (!(*card->cfuncs->initScreen) (pScreen))
return FALSE; return FALSE;

View File

@ -591,6 +591,9 @@ KdShadowScreenInit (KdScreenInfo *screen);
Bool Bool
KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window); KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window);
void
KdShadowScreenFini (KdScreenInfo *screen);
/* ktest.c */ /* ktest.c */
Bool Bool
KdFrameBufferValid (CARD8 *base, int size); KdFrameBufferValid (CARD8 *base, int size);

View File

@ -30,6 +30,8 @@ KdShadowScreenInit (KdScreenInfo *screen)
void *buf; void *buf;
buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel); buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel);
if (!buf)
return FALSE;
screen->fb[0].frameBuffer = buf; screen->fb[0].frameBuffer = buf;
screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel); screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel);
screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel; screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel;
@ -44,3 +46,10 @@ KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc
return shadowInit (pScreen, update, window); return shadowInit (pScreen, update, window);
} }
void
KdShadowScreenFini (KdScreenInfo *screen)
{
if (screen->fb[0].frameBuffer)
xfree (screen->fb[0].frameBuffer);
}

View File

@ -286,6 +286,9 @@ tridentScreenFini (KdScreenInfo *screen)
{ {
TridentScreenInfo *tridents = (TridentScreenInfo *) screen->driver; TridentScreenInfo *tridents = (TridentScreenInfo *) screen->driver;
#ifdef VESA
vesaScreenFini (screen);
#endif
xfree (tridents); xfree (tridents);
screen->driver = 0; screen->driver = 0;
} }

View File

@ -188,6 +188,8 @@ VbeCleanup(VbeInfoPtr vi)
munmap(vi->magicMem, MAGICMEM_SIZE); munmap(vi->magicMem, MAGICMEM_SIZE);
munmap(vi->loMem, LOMEM_SIZE); munmap(vi->loMem, LOMEM_SIZE);
munmap(vi->hiMem, HIMEM_SIZE); munmap(vi->hiMem, HIMEM_SIZE);
close (vi->devmem);
close (vi->devzero);
xfree(vi); xfree(vi);
} }

View File

@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.5 2000/09/15 07:25:13 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.6 2000/09/19 23:50:47 keithp Exp $ */
#include "vesa.h" #include "vesa.h"
@ -795,6 +795,8 @@ vesaScreenFini(KdScreenInfo *screen)
if (pscr->fb) if (pscr->fb)
VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb); VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb);
if (pscr->shadow)
KdShadowScreenFini (screen);
screen->fb[0].depth = pscr->origDepth; screen->fb[0].depth = pscr->origDepth;
return; return;
} }