diff options
author | Keith Whitwell <[email protected]> | 2005-01-12 21:04:03 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2005-01-12 21:04:03 +0000 |
commit | 8e5281fbe1a7b9beea77b93a9cdd1e842a3edfa0 (patch) | |
tree | e34df67a971db84e7ebd61ce5f8d708e72eb253b /src/mesa/drivers/dri/common | |
parent | 0aca086f7a8d13efa548753c6c7836a98719dbde (diff) |
Simplify usage of drmHash functions and fix bug in
__driGarbageCollectDrawables which would get confused while walking
the hash values.
Diffstat (limited to 'src/mesa/drivers/dri/common')
-rw-r--r-- | src/mesa/drivers/dri/common/dri_util.c | 45 |
1 files changed, 10 insertions, 35 deletions
diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index 33facbbf6c6..eff21af0eaa 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -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); } } |