Changeset: 5f4273e5bcdb for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5f4273e5bcdb Added Files: sql/test/BugTracker-2017/Tests/All sql/test/BugTracker-2017/Tests/avggroupbysq.Bug-6178.sql sql/test/BugTracker-2017/Tests/avggroupbysq.Bug-6178.stable.err sql/test/BugTracker-2017/Tests/avggroupbysq.Bug-6178.stable.out sql/test/BugTracker-2017/Tests/shutdown.Bug-6182.sql sql/test/BugTracker-2017/Tests/shutdown.Bug-6182.stable.err sql/test/BugTracker-2017/Tests/shutdown.Bug-6182.stable.out Modified Files: clients/Tests/exports.stable.out gdk/ChangeLog gdk/gdk.h gdk/gdk_aggr.c gdk/gdk_atoms.c gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_bbp.h gdk/gdk_interprocess.c gdk/gdk_interprocess.h gdk/gdk_logger.c gdk/gdk_tm.c monetdb5/mal/mal_client.c monetdb5/mal/mal_debugger.c monetdb5/mal/mal_factory.c monetdb5/mal/mal_interpreter.c monetdb5/modules/kernel/aggr.c monetdb5/modules/mal/clients.c monetdb5/modules/mal/groupby.c monetdb5/modules/mal/mal_mapi.c monetdb5/modules/mal/orderidx.c monetdb5/modules/mal/tablet.c monetdb5/modules/mal/tokenizer.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_statistics.c monetdb5/scheduler/run_memo.c sql/backends/monet5/UDF/pyapi/connection.c sql/backends/monet5/UDF/pyapi/conversion.c sql/backends/monet5/UDF/pyapi/conversion.h sql/backends/monet5/UDF/pyapi/emit.c sql/backends/monet5/UDF/pyapi/formatinput.c sql/backends/monet5/UDF/pyapi/pyapi.c sql/backends/monet5/UDF/pyapi/pyapi.h sql/backends/monet5/UDF/pyapi/pyheader.h sql/backends/monet5/UDF/pyapi/pyloader.c sql/backends/monet5/UDF/pyapi/pytypes.c sql/backends/monet5/UDF/pyapi/type_conversion.c sql/backends/monet5/UDF/pyapi/unicode.c sql/backends/monet5/sql.c sql/backends/monet5/vaults/lidar/lidar.c sql/backends/monet5/vaults/netcdf/netcdf.c sql/backends/monet5/vaults/shp/shp.c sql/storage/bat/bat_utils.c sql/storage/bat/res_table.c testing/Mtest.py.in tools/mserver/shutdowntest.c Branch: default Log Message:
merged diffs (truncated from 1550 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -186,10 +186,9 @@ BAT *BATunique(BAT *b, BAT *s); BBPrec *BBP[N_BBPINIT]; void BBPaddfarm(const char *dirname, int rolemask); void BBPclear(bat bid); -int BBPdecref(bat b, int logical); BAT *BBPdescriptor(bat b); +int BBPfix(bat b); int BBPin; -int BBPincref(bat b, int logical); bat BBPindex(const char *nme); void BBPkeepref(bat i); bat BBPlimit; @@ -199,11 +198,14 @@ int BBPout; str BBPphysical(bat b, str buf); BAT *BBPquickdesc(bat b, int delaccess); int BBPreclaim(BAT *b); +int BBPrelease(bat b); int BBPrename(bat bid, const char *nme); void BBPresetfarms(void); +int BBPretain(bat b); gdk_return BBPsave(BAT *b); void BBPshare(bat b); gdk_return BBPsync(int cnt, bat *subcommit); +int BBPunfix(bat b); void BBPunlock(void); gdk_return BUNappend(BAT *b, const void *right, bit force); gdk_return BUNdelete(BAT *b, oid o); diff --git a/gdk/ChangeLog b/gdk/ChangeLog --- a/gdk/ChangeLog +++ b/gdk/ChangeLog @@ -1,6 +1,10 @@ # ChangeLog file for MonetDB # This file is updated with Maddlog +* Tue Jan 3 2017 Sjoerd Mullender <[email protected]> +- Replaced BBPincref/BBPdecref with BBPfix/BBPunfix for physical reference + count and BBPretain/BBPrelease for logical reference count maintenance. + * Fri Dec 16 2016 Sjoerd Mullender <[email protected]> - Removed automatic conversion of 32-bit OIDs to 64 bits on 64-bit architectures. diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1617,9 +1617,9 @@ gdk_export void GDKqsort_rev(void *h, vo * @item int * @tab BBPunfix (bat bi) * @item int - * @tab BBPincref (bat bi, int logical) + * @tab BBPretain (bat bi) * @item int - * @tab BBPdecref (bat bi, int logical) + * @tab BBPrelease (bat bi) * @item str * @tab BBPname (bat bi) * @item bat @@ -1708,8 +1708,6 @@ gdk_export BBPrec *BBP[N_BBPINIT]; "") #define BBPvalid(i) (BBP_logical(i) != NULL && *BBP_logical(i) != '.') #define BATgetId(b) BBPname((b)->batCacheid) -#define BBPfix(i) BBPincref((i), FALSE) -#define BBPunfix(i) BBPdecref((i), FALSE) #define BBPRENAME_ALREADY (-1) #define BBPRENAME_ILLEGAL (-2) diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -1386,7 +1386,8 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT return GDK_SUCCEED; } - if ((e == NULL || + if ((!skip_nils || cntsp == NULL || b->tnonil) && + (e == NULL || (BATcount(e) == BATcount(b) && e->hseqbase == b->hseqbase)) && (BATtdense(g) || (g->tkey && g->tnonil))) { /* trivial: singleton groups, so all results are equal diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -114,16 +114,16 @@ hgeHash(const hge *v) /* * @+ Standard Atoms */ -static inline int +static int batFix(const bat *b) { - return BBPincref(*b, TRUE); + return BBPretain(*b); } -static inline int +static int batUnfix(const bat *b) { - return BBPdecref(*b, TRUE); + return BBPrelease(*b); } /* diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -1934,9 +1934,9 @@ BATmode(BAT *b, int mode) } /* persistent BATs get a logical reference */ if (mode == PERSISTENT) { - BBPincref(bid, TRUE); + BBPretain(bid); } else if (b->batPersistence == PERSISTENT) { - BBPdecref(bid, TRUE); + BBPrelease(bid); } MT_lock_set(&GDKswapLock(bid)); if (mode == PERSISTENT) { diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -59,9 +59,8 @@ * * @item reference counting * Bats use have two kinds of references: logical and physical - * (pointer) ones. Both are administered with the BBPincref/BBPdecref - * routines. For backward compatibility, we maintain BBPfix/BBPunfix - * as shorthands for the adjusting the pointer references. + * (pointer) ones. The logical references are administered by + * BBPretain/BBPrelease, the physical ones by BBPfix/BBPunfix. * * @item share counting * Views use the heaps of there parent bats. To save guard this, the @@ -2044,7 +2043,7 @@ incref(bat i, int logical, int lock) return 0; } - if (!BBPcheck(i, "BBPincref")) + if (!BBPcheck(i, logical ? "BBPretain" : "BBPfix")) return 0; if (lock) { @@ -2084,7 +2083,7 @@ incref(bat i, int logical, int lock) * lock. Set the BBPLOADING flag so that * other threads will wait until we're * done. */ - BBP_status_on(i, BBPLOADING, "BBPincref"); + BBP_status_on(i, BBPLOADING, "BBPfix"); load = 1; } } @@ -2112,17 +2111,25 @@ incref(bat i, int logical, int lock) (void) getBBPdescriptor(tvp, lock); } /* done loading, release descriptor */ - BBP_status_off(i, BBPLOADING, "BBPincref"); + BBP_status_off(i, BBPLOADING, "BBPfix"); } return refs; } int -BBPincref(bat i, int logical) +BBPfix(bat i) { int lock = locked_by ? MT_getpid() != locked_by : 1; - return incref(i, logical, lock); + return incref(i, FALSE, lock); +} + +int +BBPretain(bat i) +{ + int lock = locked_by ? MT_getpid() != locked_by : 1; + + return incref(i, TRUE, lock); } void @@ -2142,7 +2149,7 @@ BBPshare(bat parent) } static inline int -decref(bat i, int logical, int releaseShare, int lock) +decref(bat i, int logical, int releaseShare, int lock, const char *func) { int refs = 0, swap = 0; bat tp = 0, tvp = 0; @@ -2161,7 +2168,7 @@ decref(bat i, int logical, int releaseSh while (BBP_status(i) & BBPUNLOADING) { if (lock) MT_lock_unset(&GDKswapLock(i)); - BBPspin(i, "BBPdecref", BBPUNLOADING); + BBPspin(i, func, BBPUNLOADING); if (lock) MT_lock_set(&GDKswapLock(i)); } @@ -2171,14 +2178,14 @@ decref(bat i, int logical, int releaseSh /* decrement references by one */ if (logical) { if (BBP_lrefs(i) == 0) { - GDKerror("BBPdecref: %s does not have logical references.\n", BBPname(i)); + GDKerror("%s: %s does not have logical references.\n", func, BBPname(i)); assert(0); } else { refs = --BBP_lrefs(i); } } else { if (BBP_refs(i) == 0) { - GDKerror("BBPdecref: %s does not have pointer fixes.\n", BBPname(i)); + GDKerror("%s: %s does not have pointer fixes.\n", func, BBPname(i)); assert(0); } else { assert(b == NULL || b->theap.parentid == 0 || BBP_refs(b->theap.parentid) > 0); @@ -2210,9 +2217,9 @@ decref(bat i, int logical, int releaseSh * available anymore */ assert((BBP_status(i) & BBPUNLOADING) == 0); BATDEBUG { - fprintf(stderr, "#BBPdecref set to unloading BAT %d\n", i); + fprintf(stderr, "#%s set to unloading BAT %d\n", func, i); } - BBP_status_on(i, BBPUNLOADING, "BBPdecref"); + BBP_status_on(i, BBPUNLOADING, func); swap = TRUE; } @@ -2228,34 +2235,42 @@ decref(bat i, int logical, int releaseSh BBPdestroy(b); } else { BATDEBUG { - fprintf(stderr, "#BBPdecref unload and free bat %d\n", i); + fprintf(stderr, "#%s unload and free bat %d\n", func, i); } - BBP_unload_inc(i, "BBPdecref"); + BBP_unload_inc(i, func); /* free memory of transient */ - if (BBPfree(b, "BBPdecref") != GDK_SUCCEED) + if (BBPfree(b, func) != GDK_SUCCEED) return -1; /* indicate failure */ } } if (tp) - decref(tp, FALSE, FALSE, lock); + decref(tp, FALSE, FALSE, lock, func); if (tvp) - decref(tvp, FALSE, FALSE, lock); + decref(tvp, FALSE, FALSE, lock, func); return refs; } -#undef BBPdecref int -BBPdecref(bat i, int logical) +BBPunfix(bat i) { - if (BBPcheck(i, "BBPdecref") == 0) { + if (BBPcheck(i, "BBPunfix") == 0) { return -1; } - return decref(i, logical, FALSE, TRUE); + return decref(i, FALSE, FALSE, TRUE, "BBPunfix"); +} + +int +BBPrelease(bat i) +{ + if (BBPcheck(i, "BBPrelease") == 0) { + return -1; + } + return decref(i, TRUE, FALSE, TRUE, "BBPrelease"); } /* * M5 often changes the physical ref into a logical reference. This - * state change consist of the sequence BBPincref(b,TRUE);BBPunfix(b). + * state change consist of the sequence BBPretain(b);BBPunfix(b). * A faster solution is given below, because it does not trigger the * BBP management actions, such as garbage collecting the bats. * [first step, initiate code change] @@ -2277,15 +2292,15 @@ BBPkeepref(bat i) incref(i, TRUE, lock); assert(BBP_refs(i)); - decref(i, FALSE, FALSE, lock); + decref(i, FALSE, FALSE, lock, "BBPkeepref"); } } static inline void GDKunshare(bat parent) { - (void) decref(parent, FALSE, TRUE, TRUE); - (void) decref(parent, TRUE, FALSE, TRUE); + (void) decref(parent, FALSE, TRUE, TRUE, "GDKunshare"); + (void) decref(parent, TRUE, FALSE, TRUE, "GDKunshare"); } _______________________________________________ checkin-list mailing list [email protected] https://www.monetdb.org/mailman/listinfo/checkin-list
