radeon: cleanup bo unref codepath in pending code
authorDave Airlie <airlied@linux.ie>
Thu, 22 Jan 2009 11:19:56 +0000 (21:19 +1000)
committerDave Airlie <airlied@linux.ie>
Thu, 22 Jan 2009 11:19:56 +0000 (21:19 +1000)
assert for bad case hopefully

src/mesa/drivers/dri/radeon/radeon_bo_legacy.c

index c4026be9712f340c71892fe0801849b8ea4697b8..353f00100a012c91ca241ab88ee77812f63a72a4 100644 (file)
@@ -190,10 +190,14 @@ static int legacy_is_pending(struct radeon_bo *bo)
         if (bo_legacy->pnext) {
             bo_legacy->pnext->pprev = bo_legacy->pprev;
         }
+       assert(bo_legacy->is_pending <= bo->cref);
         while (bo_legacy->is_pending--) {
-            radeon_bo_unref(bo);
+           bo = radeon_bo_unref(bo);
+           if (!bo)
+             break;
         }
-        bo_legacy->is_pending = 0;
+       if (bo)
+         bo_legacy->is_pending = 0;
         boml->cpendings--;
         return 0;
     }
@@ -580,7 +584,7 @@ void radeon_bo_legacy_pending(struct radeon_bo *bo, uint32_t pending)
     struct bo_legacy *bo_legacy = (struct bo_legacy*)bo;
 
     bo_legacy->pending = pending;
-    bo_legacy->is_pending += 1;
+    bo_legacy->is_pending++;
     /* add to pending list */
     radeon_bo_ref(bo);
     if (bo_legacy->is_pending > 1) {