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

Reply via email to