Changeset: 149fe30e6766 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/149fe30e6766
Modified Files:
        gdk/gdk.h
        gdk/gdk_bat.c
        gdk/gdk_logger.c
Branch: default
Log Message:

Fix some data races.


diffs (96 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -726,8 +726,8 @@ typedef struct {
        uint16_t width;         /* byte-width of the atom array */
        int8_t type;            /* type id. */
        uint8_t shift;          /* log2 of bun width */
-       bool varsized:1,        /* varsized/void (true) or fixedsized (false) */
-               key:1,          /* no duplicate values present */
+       bool varsized;          /* varsized/void (true) or fixedsized (false) */
+       bool key:1,             /* no duplicate values present */
                nonil:1,        /* there are no nils in the column */
                nil:1,          /* there is a nil in the column */
                sorted:1,       /* column is sorted in ascending order */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1027,7 +1027,9 @@ BUNappendmulti(BAT *b, const void *value
                return GDK_FAIL;
        }
 
+       MT_lock_set(&b->theaplock);
        ALIGNapp(b, force, GDK_FAIL);
+       MT_lock_unset(&b->theaplock);
 
        if (b->ttype == TYPE_void && BATtdense(b)) {
                const oid *ovals = values;
@@ -1400,20 +1402,21 @@ BUNdelete(BAT *b, oid o)
 static gdk_return
 BUNinplacemulti(BAT *b, const oid *positions, const void *values, BUN count, 
bool force, bool autoincr)
 {
-       BUN last = BATcount(b) - 1;
-       BATiter bi = bat_iterator_nolock(b);
        int tt;
        BUN prv, nxt;
        const void *val;
 
+       MT_lock_set(&b->theaplock);
+       BUN last = BATcount(b) - 1;
+       BATiter bi = bat_iterator_nolock(b);
        /* zap alignment info */
        if (!force && (b->batRestricted != BAT_WRITE || b->batSharecnt > 0)) {
+               MT_lock_unset(&b->theaplock);
                GDKerror("access denied to %s, aborting.\n",
                         BATgetId(b));
                return GDK_FAIL;
        }
        TRC_DEBUG(ALGO, ALGOBATFMT " replacing " BUNFMT " values\n", 
ALGOBATPAR(b), count);
-       MT_lock_set(&b->theaplock);
        if (b->ttype == TYPE_void) {
                PROPdestroy(b);
                b->tminpos = BUN_NONE;
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2915,19 +2915,26 @@ log_tstart(logger *lg, bool flushnow)
 {
        logformat l;
 
+       logger_lock(lg);
        if (flushnow) {
                lg->id++;
                logger_close_output(lg);
                /* start new file */
-               if (logger_open_output(lg) != GDK_SUCCEED)
+               if (logger_open_output(lg) != GDK_SUCCEED) {
+                       logger_unlock(lg);
                        return GDK_FAIL;
-               while (lg->saved_id+1 < lg->id)
+               }
+               while (lg->saved_id+1 < lg->id) {
+                       logger_unlock(lg);
                        logger_flush(lg, (1ULL<<63));
+                       logger_lock(lg);
+               }
                lg->flushnow = flushnow;
        }
 
        lg->end++;
        if (LOG_DISABLED(lg)) {
+               logger_unlock(lg);
                return GDK_SUCCEED;
        }
 
@@ -2936,7 +2943,10 @@ log_tstart(logger *lg, bool flushnow)
 
        if (lg->debug & 1)
                fprintf(stderr, "#log_tstart %d\n", lg->tid);
-       if (log_write_format(lg, &l) != GDK_SUCCEED)
+       if (log_write_format(lg, &l) != GDK_SUCCEED) {
+               logger_unlock(lg);
                return GDK_FAIL;
+       }
+       logger_unlock(lg);
        return GDK_SUCCEED;
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to