Changeset: 64766f88abc0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/64766f88abc0 Modified Files: clients/Tests/exports.stable.out gdk/gdk_bbp.c sql/common/sql_types.c sql/include/sql_catalog.h sql/server/rel_select.c sql/storage/bat/bat_storage.c sql/storage/objectset.c sql/storage/sql_storage.h sql/storage/store.c Branch: no_type_bat Log Message:
merged with default diffs (truncated from 1065 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 @@ -224,6 +224,7 @@ void BBPlock(void); BAT *BBPquickdesc(bat b); int BBPreadBBPline(FILE *fp, unsigned bbpversion, int *lineno, BAT *bn, int *hashash, char *batname, char *filename, char **options); int BBPrelease(bat b); +void BBPrelinquishbats(void); int BBPrename(BAT *b, const char *nme); int BBPretain(bat b); gdk_return BBPsave(BAT *b); diff --git a/documentation/monetdbe/monetdbe_api.rst b/documentation/monetdbe/monetdbe_api.rst --- a/documentation/monetdbe/monetdbe_api.rst +++ b/documentation/monetdbe/monetdbe_api.rst @@ -167,7 +167,7 @@ Miscellaneous Return the internal NULL representation for the specific monetdbe type or NULL when the type is not found/supported. -.. c:function:: const char* monetdbe_get_mapi_port(void) +.. c:function:: const char * monetdbe_get_mapi_port(void) Return the mapi port or NULL if not used. @@ -175,6 +175,10 @@ Miscellaneous Return the MonetDBe version. +.. c:function:: const char * monetdbe_load_extension(monetdbe_database dbhdl, char *module_name) + + Load the module with name, module_name. The lib_module_name.so (or ddl) should be in the applications current working directory. + Caveats and errors ------------------ diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -120,6 +120,7 @@ static MT_Lock BBPnameLock = MT_LOCK_INI static bat BBP_hash[BBP_mask+1]; /* BBP logical name hash buckets */ static MT_Lock GDKcacheLock = MT_LOCK_INITIALIZER(GDKcacheLock); static bat BBP_free; +static uint32_t BBP_nfree; #define BBP_FREE_LOWATER 10 #define BBP_FREE_HIWATER 50 @@ -2003,6 +2004,7 @@ BBPinit(bool allow_hge_upgrade) if (BBP_desc(i)->batCacheid == 0) { BBP_next(i) = BBP_free; BBP_free = i; + BBP_nfree++; } } @@ -2693,6 +2695,7 @@ maybeextend(void) BBP_next(sz) = ++size; } BBP_next(size) = 0; + BBP_nfree += BBP_FREE_LOWATER; return GDK_SUCCEED; } @@ -2731,6 +2734,7 @@ BBPallocbat(int tt) for (int x = 0; x < BBP_FREE_LOWATER && i; x++) { assert(BBP_next(i) == 0 || BBP_next(i) > i); t->nfreebats++; + BBP_nfree--; l = i; i = BBP_next(i); } @@ -2845,6 +2849,7 @@ BBPhandover(struct freebats *t, uint32_t if (n >= t->nfreebats) { bid = t->freebats; t->freebats = 0; + BBP_nfree += t->nfreebats; t->nfreebats = 0; } else { p = &t->freebats; @@ -2852,6 +2857,7 @@ BBPhandover(struct freebats *t, uint32_t p = &BBP_next(*p); bid = *p; *p = 0; + BBP_nfree += n; t->nfreebats -= n; } p = &BBP_free; @@ -2934,9 +2940,10 @@ BBPclear(bat i) } void -BBPrelinquish(struct freebats *t) +BBPrelinquishbats(void) { - if (t->nfreebats == 0) + struct freebats *t = MT_thread_getfreebats(); + if (t == NULL || t->nfreebats == 0) return; MT_lock_set(&GDKcacheLock); while (t->nfreebats > 0) { @@ -4659,6 +4666,7 @@ gdk_bbp_reset(void) int i; BBP_free = 0; + BBP_nfree = 0; while (BBPlimit > BBPINIT) { BBPlimit -= BBPINIT; assert(BBPlimit >= 0); @@ -4892,4 +4900,5 @@ BBPprintinfo(void) printf("%d persistent bats using %zu virtual memory (%zu malloced)\n", pn, pvm, pmem); printf("%d transient bats using %zu virtual memory (%zu malloced)\n", tn, tvm, tmem); printf("%d bats are \"hot\" (i.e. currently or recently used)\n", nh); + printf("%"PRIu32" bats are in global free list\n", BBP_nfree); } diff --git a/gdk/gdk_bbp.h b/gdk/gdk_bbp.h --- a/gdk/gdk_bbp.h +++ b/gdk/gdk_bbp.h @@ -92,6 +92,7 @@ gdk_export int BBPrelease(bat b); gdk_export void BBPkeepref(BAT *b) __attribute__((__nonnull__(1))); gdk_export void BBPcold(bat i); +gdk_export void BBPrelinquishbats(void); #ifdef GDKLIBRARY_JSON typedef gdk_return ((*json_storage_conversion)(char **, const char **)); gdk_export gdk_return BBPjson_upgrade(json_storage_conversion); diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c --- a/gdk/gdk_system.c +++ b/gdk/gdk_system.c @@ -315,7 +315,6 @@ rm_mtthread(struct mtthread *t) struct mtthread **pt; assert(t != &mainthread); - BBPrelinquish(&t->freebats); thread_lock(); for (pt = &mtthreads; *pt && *pt != t; pt = &(*pt)->next) ; @@ -770,6 +769,7 @@ thread_starter(void *arg) (*self->thread_funcs[i].destroy)(self->thread_funcs[i].data); } free(self->thread_funcs); + BBPrelinquishbats(); ATOMIC_SET(&self->exited, 1); TRC_DEBUG(THRD, "Exit thread \"%s\"\n", self->threadname); return 0; /* NULL for pthreads, 0 for Windows */ diff --git a/gdk/gdk_system_private.h b/gdk/gdk_system_private.h --- a/gdk/gdk_system_private.h +++ b/gdk/gdk_system_private.h @@ -45,5 +45,3 @@ struct freebats { }; struct freebats *MT_thread_getfreebats(void) __attribute__((__visibility__("hidden"))); -void BBPrelinquish(struct freebats *t) - __attribute__((__visibility__("hidden"))); diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -231,9 +231,9 @@ base_init(allocator *sa, sql_base * b, s *b = (sql_base) { .id = id, .new = isnew, - .refcnt = 1, .name = (name) ? SA_STRDUP(sa, name) : NULL, }; + ATOMIC_INIT(&b->refcnt, 1); } void diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -204,8 +204,8 @@ typedef void *sql_store; typedef struct sql_base { unsigned int new:1, - deleted:1, - refcnt:30; + deleted:1; + ATOMIC_TYPE refcnt; sqlid id; char *name; } sql_base; diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1306,7 +1306,7 @@ rel_column_ref(sql_query *query, sql_rel sql_rel *gp = inner; while (gp && is_select(gp->op)) gp = gp->l; - if (gp && gp->l && !(exp = rel_bind_column(sql, gp->l, name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS) + if (gp && !is_basetable(gp->op) && gp->l && !(exp = rel_bind_column(sql, gp->l, name, f, 0)) && sql->session->status == -ERR_AMBIGUOUS) return NULL; } if (!exp && query && query_has_outer(query)) { @@ -1402,7 +1402,7 @@ rel_column_ref(sql_query *query, sql_rel sql_rel *gp = inner; while (gp && is_select(gp->op)) gp = gp->l; - if (gp && gp->l && !(exp = rel_bind_column3(sql, gp->l, sname, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS) + if (gp && !is_basetable(gp->op) && gp->l && !(exp = rel_bind_column3(sql, gp->l, sname, tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS) return NULL; } if (!exp && query && query_has_outer(query)) { diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -36,8 +36,8 @@ static int commit_create_del(sql_trans * static int tc_gc_col( sql_store Store, sql_change *c, ulng oldest); static int tc_gc_idx( sql_store Store, sql_change *c, ulng oldest); static int tc_gc_del( sql_store Store, sql_change *c, ulng oldest); -static int tc_gc_drop_col( sql_store Store, sql_change *c, ulng oldest); -static int tc_gc_drop_idx( sql_store Store, sql_change *c, ulng oldest); +static int tc_gc_upd_col( sql_store Store, sql_change *c, ulng oldest); +static int tc_gc_upd_idx( sql_store Store, sql_change *c, ulng oldest); static void merge_delta( sql_delta *obat); @@ -120,11 +120,24 @@ unlock_column(sqlstore *store, sqlid id) MT_lock_unset(&store->column_locks[id&(NR_COLUMN_LOCKS-1)]); } +static void +trans_add_obj(sql_trans *tr, sql_base *b, void *data, tc_cleanup_fptr cleanup, tc_commit_fptr commit, tc_log_fptr log) +{ + assert(cleanup); + trans_add(tr, dup_base(b), data, cleanup, commit, log); +} + +static void +trans_add_table(sql_trans *tr, sql_base *b, sql_table *t, void *data, tc_cleanup_fptr cleanup, tc_commit_fptr commit, tc_log_fptr log) +{ + assert(cleanup); + dup_base(&t->base); + trans_add(tr, b, data, cleanup, commit, log); +} static int tc_gc_seg( sql_store Store, sql_change *change, ulng oldest) { - (void)Store; segment *s = change->data; if (s->ts <= oldest) { @@ -134,6 +147,8 @@ tc_gc_seg( sql_store Store, sql_change * _DELETE(s); s = n; } + sqlstore *store = Store; + table_destroy(store, (sql_table*)change->obj); return 1; } return LOG_OK; @@ -549,7 +564,7 @@ tab_timestamp_storage( sql_trans *tr, sq static sql_delta* delta_dup(sql_delta *d) { - d->cs.refcnt++; + ATOMIC_INC(&d->cs.refcnt); return d; } @@ -570,7 +585,7 @@ idx_dup(sql_idx *i) static storage* storage_dup(storage *d) { - d->cs.refcnt++; + ATOMIC_INC(&d->cs.refcnt); return d; } @@ -1938,7 +1953,7 @@ dup_cs(sql_trans *tr, column_storage *oc static void destroy_delta(sql_delta *b, bool recursive) { - if (--b->cs.refcnt > 0) + if (ATOMIC_DEC(&b->cs.refcnt) > 0) return; if (recursive && b->next) destroy_delta(b->next, true); @@ -1950,6 +1965,7 @@ destroy_delta(sql_delta *b, bool recursi temp_destroy(b->cs.bid); if (b->cs.ebid) temp_destroy(b->cs.ebid); + ATOMIC_DESTROY(&b->cs.refcnt); b->cs.bid = b->cs.ebid = b->cs.uibid = b->cs.uvbid = 0; _DELETE(b); } @@ -1974,7 +1990,7 @@ bind_col_data(sql_trans *tr, sql_column sql_delta* bat = ZNEW(sql_delta); if (!bat) return NULL; - bat->cs.refcnt = 1; + ATOMIC_INIT(&bat->cs.refcnt, 1); if (dup_cs(tr, &obat->cs, &bat->cs, c->type.type->localtype, 0) != LOG_OK) { destroy_delta(bat, false); return NULL; @@ -2031,7 +2047,7 @@ update_col(sql_trans *tr, sql_column *c, assert(delta && delta->cs.ts == tr->tid); assert(c->t->persistence != SQL_DECLARED_TABLE); if (odelta != delta) - trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col, NOT_TO_BE_LOGGED(c->t) ? NULL : &log_update_col); + trans_add_table(tr, &c->base, c->t, delta, &tc_gc_upd_col, &commit_update_col, NOT_TO_BE_LOGGED(c->t) ? NULL : &log_update_col); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org