Changeset: 2c3127fd4002 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2c3127fd4002
Modified Files:
        gdk/gdk_utils.c
Branch: Nov2019
Log Message:

Merge with Apr2019 branch.


diffs (111 lines):

diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -402,39 +402,76 @@ MT_init(void)
 # error "don't know how to get the amount of physical memory for your OS"
 #endif
 
-#ifndef WIN32
+#ifdef __linux__
        /* limit values to whatever cgroups gives us */
-       FILE *f;
-       /* limit of memory usage */
-       f = fopen("/sys/fs/cgroup/memory/memory.limit_in_bytes", "r");
-       if (f != NULL) {
-               uint64_t mem;
-               if (fscanf(f, "%" SCNu64, &mem) == 1
-                   && mem < (uint64_t) _MT_pagesize * _MT_npages) {
-                       _MT_npages = (size_t) (mem / _MT_pagesize);
+       FILE *fc;
+       fc = fopen("/proc/self/cgroup", "r");
+       if (fc != NULL) {
+               char buf[1024];
+               while (fgets(buf, (int) sizeof(buf), fc) != NULL) {
+                       char *p, *q;
+                       p = strchr(buf, ':');
+                       if (p == NULL)
+                               break;
+                       q = p + 1;
+                       p = strchr(q, ':');
+                       if (p == NULL)
+                               break;
+                       *p++ = 0;
+                       if (strstr(q, "memory") != NULL) {
+                               char pth[1024];
+                               FILE *f;
+                               q = strchr(p, '\n');
+                               if (q == NULL)
+                                       break;
+                               *q = 0;
+                               q = stpconcat(pth, "/sys/fs/cgroup/memory",
+                                             p, NULL);
+                               /* sometimes the path in
+                                * /proc/self/cgroup ends in "/" (or
+                                * actually, is "/"); in all other
+                                * cases add one */
+                               if (q[-1] != '/')
+                                       *q++ = '/';
+                               /* limit of memory usage */
+                               strcpy(q, "memory.limit_in_bytes");
+                               f = fopen(pth, "r");
+                               if (f != NULL) {
+                                       uint64_t mem;
+                                       if (fscanf(f, "%" SCNu64, &mem) == 1
+                                           && mem < (uint64_t) _MT_pagesize * 
_MT_npages) {
+                                               _MT_npages = (size_t) (mem / 
_MT_pagesize);
+                                       }
+                                       fclose(f);
+                               }
+                               /* soft limit of memory usage */
+                               strcpy(q, "memory.soft_limit_in_bytes");
+                               f = fopen(pth, "r");
+                               if (f != NULL) {
+                                       uint64_t mem;
+                                       if (fscanf(f, "%" SCNu64, &mem) == 1
+                                           && mem < (uint64_t) _MT_pagesize * 
_MT_npages) {
+                                               _MT_npages = (size_t) (mem / 
_MT_pagesize);
+                                       }
+                                       fclose(f);
+                               }
+                               /* limit of memory+swap usage
+                                * we use this as maximum virtual memory size */
+                               strcpy(q, "memory.memsw.limit_in_bytes");
+                               f = fopen(pth, "r");
+                               if (f != NULL) {
+                                       uint64_t mem;
+                                       if (fscanf(f, "%" SCNu64, &mem) == 1
+                                           && mem < (uint64_t) GDK_vm_maxsize) 
{
+                                               GDK_vm_maxsize = (size_t) mem;
+                                       }
+                                       fclose(f);
+                               }
+                               break;
+
+                       }
                }
-               fclose(f);
-       }
-       /* soft limit of memory usage */
-       f = fopen("/sys/fs/cgroup/memory/memory.soft_limit_in_bytes", "r");
-       if (f != NULL) {
-               uint64_t mem;
-               if (fscanf(f, "%" SCNu64, &mem) == 1
-                   && mem < (uint64_t) _MT_pagesize * _MT_npages) {
-                       _MT_npages = (size_t) (mem / _MT_pagesize);
-               }
-               fclose(f);
-       }
-       /* limit of memory+swap usage
-        * we use this as maximum virtual memory size */
-       f = fopen("/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes", "r");
-       if (f != NULL) {
-               uint64_t mem;
-               if (fscanf(f, "%" SCNu64, &mem) == 1
-                   && mem < (uint64_t) GDK_vm_maxsize) {
-                       GDK_vm_maxsize = (size_t) mem;
-               }
-               fclose(f);
+               fclose(fc);
        }
 #endif
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to