Changeset: 213d33113b88 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=213d33113b88
Modified Files:
        MonetDB/src/gdk/gdk_bbp.mx
        MonetDB5/src/modules/kernel/bat5.mx
Branch: Jun2010
Log Message:

merge with Feb2010:

MonetDB/src/gdk/gdk_bbp.mx:
aligned BBPkeepref(), BBPreleaseref() & BBPreleaselref() with default
to plug BAT leaks, i.e., ensure that BATs with refcount 0 are indeed freed

MonetDB5/src/modules/kernel/bat5.mx:
numerous reference-counting fixes


diffs (truncated from 328 to 300 lines):

diff -r 659965ec9085 -r 213d33113b88 MonetDB/src/gdk/gdk_bbp.mx
--- a/MonetDB/src/gdk/gdk_bbp.mx        Fri Jun 18 10:58:38 2010 +0200
+++ b/MonetDB/src/gdk/gdk_bbp.mx        Sat Jun 19 21:09:04 2010 +0200
@@ -1943,29 +1943,16 @@
 void
 BBPkeepref(bat i)
 {
-       int lock = locked_by ? BBP_getpid() != locked_by : 1;
-
        if (i == bat_nil)
                return;
        if (i < 0)
                i = -i;
        if (BBPcheck(i, "BBPkeepref")) {
-               if (lock)
-                       gdk_set_lock(GDKswapLock(i), "BBPkeepref");
-
-               while (BBP_status(i) & BBPUNLOADING) {
-                       if (lock)
-                               gdk_unset_lock(GDKswapLock(i), "BBPincref spin 
wait");
-                       BBPspin(i, "BBPkeepref", BBPUNLOADING);
-                       if (lock)
-                               gdk_set_lock(GDKswapLock(i), "BBPincref spin 
wait");
-               }
-               /* got the lock */
-               ++BBP_lrefs(i); /* incref(i, TRUE, FALSE); */
+               int lock = locked_by ? BBP_getpid() != locked_by : 1;
+
+               incref(i, TRUE, lock);
                assert(BBP_refs(i));
-               --BBP_refs(i);  /* decref(i, FALSE, FALSE, FALSE); */
-               if (lock)
-                       gdk_unset_lock(GDKswapLock(i), "BBPfix");
+               decref(i, FALSE, FALSE, lock);
        }
 }
 
@@ -1974,55 +1961,25 @@
 {
        int lock = locked_by ? BBP_getpid() != locked_by : 1;
 
-       if (i == bat_nil || BBP_lrefs(i) <= 0)
+       if (i == bat_nil)
                return;
        if (i < 0)
                i = -i;
-       if (BBPcheck(i, "BBPreleaselref")) {
-               if (lock)
-                       gdk_set_lock(GDKswapLock(i), "BBPreleaselref");
-
-               while (BBP_status(i) & BBPUNLOADING) {
-                       if (lock)
-                               gdk_unset_lock(GDKswapLock(i), "BBPincref spin 
wait");
-                       BBPspin(i, "BBPreleaselref", BBPUNLOADING);
-                       if (lock)
-                               gdk_set_lock(GDKswapLock(i), "BBPincref spin 
wait");
-               }
-               /* got the lock */
-               assert(BBP_lrefs(i));
-               --BBP_lrefs(i); /* decref(i, TRUE, FALSE, FALSE); */
-               if (lock)
-                       gdk_unset_lock(GDKswapLock(i), "BBPfix");
-       }
+       assert(BBP_refs(i) > 0);
+       decref(i, TRUE, FALSE, lock);
 }
 
 void
 BBPreleaseref(bat i)
 {
-       int lock = locked_by ? BBP_getpid() != locked_by : 1;
-
-       if (i == bat_nil || BBP_refs(i) <= 0)
-               return;
-       if (i < 0)
-               i = -i;
-       if (BBPcheck(i, "BBPreleaseref")) {
-               if (lock)
-                       gdk_set_lock(GDKswapLock(i), "BBPreleaseref");
-
-               while (BBP_status(i) & BBPUNLOADING) {
-                       if (lock)
-                               gdk_unset_lock(GDKswapLock(i), "BBPincref spin 
wait");
-                       BBPspin(i, "BBPreleaseref", BBPUNLOADING);
-                       if (lock)
-                               gdk_set_lock(GDKswapLock(i), "BBPincref spin 
wait");
-               }
-               /* got the lock */
-               assert(BBP_refs(i));    /* decref(i, FALSE, FALSE, FALSE); */
-               --BBP_refs(i);
-               if (lock)
-                       gdk_unset_lock(GDKswapLock(i), "BBPfix");
-       }
+        int lock = locked_by ? BBP_getpid() != locked_by : 1;
+
+        if (i == bat_nil)
+                return;
+        if (i < 0)
+                i = -i;
+        assert(BBP_refs(i) > 0);
+        decref(i, FALSE, FALSE, lock);
 }
 
 static INLINE void
diff -r 659965ec9085 -r 213d33113b88 MonetDB5/src/modules/kernel/bat5.mx
--- a/MonetDB5/src/modules/kernel/bat5.mx       Fri Jun 18 10:58:38 2010 +0200
+++ b/MonetDB5/src/modules/kernel/bat5.mx       Sat Jun 19 21:09:04 2010 +0200
@@ -2368,13 +2368,12 @@
        }
 
        CMDreverse(&bn, b);
+       BBPreleaseref(b->batCacheid);
        if (bn) {
                *ret = bn->batCacheid;
                BBPkeepref(bn->batCacheid);
-               BBPreleaseref(b->batCacheid);
                return MAL_SUCCEED;
        }
-       BBPreleaseref(b->batCacheid);
        throw(MAL, "bat.reverse", GDK_EXCEPTION);
 }
 
@@ -2407,7 +2406,7 @@
        }
        bn= BATrevert(b);
        if(bn==NULL ){
-               BBPkeepref(*ret= b->batCacheid);
+               BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.revert", GDK_EXCEPTION);
        }
        BBPkeepref(*ret= bn->batCacheid);
@@ -2423,11 +2422,12 @@
                throw(MAL, "bat.order", RUNTIME_OBJECT_MISSING);
        }
        bn= BATorder(b);
+       if (bn != b)
+               BBPreleaseref(b->batCacheid);
        if(bn==NULL ){
-               BBPkeepref(*ret= b->batCacheid);
                throw(MAL, "bat.order", GDK_EXCEPTION);
        }
-       BBPkeepref(*ret= b->batCacheid);
+       BBPkeepref(*ret= bn->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2441,11 +2441,12 @@
                throw(MAL, "bat.order_rev", RUNTIME_OBJECT_MISSING);
        }
        bn= BATorder_rev(b);
+       if (bn != b)
+               BBPreleaseref(b->batCacheid);
        if(bn==NULL ){
-               BBPkeepref(*ret= b->batCacheid);
                throw(MAL, "bat.order_rev", GDK_EXCEPTION);
        }
-       BBPkeepref(*ret= b->batCacheid);
+       BBPkeepref(*ret= bn->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2516,7 +2517,7 @@
        }
        CMDsetaccess(&b,i,&param);
        if (BATins(b, s,FALSE) == NULL) {
-               BBPkeepref(*r=b->batCacheid);
+               BBPreleaseref(b->batCacheid);
                BBPreleaseref(s->batCacheid);
                BBPreleaseref(i->batCacheid);
                throw(MAL, "bat.insert", GDK_EXCEPTION);
@@ -2568,6 +2569,7 @@
        @:derefStr(b,t,t)@
        if (BUNreplace(b, h, t, 0) == NULL) {
                BBPreleaseref(b->batCacheid);
+               BBPreleaseref(i->batCacheid);
                throw(MAL, "bat.replace", GDK_EXCEPTION);
        }
        BBPkeepref(*r=b->batCacheid);
@@ -2601,7 +2603,6 @@
        BBPkeepref(*r=bn->batCacheid);
        BBPreleaseref(i->batCacheid);
        BBPreleaseref(s->batCacheid);
-       BBPreleaseref(b->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2620,12 +2621,12 @@
                BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.replace", OPERATION_FAILED);
        }
-       if(bn->batCacheid != b->batCacheid){
+       if(bn->batCacheid != b->batCacheid) {
                BBPreleaseref(b->batCacheid);
+               BBPreleaseref(bn->batCacheid);
                throw(MAL, "bat.replace", OPERATION_FAILED "Different BAT 
returned");
        }
        BBPkeepref(*r=bn->batCacheid);
-       BBPreleaseref(b->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2645,11 +2646,12 @@
        if (bn == NULL || bn->batCacheid != b->batCacheid){
                BBPreleaseref(s->batCacheid);
                BBPreleaseref(b->batCacheid);
+               if (bn)
+                       BBPreleaseref(bn->batCacheid);
                throw(MAL, "bat.replace_bat", OPERATION_FAILED);
        }
        BBPkeepref(*r=bn->batCacheid);
        BBPreleaseref(s->batCacheid);
-       BBPreleaseref(b->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2668,10 +2670,12 @@
                BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.delete_bun", OPERATION_FAILED);
        }
-       if(bn->batCacheid != b->batCacheid)
+       if(bn->batCacheid != b->batCacheid) {
+               BBPreleaseref(b->batCacheid);
+               BBPreleaseref(bn->batCacheid);
                throw(MAL, "bat.delete_bun", OPERATION_FAILED "Different BAT 
returned");
+       }
        BBPkeepref(*r=bn->batCacheid);
-       BBPreleaseref(b->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2685,12 +2689,16 @@
        }
        @:derefStr(b,h,h)@
        bn= BUNdelHead(b, h,FALSE);
-       if (bn == NULL)
+       if (bn == NULL) {
+               BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.delete", OPERATION_FAILED);
-       if (bn->batCacheid != b->batCacheid)
+       }
+       if (bn->batCacheid != b->batCacheid) {
+               BBPreleaseref(b->batCacheid);
+               BBPreleaseref(bn->batCacheid);
                throw(MAL, "bat.delete", OPERATION_FAILED "Different BAT 
returned");
+       }
        BBPkeepref(*r=bn->batCacheid);
-       BBPreleaseref(b->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2704,9 +2712,11 @@
        }
        bn=BATclear(b);
        if (bn == NULL){
+               BBPreleaseref(b->batCacheid);
                throw(MAL, "bat.delete_all", OPERATION_FAILED);
        }
        if(bn->batCacheid != b->batCacheid){
+               BBPreleaseref(b->batCacheid);
                BBPreleaseref(bn->batCacheid);
                throw(MAL, "bat.delete_all", OPERATION_FAILED "Different BAT 
returned");
        }
@@ -2738,7 +2748,6 @@
                throw(MAL, "bat.delete_bat_bun", OPERATION_FAILED);
        }
        BBPkeepref(*r=bn->batCacheid);
-       BBPreleaseref(b->batCacheid);
        BBPreleaseref(s->batCacheid);
        return MAL_SUCCEED;
 }
@@ -2757,10 +2766,11 @@
                throw(MAL, "bat.delete", RUNTIME_OBJECT_MISSING);
        }
        CMDsetaccess(&b,i,&param);
-       if (BATdelHead(b, s,FALSE) != NULL) {
+       if (BATdelHead(b, s,FALSE) == NULL) {
                BBPreleaseref(b->batCacheid);
                BBPreleaseref(s->batCacheid);
-               return MAL_SUCCEED;
+               BBPreleaseref(i->batCacheid);
+               throw(MAL, "bat.delete", OPERATION_FAILED);
        }
        BBPkeepref(*r=b->batCacheid);
        BBPreleaseref(s->batCacheid);
@@ -2969,7 +2979,7 @@
                throw(MAL, "bat.inplace", RUNTIME_OBJECT_MISSING);
        }
        void_inplace5(o, *id, t,FALSE);
-       BBPreleaseref(*r = o->batCacheid);
+       BBPkeepref(*r = o->batCacheid);
        return MAL_SUCCEED;
 }
 
@@ -2983,7 +2993,7 @@
                throw(MAL, "bat.inplace", RUNTIME_OBJECT_MISSING);
        }
        void_inplace5(o, *id, t, *force);
-       BBPreleaseref(*r = o->batCacheid);
+       BBPkeepref(*r = o->batCacheid);
        return MAL_SUCCEED;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to