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

Reply via email to