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