Changeset: 9d7d4cf85d66 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9d7d4cf85d66
Modified Files:
gdk/gdk_system.c
gdk/gdk_system.h
tools/monetdbe/monetdbe.c
Branch: default
Log Message:
Merged with Jul2021
diffs (truncated from 421 to 300 lines):
diff --git a/ctest/tools/monetdbe/example_append_raw.c
b/ctest/tools/monetdbe/example_append_raw.c
--- a/ctest/tools/monetdbe/example_append_raw.c
+++ b/ctest/tools/monetdbe/example_append_raw.c
@@ -74,6 +74,13 @@ main(void)
if ((err = monetdbe_append(mdbe, "sys", "test", (monetdbe_column**)
&dcol, 6)) != NULL)
error(err)
+ // str with wrong utf8
+ char* dstr2[2] = { "\xc3\x28", "\xe2\x28\xa1" };
+ monetdbe_column col12 = { .type = monetdbe_str, .data = &dstr2, .count
= 2 };
+ monetdbe_column* dcol2[6] = { &col0, &col12, &col2, &col3, &col4, &col5
};
+ if ((err = monetdbe_append(mdbe, "sys", "test", (monetdbe_column**)
&dcol2, 6)) == NULL)
+ error("Invalid UTF-8 string expected")
+
if ((err = monetdbe_query(mdbe, "SELECT * FROM test; ", &result, NULL))
!= NULL)
error(err)
fprintf(stdout, "Query result after append with %zu cols and %"PRId64"
rows\n", result->ncols, result->nrows);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1615,7 +1615,7 @@ bm_subcommit(logger *lg)
sizes[i] = BATcount(lg->seqs_id);
n[i++] = lg->seqs_val->batCacheid;
}
- if (lg->seqs_id && BATcount(lg->dseqs) > (BATcount(lg->seqs_id)/2)) {
+ if (!cleanup && lg->seqs_id && BATcount(lg->dseqs) >
(BATcount(lg->seqs_id)/2)) {
BAT *tids, *ids, *vals;
tids = bm_tids(lg->seqs_id, lg->dseqs);
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -73,6 +73,7 @@ sortlocklist(MT_Lock *l)
r = r->next;
}
ll->next = NULL; /* break list into two */
+ r->prev = NULL;
/* recursively sort both sublists */
l = sortlocklist(l);
r = sortlocklist(r);
@@ -92,6 +93,7 @@ sortlocklist(MT_Lock *l)
t = ll = l;
} else {
ll->next = l;
+ l->prev = ll;
ll = ll->next;
}
l = l->next;
@@ -102,13 +104,20 @@ sortlocklist(MT_Lock *l)
t = ll = r;
} else {
ll->next = r;
+ r->prev = ll;
ll = ll->next;
}
r = r->next;
}
}
/* append rest of remaining list */
- ll->next = l ? l : r;
+ if (l) {
+ ll->next = l;
+ l->prev = ll;
+ } else {
+ ll->next = r;
+ r->prev = ll;
+ }
return t;
}
@@ -143,7 +152,9 @@ GDKlockstatistics(int what)
return;
}
GDKlocklist = sortlocklist(GDKlocklist);
- fprintf(stderr, "lock
name\tcount\tcontention\tsleep\tlocked\t(un)locker\tthread\n");
+ fprintf(stderr, "%-18s\t%s\t%s\t%s\t%s\t%s\t%s\n",
+ "lock name", "count", "content", "sleep",
+ "locked", "locker", "thread");
for (l = GDKlocklist; l; l = l->next) {
n++;
if (what == 0 ||
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -182,10 +182,6 @@ gdk_export void MT_thread_set_qry_ctx(Qr
/* define this to keep lock statistics (can be expensive) */
/* #define LOCK_STATS 1 */
-/* define this if you want to use pthread (or Windows) locks instead
- * of atomic instructions for locking (latching) */
-#define USE_NATIVE_LOCKS 1
-
#ifdef LOCK_STATS
#include "gdk_tracer.h"
@@ -224,6 +220,9 @@ gdk_export void MT_thread_set_qry_ctx(Qr
while (ATOMIC_TAS(&GDKlocklistlock) != 0) \
; \
(l)->next = GDKlocklist; \
+ (l)->prev = NULL; \
+ if (GDKlocklist) \
+ GDKlocklist->prev = (l); \
GDKlocklist = (l); \
ATOMIC_CLEAR(&GDKlocklistlock); \
} \
@@ -242,16 +241,17 @@ gdk_export void MT_thread_set_qry_ctx(Qr
/* SQL storage allocator, and hence we have no control */ \
/* over when the lock is destroyed and the memory freed */ \
if (strncmp((l)->name, "sa_", 3) != 0) { \
- MT_Lock * volatile _p; \
while (ATOMIC_TAS(&GDKlocklistlock) != 0) \
; \
- for (_p = GDKlocklist; _p; _p = _p->next) \
- assert(_p != (l)); \
+ if (GDKlocklist) \
+ GDKlocklist->prev = (l); \
(l)->next = GDKlocklist; \
+ (l)->prev = NULL; \
GDKlocklist = (l); \
ATOMIC_CLEAR(&GDKlocklistlock); \
} else { \
(l)->next = NULL; \
+ (l)->prev = NULL; \
} \
} while (0)
@@ -262,14 +262,14 @@ gdk_export void MT_thread_set_qry_ctx(Qr
/* SQL storage allocator, and hence we have no control */ \
/* over when the lock is destroyed and the memory freed */ \
if (strncmp((l)->name, "sa_", 3) != 0) { \
- MT_Lock * volatile *_p; \
while (ATOMIC_TAS(&GDKlocklistlock) != 0) \
; \
- for (_p = &GDKlocklist; *_p; _p = &(*_p)->next) \
- if ((l) == *_p) { \
- *_p = (l)->next; \
- break; \
- } \
+ if ((l)->next) \
+ (l)->next->prev = (l)->prev; \
+ if ((l)->prev) \
+ (l)->prev->next = (l)->next; \
+ else if (GDKlocklist == (l)) \
+ GDKlocklist = (l)->next; \
ATOMIC_CLEAR(&GDKlocklistlock); \
ATOMIC_DESTROY(&(l)->contention); \
ATOMIC_DESTROY(&(l)->sleep); \
@@ -289,8 +289,6 @@ gdk_export void MT_thread_set_qry_ctx(Qr
#endif
-#ifdef USE_NATIVE_LOCKS
-
#if !defined(HAVE_PTHREAD_H) && defined(WIN32)
typedef struct MT_Lock {
CRITICAL_SECTION lock;
@@ -299,7 +297,8 @@ typedef struct MT_Lock {
size_t count;
ATOMIC_TYPE contention;
ATOMIC_TYPE sleep;
- struct MT_Lock * volatile next;
+ struct MT_Lock *volatile next;
+ struct MT_Lock *volatile prev;
const char *locker;
const char *thread;
#endif
@@ -397,7 +396,8 @@ typedef struct MT_Lock {
size_t count;
ATOMIC_TYPE contention;
ATOMIC_TYPE sleep;
- struct MT_Lock * volatile next;
+ struct MT_Lock *volatile next;
+ struct MT_Lock *volatile prev;
const char *locker;
const char *thread;
#endif
@@ -477,133 +477,6 @@ typedef struct MT_RWLock {
#endif
-#else
-
-/* if LOCK_STATS is set, we maintain a bunch of counters and maintain
- * a linked list of active locks */
-typedef struct MT_Lock {
- ATOMIC_FLAG lock;
- char name[MT_NAME_LEN];
-#ifdef LOCK_STATS
- size_t count;
- ATOMIC_TYPE contention;
- ATOMIC_TYPE sleep;
- struct MT_Lock * volatile next;
- const char *locker;
- const char *thread;
-#endif
-} MT_Lock;
-
-#ifdef LOCK_STATS
-#define MT_LOCK_INITIALIZER(n) { .lock = ATOMIC_FLAG_INIT, .next = (struct
MT_Lock *) -1, .name = #n, }
-#else
-#define MT_LOCK_INITIALIZER(n) { .lock = ATOMIC_FLAG_INIT, .name = #n, }
-#endif
-
-#define MT_lock_try(l) (ATOMIC_TAS(&(l)->lock) == 0)
-
-#define MT_lock_set(l) \
- do { \
- _DBG_LOCK_COUNT_0(l); \
- if (!MT_lock_try(l)) { \
- /* we didn't get the lock */ \
- unsigned _spincnt = 0; \
- _DBG_LOCK_CONTENTION(l); \
- MT_thread_setlockwait(l); \
- do { \
- if ((++_spincnt & 2047) == 0) { \
- _DBG_LOCK_SLEEP(l); \
- MT_sleep_ms(1); \
- } \
- } while (!MT_lock_try(l)); \
- MT_thread_setlockwait(NULL); \
- } \
- _DBG_LOCK_LOCKER(l); \
- _DBG_LOCK_COUNT_2(l); \
- } while (0)
-
-#define MT_lock_init(l, n) \
- do { \
- size_t nlen; \
- ATOMIC_CLEAR(&(l)->lock); \
- nlen = strlen(n); \
- if (nlen >= sizeof((l)->name)) \
- nlen = sizeof((l)->name) - 1; \
- memcpy((l)->name, (n), nlen + 1); \
- (l)->name[sizeof((l)->name) - 1] = 0; \
- _DBG_LOCK_INIT(l); \
- } while (0)
-
-#define MT_lock_unset(l) \
- do { \
- /* lock should be locked */ \
- assert(ATOMIC_TAS(&(l)->lock) != 0); \
- _DBG_LOCK_UNLOCKER(l); \
- ATOMIC_CLEAR(&(l)->lock); \
- } while (0)
-
-#define MT_lock_destroy(l) _DBG_LOCK_DESTROY(l)
-
-typedef struct MT_RWLock {
- MT_Lock lock;
- ATOMIC_TYPE readers;
-} MT_RWLock;
-
-#define MT_RWLOCK_INITIALIZER(n) \
- { .lock = MT_LOCK_INITIALIZER(n), .readers = ATOMIC_VAR_INIT(0), }
-
-#define MT_rwlock_init(l, n) \
- do { \
- MT_lock_init(&(l)->lock, n); \
- ATOMIC_INIT(&(l)->readers, 0); \
- } while (0)
-
-#define MT_rwlock_destroy(l) \
- do { \
- MT_lock_destroy(&(l)->lock); \
- ATOMIC_DESTROY(&(l)->readers); \
- } while (0)
-
-#define MT_rwlock_rdlock(l) \
- do { \
- MT_lock_set(&(l)->lock); \
- (void) ATOMIC_INC(&(l)->readers); \
- MT_lock_unset(&(l)->lock); \
- } while (0)
-static inline bool
-MT_rwlock_rdtry(MT_RWLock *l)
-{
- if (!MT_lock_try(l))
- return false;
- (void) ATOMIC_INC(&(l)->readers);
- MT_lock_unset(&(l)->lock);
- return true;
-}
-
-#define MT_rwlock_rdunlock(l) ((void) ATOMIC_DEC(&(l)->readers))
-
-#define MT_rwlock_wrlock(l) \
- do { \
- MT_lock_set(&(l)->lock); \
- while (ATOMIC_GET(&(l)->readers) > 0) \
- MT_sleep_ms(1); \
- } while (0)
-static inline bool
-MT_rwlock_wrtry(MT_RWLock *l)
-{
- if (!MT_lock_try(l))
- return false;
- if (ATOMIC_GET(&l->readers) > 0) {
- MT_lock_unset(l);
- return false;
- }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list