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,¶m);
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,¶m);
- 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