Changeset: 8fe4c75f7456 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8fe4c75f7456
Modified Files:
sql/server/rel_select.c
Branch: balanced_union
Log Message:
Merge with default
diffs (truncated from 5018 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
@@ -276,6 +276,7 @@ bit GDKfataljumpenable;
str GDKfatalmsg;
char *GDKfilepath(int farmid, const char *dir, const char *nme, const char
*ext);
void GDKfree(void *blk);
+char *GDKgetbuf(void);
unsigned GDKgetdebug(void);
const char *GDKgetenv(const char *name);
int GDKgetenv_int(const char *name, int def);
@@ -306,9 +307,12 @@ void GDKqsort(void *restrict h, void *re
void *GDKrealloc(void *pold, size_t size) __attribute__((__alloc_size__(2)))
__attribute__((__warn_unused_result__));
gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, BAT *st, void
**segment_tree, oid **levels_offset, oid *nlevels);
void GDKreset(int status);
+void GDKsetbuf(char *);
void GDKsetdebug(unsigned debug);
gdk_return GDKsetenv(const char *name, const char *value);
void GDKsetmallocsuccesscount(lng count);
+stream *GDKstdin;
+stream *GDKstdout;
ssize_t GDKstrFromStr(unsigned char *restrict dst, const unsigned char
*restrict src, ssize_t len, char quote);
str GDKstrdup(const char *s) __attribute__((__malloc__))
__attribute__((__warn_unused_result__));
str GDKstrndup(const char *s, size_t n) __attribute__((__malloc__))
__attribute__((__warn_unused_result__));
@@ -401,14 +405,7 @@ BUN SORTfndlast(BAT *b, const void *v);
gdk_return STRMPcreate(BAT *b, BAT *s);
void STRMPdestroy(BAT *b);
BAT *STRMPfilter(BAT *b, BAT *s, const char *q, const bool keep_nils);
-MT_Id THRcreate(void (*f)(void *), void *arg, enum MT_thr_detach d, const char
*name);
-void *THRdata[THREADDATA];
-void THRdel(Thread t);
-Thread THRget(int tid);
-void *THRgetdata(int);
-int THRgettid(void);
-int THRhighwater(void);
-void THRsetdata(int, void *);
+bool THRhighwater(void);
gdk_return TMsubcommit(BAT *bl) __attribute__((__warn_unused_result__));
gdk_return TMsubcommit_list(bat *restrict subcommit, BUN *restrict sizes, int
cnt, lng logno, lng transid) __attribute__((__warn_unused_result__));
void VALclear(ValPtr v);
diff --git a/clients/examples/C/testcondvar.c b/clients/examples/C/testcondvar.c
--- a/clients/examples/C/testcondvar.c
+++ b/clients/examples/C/testcondvar.c
@@ -149,9 +149,7 @@ main(void)
fprintf(stderr, "\n-- Starting the worker threads\n");
for (int i = 0; i < NN; i++) {
struct state *st = &states[i];
- char name[MT_NAME_LEN];
- snprintf(name, sizeof(name), "worker%d", i);
- MT_create_thread(&st->id, worker, st, MT_THR_JOINABLE, name);
+ MT_create_thread(&st->id, worker, st, MT_THR_JOINABLE,
"workerXXXX");
}
MT_sleep_ms(100);
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -810,7 +810,7 @@ dump_type(Mapi mid, stream *toConsole, c
space = mnstr_printf(toConsole, "INTERVAL MONTH");
else
fprintf(stderr, "Internal error: unrecognized month
interval %s\n", c_type_digits);
- } else if (strlen(c_type) > 4 && strcmp(c_type+3, "_interval") == 0) {
+ } else if (strcmp(c_type, "day_interval") == 0 || strcmp(c_type,
"sec_interval") == 0) {
if (strcmp(c_type_digits, "4") == 0)
space = mnstr_printf(toConsole, "INTERVAL DAY");
else if (strcmp(c_type_digits, "5") == 0)
@@ -1874,7 +1874,7 @@ dump_table_data(Mapi mid, const char *sc
if (s == NULL)
mnstr_printf(toConsole, "NULL");
else if (useInserts) {
- if (strlen(tp) > 4 && strcmp(tp+3, "_interval")
== 0) {
+ if (strcmp(tp, "day_interval") == 0 ||
strcmp(tp, "sec_interval") == 0) {
const char *p = strchr(s, '.');
if (p == NULL)
p = s + strlen(s);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1984,37 +1984,13 @@ VALptr(const ValRecord *v)
#define THREADS 1024
#define THREADDATA 3
-typedef struct threadStruct {
- int tid; /* logical ID by MonetDB; val == index
- * into this array + 1 (0 is
- * invalid) */
- ATOMIC_TYPE pid; /* thread id, 0 = unallocated */
- bat freebats; /* linked list of free bats */
- uint32_t nfreebats; /* number of free bats in .freebats */
- char name[MT_NAME_LEN];
- void *data[THREADDATA];
- uintptr_t sp;
-} *Thread;
+typedef struct threadStruct *Thread;
-gdk_export int THRgettid(void);
-gdk_export Thread THRget(int tid);
-gdk_export MT_Id THRcreate(void (*f) (void *), void *arg, enum MT_thr_detach
d, const char *name);
-gdk_export void THRdel(Thread t);
-gdk_export void THRsetdata(int, void *);
-gdk_export void *THRgetdata(int);
-gdk_export int THRhighwater(void);
+gdk_export stream *GDKstdout;
+gdk_export stream *GDKstdin;
-gdk_export void *THRdata[THREADDATA];
-
-#define GDKstdout ((stream*)THRdata[0])
-#define GDKstdin ((stream*)THRdata[1])
-
-#define GDKerrbuf ((char*)THRgetdata(2))
-#define GDKsetbuf(x) THRsetdata(2,(void *)(x))
-
-#define THRget_errbuf(t) ((char*)t->data[2])
-#define THRset_errbuf(t,b) (t->data[2] = b)
+#define GDKerrbuf (GDKgetbuf())
static inline bat
BBPcheck(bat x)
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2901,8 +2901,8 @@ BATassertProps(BAT *b)
TRC_WARNING(BAT_, "Cannot allocate hash
table\n");
goto abort_check;
}
- if (snprintf(hs->heaplink.filename,
sizeof(hs->heaplink.filename), "%s.thshprpl%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs->heaplink.filename) ||
- snprintf(hs->heapbckt.filename,
sizeof(hs->heapbckt.filename), "%s.thshprpb%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs->heapbckt.filename)) {
+ if (snprintf(hs->heaplink.filename,
sizeof(hs->heaplink.filename), "%s.thshprpl%x", nme, (unsigned) MT_getpid()) >=
(int) sizeof(hs->heaplink.filename) ||
+ snprintf(hs->heapbckt.filename,
sizeof(hs->heapbckt.filename), "%s.thshprpb%x", nme, (unsigned) MT_getpid()) >=
(int) sizeof(hs->heapbckt.filename)) {
/* cannot happen, see comment in gdk.h
* about sizes near definition of
* BBPINIT */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1846,7 +1846,10 @@ BBPinit(void)
}
}
- manager = THRcreate(BBPmanager, NULL, MT_THR_DETACHED, "BBPmanager");
+ if (MT_create_thread(&manager, BBPmanager, NULL, MT_THR_DETACHED,
"BBPmanager") < 0) {
+ TRC_CRITICAL(GDK, "Could not start BBPmanager thread.");
+ return GDK_FAIL;
+ }
return GDK_SUCCEED;
bailout:
@@ -2408,7 +2411,7 @@ BBPinsert(BAT *bn)
char dirname[24];
bat i;
int len = 0;
- Thread t = (Thread) MT_thread_getdata();
+ struct freebats *t = MT_thread_getfreebats();
if (t->freebats == 0) {
/* critical section: get a new BBP entry */
@@ -2563,7 +2566,7 @@ BBPuncacheit(bat i, bool unloaddesc)
* BBPclear removes a BAT from the BBP directory forever.
*/
static inline void
-BBPhandover(Thread t, uint32_t n)
+BBPhandover(struct freebats *t, uint32_t n)
{
bat *p, bid;
/* take one bat from our private free list and hand it over to
@@ -2611,7 +2614,7 @@ printlist(bat bid)
static inline void
bbpclear(bat i, bool lock)
{
- Thread t = (Thread) MT_thread_getdata();
+ struct freebats *t = MT_thread_getfreebats();
TRC_DEBUG(BAT_, "clear %d (%s)\n", (int) i, BBP_logical(i));
BBPuncacheit(i, true);
@@ -2660,8 +2663,10 @@ BBPclear(bat i)
}
void
-BBPrelinquish(Thread t)
+BBPrelinquish(void)
{
+ struct freebats *t = MT_thread_getfreebats();
+
if (t->nfreebats == 0)
return;
MT_lock_set(&GDKcacheLock);
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -1179,8 +1179,8 @@ BATgroup_internal(BAT **groups, BAT **ex
}
hs->heapbckt.parentid = b->batCacheid;
hs->heaplink.parentid = b->batCacheid;
- if (snprintf(hs->heaplink.filename,
sizeof(hs->heaplink.filename), "%s.thshgrpl%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs->heaplink.filename) ||
- snprintf(hs->heapbckt.filename,
sizeof(hs->heapbckt.filename), "%s.thshgrpb%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs->heapbckt.filename) ||
+ if (snprintf(hs->heaplink.filename,
sizeof(hs->heaplink.filename), "%s.thshgrpl%x", nme, (unsigned) MT_getpid()) >=
(int) sizeof(hs->heaplink.filename) ||
+ snprintf(hs->heapbckt.filename,
sizeof(hs->heapbckt.filename), "%s.thshgrpb%x", nme, (unsigned) MT_getpid()) >=
(int) sizeof(hs->heapbckt.filename) ||
HASHnew(hs, bi.type, BATcount(b), nbucket, BUN_NONE, false)
!= GDK_SUCCEED) {
GDKfree(hs);
hs = NULL;
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2720,7 +2720,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
r->thash ? " ignoring existing hash" : "",
swapped ? " (swapped)" : "");
if (snprintf(ext, sizeof(ext), "thshjn%x",
- (unsigned) THRgettid()) >= (int) sizeof(ext))
+ (unsigned) MT_getpid()) >= (int) sizeof(ext))
goto bailout;
if ((hsh = BAThash_impl(r, rci, ext)) == NULL) {
goto bailout;
@@ -3199,8 +3199,8 @@ count_unique(BAT *b, BAT *s, BUN *cnt1,
mask = (BUN) 1 << 16;
if ((hs.heaplink.farmid = BBPselectfarm(TRANSIENT, bi.type,
hashheap)) < 0 ||
(hs.heapbckt.farmid = BBPselectfarm(TRANSIENT, bi.type,
hashheap)) < 0 ||
- snprintf(hs.heaplink.filename,
sizeof(hs.heaplink.filename), "%s.thshjnl%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs.heaplink.filename) ||
- snprintf(hs.heapbckt.filename,
sizeof(hs.heapbckt.filename), "%s.thshjnb%x", nme, (unsigned) THRgettid()) >=
(int) sizeof(hs.heapbckt.filename) ||
+ snprintf(hs.heaplink.filename,
sizeof(hs.heaplink.filename), "%s.thshjnl%x", nme, (unsigned) MT_getpid()) >=
(int) sizeof(hs.heaplink.filename) ||
+ snprintf(hs.heapbckt.filename,
sizeof(hs.heapbckt.filename), "%s.thshjnb%x", nme, (unsigned) MT_getpid()) >=
(int) sizeof(hs.heapbckt.filename) ||
HASHnew(&hs, bi.type, ci.ncand, mask, BUN_NONE, false) !=
GDK_SUCCEED) {
GDKerror("cannot allocate hash table\n");
HEAPfree(&hs.heaplink, true);
diff --git a/gdk/gdk_posix.c b/gdk/gdk_posix.c
--- a/gdk/gdk_posix.c
+++ b/gdk/gdk_posix.c
@@ -301,22 +301,17 @@ MT_getrss(void)
/* get RSS on Linux */
int fd;
- fd = open("/proc/self/stat", O_RDONLY | O_CLOEXEC);
+ fd = open("/proc/self/statm", O_RDONLY | O_CLOEXEC);
if (fd >= 0) {
- char buf[1024], *r = buf;
- ssize_t i, sz = read(fd, buf, 1024);
+ char buf[1024];
+ ssize_t sz = read(fd, buf, sizeof(buf) - 1);
close(fd);
if (sz > 0) {
- for (i = 0; i < 23; i++) {
- while (*r && (*r == ' ' || *r == '\t'))
- r++;
- while (*r && (*r != ' ' && *r != '\t'))
- r++;
- }
- while (*r && (*r == ' ' || *r == '\t'))
- r++;
- return ((size_t) atol(r)) * MT_pagesize();
+ buf[sz] = 0;
+ long rss;
+ if (sscanf(buf, "%*d %ld", &rss) >= 1)
+ return (size_t) rss * MT_pagesize();
}
}
#endif
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -115,7 +115,7 @@ bat BBPinsert(BAT *bn)
__attribute__((__visibility__("hidden")));
void BBPprintinfo(void)
__attribute__((__visibility__("hidden")));
-void BBPrelinquish(Thread t)
+void BBPrelinquish(void)
__attribute__((__visibility__("hidden")));
int BBPselectfarm(role_t role, int type, enum heaptype hptype)
__attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -180,8 +180,6 @@ GDKlockstatistics(int what)
#endif /* LOCK_STATS */
-static void MT_thread_setcondwait(MT_Cond *cond);
-
static struct mtthread {
struct mtthread *next;
void (*func) (void *); /* function to be called */
@@ -205,8 +203,12 @@ static struct mtthread {
pthread_t hdl;
#else
HANDLE hdl;
+ DWORD wtid;
#endif
MT_Id tid;
+ uintptr_t sp;
+ char *errbuf;
+ struct freebats freebats;
} *mtthreads = NULL;
struct mtthread mainthread = {
.threadname = "main thread",
@@ -215,7 +217,6 @@ struct mtthread mainthread = {
};
#ifdef HAVE_PTHREAD_H
static pthread_mutex_t posthread_lock = PTHREAD_MUTEX_INITIALIZER;
-static MT_Id MT_thread_id = 1;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]