summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2005-01-12 21:04:03 +0000
committerKeith Whitwell <[email protected]>2005-01-12 21:04:03 +0000
commit8e5281fbe1a7b9beea77b93a9cdd1e842a3edfa0 (patch)
treee34df67a971db84e7ebd61ce5f8d708e72eb253b
parent0aca086f7a8d13efa548753c6c7836a98719dbde (diff)
Simplify usage of drmHash functions and fix bug in
__driGarbageCollectDrawables which would get confused while walking the hash values.
-rw-r--r--src/mesa/drivers/dri/common/dri_util.c45
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);
}
}