Changeset: 26469eafc4bf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/26469eafc4bf
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_private.h
        gdk/gdk_tm.c
Branch: Sep2022
Log Message:

Fix a data race reading/writing BBP_next(i) and BBP_free.


diffs (107 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -130,7 +130,7 @@ BATcreatedesc(oid hseq, int tt, bool hea
 
                if (ATOMneedheap(tt)) {
                        if ((bn->tvheap = GDKmalloc(sizeof(Heap))) == NULL) {
-                               BBPclear(bn->batCacheid, true);
+                               BBPclear(bn->batCacheid);
                                HEAPfree(bn->theap, true);
                                GDKfree(bn->theap);
                                GDKfree(bn);
@@ -296,7 +296,7 @@ COLnew2(oid hseq, int tt, BUN cap, role_
        TRC_DEBUG(ALGO, "-> " ALGOBATFMT "\n", ALGOBATPAR(bn));
        return bn;
   bailout:
-       BBPclear(bn->batCacheid, true);
+       BBPclear(bn->batCacheid);
        return NULL;
 }
 
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2577,12 +2577,10 @@ bbpclear(bat i, bool lock)
 }
 
 void
-BBPclear(bat i, bool lock)
+BBPclear(bat i)
 {
-       MT_Id pid = MT_getpid();
-
-       lock &= locked_by == 0 || locked_by != pid;
        if (BBPcheck(i)) {
+               bool lock = locked_by == 0 || locked_by != MT_getpid();
                bbpclear(i, lock);
        }
 }
@@ -2950,7 +2948,7 @@ decref(bat i, bool logical, bool release
                } else if (lrefs == 0 && (BBP_status(i) & BBPDELETED) == 0) {
                        if ((b = BBP_desc(i)) != NULL)
                                BATdelete(b);
-                       BBPclear(i, true);
+                       BBPclear(i);
                } else {
                        BBP_status_off(i, BBPUNLOADING);
                }
@@ -3243,7 +3241,7 @@ BBPdestroy(BAT *b)
        }
        BATdelete(b);
 
-       BBPclear(b->batCacheid, true);  /* if destroyed; de-register from BBP */
+       BBPclear(b->batCacheid);        /* if destroyed; de-register from BBP */
 
        /* parent released when completely done with child */
        if (tp)
@@ -4234,7 +4232,7 @@ getdesc(bat bid)
        if (bid < (bat) ATOMIC_GET(&BBPsize) && BBP_logical(bid))
                b = BBP_desc(bid);
        if (b == NULL)
-               BBPclear(bid, true);
+               BBPclear(bid);
        return b;
 }
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -99,7 +99,7 @@ ValPtr BATsetprop_nolock(BAT *b, enum pr
 gdk_return BBPcacheit(BAT *bn, bool lock)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
-void BBPclear(bat bid, bool lock)
+void BBPclear(bat bid)
        __attribute__((__visibility__("hidden")));
 void BBPdump(void)             /* never called: for debugging only */
        __attribute__((__cold__));
diff --git a/gdk/gdk_tm.c b/gdk/gdk_tm.c
--- a/gdk/gdk_tm.c
+++ b/gdk/gdk_tm.c
@@ -95,6 +95,8 @@ epilogue(int cnt, bat *subcommit, bool l
                if (!locked)
                        MT_lock_set(&GDKswapLock(bid));
                if ((BBP_status(bid) & BBPDELETED) && BBP_refs(bid) <= 0 && 
BBP_lrefs(bid) <= 0) {
+                       if (!locked)
+                               MT_lock_unset(&GDKswapLock(bid));
                        b = BBPquickdesc(bid);
 
                        /* the unloaded ones are deleted without
@@ -102,11 +104,12 @@ epilogue(int cnt, bat *subcommit, bool l
                        if (b) {
                                BATdelete(b);
                        }
-                       BBPclear(bid, false);
+                       BBPclear(bid); /* also clears BBP_status */
+               } else {
+                       BBP_status_off(bid, BBPDELETED | BBPSWAPPED | BBPNEW);
+                       if (!locked)
+                               MT_lock_unset(&GDKswapLock(bid));
                }
-               BBP_status_off(bid, BBPDELETED | BBPSWAPPED | BBPNEW);
-               if (!locked)
-                       MT_lock_unset(&GDKswapLock(bid));
        }
        GDKclrerr();
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to