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:
parent
64871747bb
commit
efde2df114
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue