Browse Source

Simplify usage of drmHash functions and fix bug in

__driGarbageCollectDrawables which would get confused while walking
the hash values.
tags/jump_and_click
Keith Whitwell 20 years ago
parent
commit
8e5281fbe1
1 changed files with 10 additions and 35 deletions
  1. 10
    35
      src/mesa/drivers/dri/common/dri_util.c

+ 10
- 35
src/mesa/drivers/dri/common/dri_util.c View File

@@ -235,34 +235,13 @@ static GLboolean __driAddDrawable(void *drawHash, __DRIdrawable *pdraw)
static __DRIdrawable *__driFindDrawable(void *drawHash, __DRIid draw)
{
int retcode;
union
{
__DRIdrawable *pdraw;
void *ptr;
} p;
__DRIdrawable *pdraw;

retcode = drmHashLookup(drawHash, draw, &p.ptr);
retcode = drmHashLookup(drawHash, draw, (void *)&pdraw);
if (retcode)
return NULL;

return p.pdraw;
}

static void __driRemoveDrawable(void *drawHash, __DRIdrawable *pdraw)
{
int retcode;
union
{
__DRIdrawablePrivate *pdp;
void *ptr;
} p;

p.pdp = (__DRIdrawablePrivate *)pdraw->private;

retcode = drmHashLookup(drawHash, p.pdp->draw, &p.ptr);
if (!retcode) { /* Found */
drmHashDelete(drawHash, p.pdp->draw);
}
return pdraw;
}

#ifndef DRI_NEW_INTERFACE_ONLY
@@ -320,24 +299,20 @@ static void __driGarbageCollectDrawables(void *drawHash)
{
__DRIid draw;
__DRInativeDisplay *dpy;
union
{
__DRIdrawable *pdraw;
void *ptr;
} p;
__DRIdrawable *pdraw;

if (drmHashFirst(drawHash, &draw, &p.ptr)) {
if (drmHashFirst(drawHash, &draw, (void *)&pdraw) == 1) {
do {
__DRIdrawablePrivate *pdp = (__DRIdrawablePrivate *)p.pdraw->private;
__DRIdrawablePrivate *pdp = (__DRIdrawablePrivate *)pdraw->private;
dpy = pdp->driScreenPriv->display;
if (! (*window_exists)(dpy, draw)) {
/* Destroy the local drawable data in the hash table, if the
drawable no longer exists in the Xserver */
__driRemoveDrawable(drawHash, p.pdraw);
(*p.pdraw->destroyDrawable)(dpy, p.pdraw->private);
_mesa_free(p.pdraw);
drmHashDelete(drawHash, draw);
(*pdraw->destroyDrawable)(dpy, pdraw->private);
_mesa_free(pdraw);
}
} while (drmHashNext(drawHash, &draw, &p.ptr));
} while (drmHashNext(drawHash, &draw, (void *)&pdraw) == 1);
}
}


Loading…
Cancel
Save