diff options
author | Keith Packard <keithp@keithp.com> | 2009-05-01 18:47:04 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2009-05-01 18:49:59 -0700 |
commit | 68103b2758029b3c1fbfcf995baa758bfd2676de (patch) | |
tree | 8413d5292d583a70983a5efd50a7a2943e64827e | |
parent | 11b60973bca1bc9bbda44be4c695e22d28d8ca4a (diff) |
libdrm/intel: assert that clients are using bo refcounting correctly
Add assertions to drm_intel_gem_bo_reference,
drm_intel_gem_bo_reference_locked and drm_intel_gem_bo_unreference_locked
that the object has not been freed (refcount > 0). Mistakes in refcounting
lead to attempts to insert a bo into a free list more than once which causes
application failure as empty free lists are dereferenced as buffer objects.
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | libdrm/intel/intel_bufmgr_gem.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/libdrm/intel/intel_bufmgr_gem.c b/libdrm/intel/intel_bufmgr_gem.c index e48778c3..89931d85 100644 --- a/libdrm/intel/intel_bufmgr_gem.c +++ b/libdrm/intel/intel_bufmgr_gem.c @@ -505,6 +505,7 @@ drm_intel_gem_bo_reference(drm_intel_bo *bo) drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; + assert(bo_gem->refcount > 0); pthread_mutex_lock(&bufmgr_gem->lock); bo_gem->refcount++; pthread_mutex_unlock(&bufmgr_gem->lock); @@ -515,6 +516,7 @@ drm_intel_gem_bo_reference_locked(drm_intel_bo *bo) { drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; + assert(bo_gem->refcount > 0); bo_gem->refcount++; } @@ -549,6 +551,7 @@ drm_intel_gem_bo_unreference_locked(drm_intel_bo *bo) drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; + assert(bo_gem->refcount > 0); if (--bo_gem->refcount == 0) { struct drm_intel_gem_bo_bucket *bucket; uint32_t tiling_mode; |