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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org