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 -- [email protected]
To unsubscribe send an email to [email protected]