Changeset: c5225b9d3d08 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5225b9d3d08
Modified Files:
        gdk/gdk_system.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_utils.c
        sql/storage/bat/bat_utils.h
        sql/storage/sql_storage.h
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check0.stable.out.int128
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check1.stable.out.int128
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check2.stable.out.int128
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check3.stable.out.int128
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check4.stable.out.int128
        sql/test/leaks/Tests/check5.stable.out
        sql/test/leaks/Tests/check5.stable.out.int128
        sql/test/leaks/Tests/drop3.stable.out.int128
        sql/test/leaks/Tests/select1.stable.out
        sql/test/leaks/Tests/select1.stable.out.int128
        sql/test/leaks/Tests/select2.stable.out
        sql/test/leaks/Tests/select2.stable.out.int128
        sql/test/leaks/Tests/temp1.stable.out
        sql/test/leaks/Tests/temp1.stable.out.int128
        sql/test/leaks/Tests/temp2.stable.out.int128
        sql/test/leaks/Tests/temp3.stable.out
        sql/test/leaks/Tests/temp3.stable.out.int128
Branch: Jul2015
Log Message:

more protection agains problems in ebat copy, also cleanup no longer
used functions (eubats)


diffs (truncated from 832 to 300 lines):

diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -467,15 +467,14 @@ thread_starter(void *arg)
 static void
 join_threads(void)
 {
-       struct posthread *p, *n = NULL;
+       struct posthread *p;
        int waited;
        pthread_t tid;
 
        pthread_mutex_lock(&posthread_lock);
        do {
                waited = 0;
-               for (p = posthreads; p; p = n) {
-                       n = p->next;
+               for (p = posthreads; p; p = p->next) {
                        if (p->exited) {
                                tid = p->tid;
                                rm_posthread_locked(p);
@@ -518,8 +517,8 @@ MT_create_thread(MT_Id *t, void (*f) (vo
                pthread_mutex_lock(&posthread_lock);
                p->next = posthreads;
                posthreads = p;
+               pthread_mutex_unlock(&posthread_lock);
                f = thread_starter;
-               pthread_mutex_unlock(&posthread_lock);
                arg = p;
                newtp = &p->tid;
        } else {
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
@@ -201,13 +201,13 @@ bind_idx(sql_trans *tr, sql_idx * i, int
        return delta_bind_bat( i->data, access, isTemp(i));
 }
 
-static void
+static int
 delta_update_bat( sql_delta *bat, BAT *tids, BAT *updates, int is_new) 
 {
        BAT *b, *ui = NULL, *uv = NULL;
 
        if (!BATcount(tids))
-               return;
+               return LOG_OK;
 
        if (bat->cached) {
                bat_destroy(bat->cached);
@@ -245,12 +245,16 @@ delta_update_bat( sql_delta *bat, BAT *t
                if (isEbat(ui)){
                        temp_destroy(bat->uibid);
                        bat->uibid = temp_copy(ui->batCacheid, FALSE);
+                       if (bat->uibid == BID_NIL) 
+                               return LOG_ERR;
                        bat_destroy(ui);
                        ui = temp_descriptor(bat->uibid);
                }
                if (isEbat(uv)){
                        temp_destroy(bat->uvbid);
                        bat->uvbid = temp_copy(uv->batCacheid, FALSE);
+                       if (bat->uvbid == BID_NIL) 
+                               return LOG_ERR;
                        bat_destroy(uv);
                        uv = temp_descriptor(bat->uvbid);
                }
@@ -300,9 +304,10 @@ delta_update_bat( sql_delta *bat, BAT *t
                bat_destroy(b);
        }
        bat->ucnt += BATcount(tids);
+       return LOG_OK;
 }
 
-static void
+static int
 delta_update_val( sql_delta *bat, oid rid, void *upd) 
 {
        BAT *b = NULL;
@@ -325,12 +330,16 @@ delta_update_val( sql_delta *bat, oid ri
                        if (isEbat(ui)){
                                temp_destroy(bat->uibid);
                                bat->uibid = temp_copy(ui->batCacheid, FALSE);
+                               if (bat->uibid == BID_NIL) 
+                                       return LOG_ERR;
                                bat_destroy(ui);
                                ui = temp_descriptor(bat->uibid);
                        }
                        if (isEbat(uv)){
                                temp_destroy(bat->uvbid);
                                bat->uvbid = temp_copy(uv->batCacheid, FALSE);
+                               if (bat->uvbid == BID_NIL) 
+                                       return LOG_ERR;
                                bat_destroy(uv);
                                uv = temp_descriptor(bat->uvbid);
                        }
@@ -346,6 +355,7 @@ delta_update_val( sql_delta *bat, oid ri
                void_inplace(b, rid, upd, TRUE);
                bat_destroy(b);
        }
+       return LOG_OK;
 }
 
 static int
@@ -370,6 +380,8 @@ dup_delta(sql_trans *tr, sql_delta *obat
                BAT *b;
                if (temp) {
                        bat->ibid = temp_copy(bat->ibid, 1);
+                       if (bat->ibid == BID_NIL) 
+                               return LOG_ERR;
                } else if (oc_isnew && !bat->bid) { 
                        /* move the bat to the new col, fixup the old col*/
                        b = bat_new(TYPE_void, type, sz, PERSISTENT);
@@ -392,6 +404,8 @@ dup_delta(sql_trans *tr, sql_delta *obat
                        }
                } else { /* old column */
                        bat->ibid = ebat_copy(bat->ibid, bat->ibase, 0); 
+                       if (bat->ibid == BID_NIL) 
+                               return LOG_ERR;
                }
        }
        if (!temp && bat->ibid) { 
@@ -403,6 +417,8 @@ dup_delta(sql_trans *tr, sql_delta *obat
                                bat->uibid = ebat_copy(bat->uibid, 0, 0); 
                                bat->uvbid = ebat_copy(bat->uvbid, 0, 0); 
                        }
+                       if (bat->uibid == BID_NIL || bat->uvbid == BID_NIL) 
+                               return LOG_ERR;
                } else {
                        bat->uibid = e_bat(TYPE_oid);
                        obat->uvbid = e_bat(type);
@@ -419,14 +435,14 @@ dup_bat(sql_trans *tr, sql_table *t, sql
        return dup_delta( tr, obat, bat, type, oc_isnew, c_isnew, 
isTempTable(t), t->sz);
 }
 
-static void
+static int
 update_col(sql_trans *tr, sql_column *c, void *tids, void *upd, int tpe)
 {
        BAT *b = tids;
        sql_delta *bat;
 
        if (tpe == TYPE_bat && !BATcount(b)) 
-               return;
+               return LOG_OK;
 
        if (!c->data || !c->base.allocated) {
                int type = c->type.type->localtype;
@@ -439,19 +455,19 @@ update_col(sql_trans *tr, sql_column *c,
        bat->wtime = c->base.wtime = c->t->base.wtime = c->t->s->base.wtime = 
tr->wtime = tr->wstime;
        c->base.rtime = c->t->base.rtime = c->t->s->base.rtime = tr->rtime = 
tr->stime;
        if (tpe == TYPE_bat)
-               delta_update_bat(bat, tids, upd, isNew(c));
+               return delta_update_bat(bat, tids, upd, isNew(c));
        else 
-               delta_update_val(bat, *(oid*)tids, upd);
+               return delta_update_val(bat, *(oid*)tids, upd);
 }
 
-static void 
+static int 
 update_idx(sql_trans *tr, sql_idx * i, void *tids, void *upd, int tpe)
 {
        BAT *b = tids;
        sql_delta *bat;
 
        if (tpe == TYPE_bat && !BATcount(b)) 
-               return;
+               return LOG_OK;
 
        if (!i->data || !i->base.allocated) {
                int type = (i->type==join_idx)?TYPE_oid:TYPE_wrd;
@@ -464,12 +480,13 @@ update_idx(sql_trans *tr, sql_idx * i, v
        bat->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime = 
tr->wtime = tr->wstime;
        i->base.rtime = i->t->base.rtime = i->t->s->base.rtime = tr->rtime = 
tr->stime;
        if (tpe == TYPE_bat)
-               delta_update_bat(bat, tids, upd, isNew(i));
+               return delta_update_bat(bat, tids, upd, isNew(i));
        else
                assert(0);
+       return LOG_OK;
 }
 
-static void
+static int
 delta_append_bat( sql_delta *bat, BAT *i ) 
 {
        int id = i->batCacheid;
@@ -480,7 +497,7 @@ delta_append_bat( sql_delta *bat, BAT *i
 #endif
 
        if (!BATcount(i))
-               return ;
+               return LOG_OK;
        b = temp_descriptor(bat->ibid);
        assert(b->htype == TYPE_void);
 
@@ -514,9 +531,10 @@ delta_append_bat( sql_delta *bat, BAT *i
                bat_destroy(b);
        }
        bat->cnt += BATcount(i);
+       return LOG_OK;
 }
 
-static void
+static int
 delta_append_val( sql_delta *bat, void *i ) 
 {
        BAT *b = temp_descriptor(bat->ibid);
@@ -541,6 +559,7 @@ delta_append_val( sql_delta *bat, void *
        assert(BUNlast(b) > b->batInserted);
        bat->cnt ++;
        bat_destroy(b);
+       return LOG_OK;
 }
 
 static int 
@@ -584,6 +603,8 @@ dup_dbat( sql_trans *tr, sql_dbat *obat,
                } else {
                        bat->dbid = ebat_copy(bat->dbid, 0, temp);
                }
+               if (bat->dbid == BID_NIL) 
+                       return LOG_ERR;
        }
        (void)tr;
        return LOG_OK;
@@ -599,14 +620,15 @@ dup_del(sql_trans *tr, sql_table *ot, sq
        return ok;
 }
 
-static void 
+static int 
 append_col(sql_trans *tr, sql_column *c, void *i, int tpe)
 {
+       int ok = LOG_OK;
        BAT *b = i;
        sql_delta *bat;
 
        if (tpe == TYPE_bat && !BATcount(b)) 
-               return;
+               return ok;
 
        if (!c->data || !c->base.allocated) {
                int type = c->type.type->localtype;
@@ -622,9 +644,9 @@ append_col(sql_trans *tr, sql_column *c,
        /* therefor mark appends as reads */
        c->t->s->base.rtime = c->t->base.rtime = tr->stime;
        if (tpe == TYPE_bat)
-               delta_append_bat(bat, i);
+               ok = delta_append_bat(bat, i);
        else
-               delta_append_val(bat, i);
+               ok = delta_append_val(bat, i);
        if (!c->t->data || !c->t->base.allocated) {
                sql_table *ot = tr_find_table(tr->parent, c->t);
                sql_dbat *bat = c->t->data = ZNEW(sql_dbat), *obat = 
timestamp_dbat(ot->data, tr->stime);
@@ -637,16 +659,18 @@ append_col(sql_trans *tr, sql_column *c,
                bat_destroy(bat->cached);
                bat->cached = NULL;
        }
+       return ok;
 }
 
-static void
+static int
 append_idx(sql_trans *tr, sql_idx * i, void *ib, int tpe)
 {
        BAT *b = ib;
        sql_delta *bat;
+       int ok = LOG_OK;
 
        if (tpe == TYPE_bat && !BATcount(b)) 
-               return;
+               return ok;
 
        if (!i->data || !i->base.allocated) {
                int type = (i->type==join_idx)?TYPE_oid:TYPE_wrd;
@@ -659,9 +683,9 @@ append_idx(sql_trans *tr, sql_idx * i, v
        /* appends only write */
        bat->wtime = i->base.wtime = i->t->base.wtime = i->t->s->base.wtime = 
tr->wtime = tr->wstime;
        if (tpe == TYPE_bat)
-               delta_append_bat(bat, ib);
+               ok = delta_append_bat(bat, ib);
        else
-               delta_append_val(bat, ib);
+               ok = delta_append_val(bat, ib);
        if (!i->t->data || !i->t->base.allocated) {
                sql_table *ot = tr_find_table(tr->parent, i->t);
                sql_dbat *bat = i->t->data = ZNEW(sql_dbat), *obat = 
timestamp_dbat(ot->data, tr->stime);
@@ -674,9 +698,10 @@ append_idx(sql_trans *tr, sql_idx * i, v
                bat_destroy(bat->cached);
                bat->cached = NULL;
        }
+       return ok;
 }
 
-static void
+static int
 delta_delete_bat( sql_dbat *bat, BAT *i ) 
 {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to