Changeset: 322e01f32648 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=322e01f32648
Modified Files:
        clients/R/Tests/dbi.R
        clients/R/Tests/dbi.stable.out
        configure.ag
        gdk/gdk_utils.c
        monetdb5/extras/rapi/rapi.R
        monetdb5/extras/rapi/rapi.c
        monetdb5/optimizer/opt_pipes.c
        sql/backends/monet5/Tests/All
Branch: default
Log Message:

Merge with Jun2016 branch.


diffs (truncated from 2216 to 300 lines):

diff --git a/clients/R/Tests/dbi.R b/clients/R/Tests/dbi.R
--- a/clients/R/Tests/dbi.R
+++ b/clients/R/Tests/dbi.R
@@ -152,7 +152,6 @@ dbWriteTable(conn,tname,mtcars,append=T,
 stopifnot(identical(as.integer(2*nrow(mtcars)),tsize(conn,tname)))
 dbRemoveTable(conn,tname)
 
-dbRemoveTable(conn,tname)
 dbWriteTable(conn,tname,mtcars,append=F,overwrite=F,insert=T)
 dbRemoveTable(conn,tname)
 
diff --git a/clients/R/Tests/dbi.stable.out b/clients/R/Tests/dbi.stable.out
--- a/clients/R/Tests/dbi.stable.out
+++ b/clients/R/Tests/dbi.stable.out
@@ -62,7 +62,6 @@ Ready.
 [1] TRUE
 [1] TRUE
 [1] TRUE
-[1] FALSE
 [1] TRUE
 [1] TRUE
 [1] TRUE
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -3393,6 +3393,9 @@ AC_SUBST(Erundir)
 Qlibdir="$libdir"
 Xlibdir="`$translatepath "$libdir"`"
 QXlibdir="`echo "$Xlibdir" | sed 's/\\\\/\\\\\\\\/g'`"
+Elibdir="`echo "$Xlibdir" | sed 's/{exec_prefix}/{prefix}/'`"
+eval "Elibdir=${Elibdir}"
+QElibdir="`echo "$Elibdir" | sed 's/\\\\/\\\\\\\\/g'`"
 AC_SUBST(Qlibdir)
 AC_SUBST(Xlibdir)
 AC_SUBST(QXlibdir)
@@ -3469,6 +3472,7 @@ AC_SUBST(QXSOURCE)
 AC_DEFINE_UNQUOTED(LOCALSTATEDIR,"$QElocalstatedir",[modifiable single-machine 
data])
 AC_DEFINE_UNQUOTED(DATA_DIR,"$QEdatadir",[read-only architecture-independent 
data])
 AC_DEFINE_UNQUOTED(BINDIR,"$QEbindir",[location where binaries are installed])
+AC_DEFINE_UNQUOTED(LIBDIR,"$QElibdir",[location where libraries are installed])
 
 dnl  On Solaris, libxml2 enables threading only when _REENTRANT, __MT__
 dnl  or _POSIX_C_SOURCE >= 199506L is defined.  The latter is only
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -421,6 +421,1056 @@ MT_init(void)
 #endif
 }
 
+/*
+ * @+ Session Initialization
+ * The interface code to the operating system is highly dependent on
+ * the processing environment. It can be filtered away with
+ * compile-time flags.  Suicide is necessary due to some system
+ * implementation errors.
+ *
+ * The kernel requires file descriptors for I/O with the user.  They
+ * are thread specific and should be obtained by a function.
+ *
+ * The arguments relevant for the kernel are extracted from the list.
+ * Their value is turned into a blanc space.
+ */
+
+#define CATNAP         50      /* time to sleep in ms for catnaps */
+
+static MT_Id GDKvmtrim_id;
+
+static void
+GDKvmtrim(void *limit)
+{
+       int highload = 0;
+       ssize_t prevmem = 0, prevrss = 0;
+
+       (void) limit;
+
+       do {
+               int t;
+               size_t rss;
+               ssize_t rssdiff, memdiff;
+               size_t cursize;
+
+               /* sleep using catnaps so we can exit in a timely fashion */
+               for (t = highload ? 500 : 5000; t > 0; t -= CATNAP) {
+                       MT_sleep_ms(CATNAP);
+                       if (GDKexiting())
+                               return;
+               }
+               rss = MT_getrss();
+               rssdiff = (ssize_t) rss - (ssize_t) prevrss;
+               cursize = GDKvm_cursize();
+               memdiff = (ssize_t) cursize - (ssize_t) prevmem;
+               MEMDEBUG fprintf(stderr, "alloc = " SZFMT " %+zd rss = " SZFMT 
" %+zd\n", cursize, memdiff, rss, rssdiff);
+               prevmem = cursize;
+               prevrss = rss;
+               if (memdiff >= 0 && rssdiff < -32 * (ssize_t) MT_pagesize()) {
+                       BBPtrim(rss);
+                       highload = 1;
+               } else {
+                       highload = 0;
+               }
+       } while (!GDKexiting());
+}
+
+static void THRinit(void);
+static void GDKlockHome(void);
+
+int
+GDKinit(opt *set, int setlen)
+{
+       char *dbpath = mo_find_option(set, setlen, "gdk_dbpath");
+       char *p;
+       opt *n;
+       int i, nlen = 0;
+       char buf[16];
+
+       /* some sanity checks (should also find if symbols are not defined) */
+       assert(sizeof(char) == SIZEOF_CHAR);
+       assert(sizeof(short) == SIZEOF_SHORT);
+       assert(sizeof(int) == SIZEOF_INT);
+       assert(sizeof(long) == SIZEOF_LONG);
+       assert(sizeof(lng) == SIZEOF_LNG);
+#ifdef HAVE_HGE
+       assert(sizeof(hge) == SIZEOF_HGE);
+#endif
+       assert(sizeof(oid) == SIZEOF_OID);
+       assert(sizeof(void *) == SIZEOF_VOID_P);
+       assert(sizeof(size_t) == SIZEOF_SIZE_T);
+       assert(sizeof(ptrdiff_t) == SIZEOF_PTRDIFF_T);
+       assert(SIZEOF_OID == SIZEOF_INT || SIZEOF_OID == SIZEOF_LNG);
+
+#ifdef NEED_MT_LOCK_INIT
+       MT_lock_init(&MT_system_lock,"MT_system_lock");
+       ATOMIC_INIT(GDKstoppedLock);
+       ATOMIC_INIT(mbyteslock);
+       MT_lock_init(&GDKnameLock, "GDKnameLock");
+       MT_lock_init(&GDKthreadLock, "GDKthreadLock");
+       MT_lock_init(&GDKtmLock, "GDKtmLock");
+#endif
+       for (i = 0; i <= BBP_BATMASK; i++) {
+               MT_lock_init(&GDKbatLock[i].swap, "GDKswapLock");
+               MT_lock_init(&GDKbatLock[i].hash, "GDKhashLock");
+               MT_lock_init(&GDKbatLock[i].imprints, "GDKimprintsLock");
+       }
+       for (i = 0; i <= BBP_THREADMASK; i++) {
+               MT_lock_init(&GDKbbpLock[i].alloc, "GDKcacheLock");
+               MT_lock_init(&GDKbbpLock[i].trim, "GDKtrimLock");
+               GDKbbpLock[i].free = 0;
+       }
+       errno = 0;
+       if (!GDKenvironment(dbpath))
+               return 0;
+
+       if ((p = mo_find_option(set, setlen, "gdk_debug")))
+               GDKdebug = strtol(p, NULL, 10);
+
+       if (mnstr_init() < 0)
+               return 0;
+       MT_init_posix();
+       THRinit();
+#ifndef NATIVE_WIN32
+       BATSIGinit();
+#endif
+#ifdef WIN32
+       (void) signal(SIGABRT, BATSIGabort);
+#ifndef __MINGW32__ // MinGW does not have these
+       _set_abort_behavior(0, _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
+       _set_error_mode(_OUT_TO_STDERR);
+#endif
+#endif
+       /* now try to lock the database */
+       GDKlockHome();
+
+       /* Mserver by default takes 80% of all memory as a default */
+       GDK_mem_maxsize = (size_t) ((double) MT_npages() * (double) 
MT_pagesize() * 0.815);
+       BBPinit();
+
+       n = (opt *) malloc(setlen * sizeof(opt));
+       for (i = 0; i < setlen; i++) {
+               int done = 0;
+               int j;
+
+               for (j = 0; j < nlen; j++) {
+                       if (strcmp(n[j].name, set[i].name) == 0) {
+                               if (n[j].kind < set[i].kind) {
+                                       n[j] = set[i];
+                               }
+                               done = 1;
+                               break;
+                       }
+               }
+               if (!done) {
+                       n[nlen] = set[i];
+                       nlen++;
+               }
+       }
+       /* check some options before creating our first BAT */
+       for (i = 0; i < nlen; i++) {
+               if (strcmp("gdk_mem_maxsize", n[i].name) == 0) {
+                       GDK_mem_maxsize = (size_t) strtoll(n[i].value, NULL, 
10);
+                       GDK_mem_maxsize = MAX(1 << 26, GDK_mem_maxsize);
+               } else if (strcmp("gdk_vm_maxsize", n[i].name) == 0) {
+                       GDK_vm_maxsize = (size_t) strtoll(n[i].value, NULL, 10);
+                       GDK_vm_maxsize = MAX(1 << 30, GDK_vm_maxsize);
+               } else if (strcmp("gdk_mmap_minsize", n[i].name) == 0) {
+                       GDK_mmap_minsize = (size_t) strtoll(n[i].value, NULL, 
10);
+               } else if (strcmp("gdk_mmap_pagesize", n[i].name) == 0) {
+                       GDK_mmap_pagesize = (size_t) strtoll(n[i].value, NULL, 
10);
+                       if (GDK_mmap_pagesize < 1 << 12 ||
+                           GDK_mmap_pagesize > 1 << 20 ||
+                           /* x & (x - 1): turn off rightmost 1 bit;
+                            * i.e. if result is zero, x is power of
+                            * two */
+                           (GDK_mmap_pagesize & (GDK_mmap_pagesize - 1)) != 0)
+                               GDKfatal("GDKinit: gdk_mmap_pagesize must be 
power of 2 between 2**12 and 2**20\n");
+               }
+       }
+
+       GDKkey = BATnew(TYPE_void, TYPE_str, 100, TRANSIENT);
+       GDKval = BATnew(TYPE_void, TYPE_str, 100, TRANSIENT);
+       if (GDKkey == NULL || GDKval == NULL) {
+               /* no cleanup necessary before GDKfatal */
+               GDKfatal("GDKinit: Could not create environment BAT");
+       }
+       BATseqbase(GDKkey,0);
+       BATkey(GDKkey, BOUND2BTRUE);
+       BATrename(GDKkey, "environment_key");
+
+       BATseqbase(GDKval,0);
+       BATkey(GDKval, BOUND2BTRUE);
+       BATrename(GDKval, "environment_val");
+
+       /* store options into environment BATs */
+       for (i = 0; i < nlen; i++)
+               GDKsetenv(n[i].name, n[i].value);
+       free(n);
+
+       GDKnr_threads = GDKgetenv_int("gdk_nr_threads", 0);
+       if (GDKnr_threads == 0)
+               GDKnr_threads = MT_check_nr_cores();
+
+       if ((p = GDKgetenv("gdk_dbpath")) != NULL &&
+           (p = strrchr(p, DIR_SEP)) != NULL) {
+               GDKsetenv("gdk_dbname", p + 1);
+#if DIR_SEP != '/'             /* on Windows look for different separator */
+       } else if ((p = GDKgetenv("gdk_dbpath")) != NULL &&
+           (p = strrchr(p, '/')) != NULL) {
+               GDKsetenv("gdk_dbname", p + 1);
+#endif
+       }
+       if (GDKgetenv("gdk_vm_maxsize") == NULL) {
+               snprintf(buf, sizeof(buf), SZFMT, GDK_vm_maxsize);
+               GDKsetenv("gdk_vm_maxsize", buf);
+       }
+       if (GDKgetenv("gdk_mem_maxsize") == NULL) {
+               snprintf(buf, sizeof(buf), SZFMT, GDK_mem_maxsize);
+               GDKsetenv("gdk_mem_maxsize", buf);
+       }
+       if (GDKgetenv("gdk_mmap_minsize") == NULL) {
+               snprintf(buf, sizeof(buf), SZFMT, GDK_mmap_minsize);
+               GDKsetenv("gdk_mmap_minsize", buf);
+       }
+       if (GDKgetenv("gdk_mmap_pagesize") == NULL) {
+               snprintf(buf, sizeof(buf), SZFMT, GDK_mmap_pagesize);
+               GDKsetenv("gdk_mmap_pagesize", buf);
+       }
+       if (GDKgetenv("monet_pid") == NULL) {
+               snprintf(buf, sizeof(buf), "%d", (int) getpid());
+               GDKsetenv("monet_pid", buf);
+       }
+
+       /* only start vmtrim thread when explicitly asked to do so or
+        * when on a 32 bit architecture and not told to not start
+        * it;
+        * see also mo_builtin_settings() in common/options/monet_options.c
+        */
+       p = mo_find_option(set, setlen, "gdk_vmtrim");
+       if (
+#if SIZEOF_VOID_P == 4
+           /* 32 bit architecture */
+           p == NULL ||        /* default is yes */
+#else
+           /* 64 bit architecture */
+           p != NULL &&        /* default is no */
+#endif
+           strcasecmp(p, "yes") == 0)
+               MT_create_thread(&GDKvmtrim_id, GDKvmtrim, &GDK_mem_maxsize,
+                                MT_THR_JOINABLE);
+
+       return 1;
+}
+
+int GDKnr_threads = 0;
+static int GDKnrofthreads;
+
+int
+GDKexiting(void)
+{
+       int stopped;
+#ifdef ATOMIC_LOCK
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to