xlib/softpipe: more buffer free fixes

The previous memory leak fix didn't always work properly.
Now check the xm_buffer::smh field (now documented!) to
see if the buffer points to shared memory.
This commit is contained in:
Brian Paul 2010-01-22 13:07:04 -07:00
parent 64871747bb
commit efde2df114
1 changed files with 11 additions and 12 deletions

View File

@ -62,7 +62,7 @@ struct xm_buffer
XImage *tempImage; XImage *tempImage;
#ifdef USE_XSHM #ifdef USE_XSHM
int shm; boolean shm; /** Is this a shared memory buffer? */
XShmSegmentInfo shminfo; XShmSegmentInfo shminfo;
#endif #endif
}; };
@ -151,7 +151,7 @@ alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb,
&b->shminfo, &b->shminfo,
width, height); width, height);
if (b->tempImage == NULL) { if (b->tempImage == NULL) {
b->shm = 0; b->shm = FALSE;
return; return;
} }
@ -168,12 +168,12 @@ alloc_shm_ximage(struct xm_buffer *b, struct xmesa_buffer *xmb,
mesaXErrorFlag = 0; mesaXErrorFlag = 0;
XDestroyImage(b->tempImage); XDestroyImage(b->tempImage);
b->tempImage = NULL; b->tempImage = NULL;
b->shm = 0; b->shm = FALSE;
(void) XSetErrorHandler(old_handler); (void) XSetErrorHandler(old_handler);
return; return;
} }
b->shm = 1; b->shm = TRUE;
} }
#endif /* USE_XSHM */ #endif /* USE_XSHM */
@ -221,12 +221,13 @@ xm_buffer_destroy(struct pipe_buffer *buf)
oldBuf->shminfo.shmaddr = (char *) -1; oldBuf->shminfo.shmaddr = (char *) -1;
} }
if (oldBuf->shm) {
oldBuf->data = NULL;
}
if (oldBuf->tempImage) { if (oldBuf->tempImage) {
if (oldBuf->data == oldBuf->tempImage->data) {
/* oldBuf->data points at the xshm memory which we'll now free */
oldBuf->data = NULL;
}
XDestroyImage(oldBuf->tempImage); XDestroyImage(oldBuf->tempImage);
oldBuf->tempImage = NULL;
} }
#endif #endif
@ -341,10 +342,8 @@ xm_buffer_create(struct pipe_winsys *pws,
buffer->base.usage = usage; buffer->base.usage = usage;
buffer->base.size = size; buffer->base.size = size;
if (buffer->data == NULL) { /* align to 16-byte multiple for Cell */
/* align to 16-byte multiple for Cell */ buffer->data = align_malloc(size, max(alignment, 16));
buffer->data = align_malloc(size, max(alignment, 16));
}
return &buffer->base; return &buffer->base;
} }