summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys/sw/xlib
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2013-04-24 10:49:57 +0100
committerJosé Fonseca <[email protected]>2013-04-24 16:54:58 +0100
commite29525f79fdb62993e14a4bc87a9e0955b838de0 (patch)
tree9b859911b1d1f76d9c2501c9c236037081de9226 /src/gallium/winsys/sw/xlib
parent1a87473998b4af2dbe37aa3ce0c004e62d3fe2c0 (diff)
winsys/sw/xlib: Prevent shared memory segment leakage.
Running piglit with this was causing all sort of weird stuff happening to my desktop (Chromium webpages become blank, Qt Creator flickered, etc). I tracked this down to shared memory segment leakage when GL is not shutdown properly. The segments can be seen running `ipcs` and looking for nattch==0. This changes fixes this by calling shmctl(IPC_RMID) soon after creation (which does not remove the segment immediately, but simply marks it for removal when no more processes are attached). This matches src/mesa/drivers/x11/xm_buffer.c behaviour. v2: - move shmctl(IPC_RMID) after XShmAttach() for *BSD, per Chris Wilson - remove stray debug printfs, spotted by Ian Romanick NOTE: This is a candidate for stable branches. Reviewed-by: Brian Paul <[email protected]>
Diffstat (limited to 'src/gallium/winsys/sw/xlib')
-rw-r--r--src/gallium/winsys/sw/xlib/xlib_sw_winsys.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c
index 3aef8daa423..6e71530e635 100644
--- a/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c
+++ b/src/gallium/winsys/sw/xlib/xlib_sw_winsys.c
@@ -165,6 +165,7 @@ alloc_shm_ximage(struct xlib_displaytarget *xlib_dt,
&xlib_dt->shminfo,
width, height);
if (xlib_dt->tempImage == NULL) {
+ shmctl(xlib_dt->shminfo.shmid, IPC_RMID, 0);
xlib_dt->shm = False;
return;
}
@@ -176,6 +177,11 @@ alloc_shm_ximage(struct xlib_displaytarget *xlib_dt,
XShmAttach(xlib_dt->display, &xlib_dt->shminfo);
XSync(xlib_dt->display, False);
+ /* Mark the segment to be destroyed, so that it is automatically destroyed
+ * when this process dies. Needs to be after XShmAttach() for *BSD.
+ */
+ shmctl(xlib_dt->shminfo.shmid, IPC_RMID, 0);
+
if (XErrorFlag) {
/* we are on a remote display, this error is normal, don't print it */
XFlush(xlib_dt->display);