Changeset: dac7436a48e7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dac7436a48e7
Modified Files:
        gdk/gdk_utils.c
        tools/mserver/mserver5.c
Branch: default
Log Message:

Merge with Mar2025 branch.


diffs (229 lines):

diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -84,6 +84,8 @@ function(monetdb_configure_defines)
   check_symbol_exists("strerror_r" "string.h" HAVE_STRERROR_R)
   check_function_exists("lockf" HAVE_LOCKF)
   check_symbol_exists("madvise" "sys/mman.h" HAVE_MADVISE)
+  check_function_exists("malloc_info" HAVE_MALLOC_INFO)
+  check_function_exists("mallinfo2" HAVE_MALLINFO2)
   check_symbol_exists("mremap" "sys/mman.h" HAVE_MREMAP)
   check_function_exists("nanosleep" HAVE_NANOSLEEP)
   check_function_exists("nl_langinfo" HAVE_NL_LANGINFO)
@@ -145,6 +147,16 @@ macro(monetdb_macro_variables)
   set(HAVE_RTREE ${RTREE_FOUND})
   set(HAVE_OPENSSL ${OPENSSL_FOUND})
 
+  if(MALLOC_FOUND)
+    if(${WITH_MALLOC} STREQUAL "jemalloc")
+      set(WITH_JEMALLOC 1)
+    elseif(${WITH_MALLOC} STREQUAL "mimalloc")
+      set(WITH_MIMALLOC 1)
+    elseif(${WITH_MALLOC} STREQUAL "tcmalloc")
+      set(WITH_TCMALLOC 1)
+    endif()
+  endif()
+
   if(PY3INTEGRATION)
     set(HAVE_LIBPY3 "${Python3_NumPy_FOUND}")
     set(PY3VER "${Python3_VERSION_MINOR}")
diff --git a/gdk/CMakeLists.txt b/gdk/CMakeLists.txt
--- a/gdk/CMakeLists.txt
+++ b/gdk/CMakeLists.txt
@@ -118,7 +118,8 @@ target_link_libraries(bat
   $<$<PLATFORM_ID:Windows>:ws2_32>
   $<$<BOOL:${KVM_FOUND}>:KVM::KVM>
   ${CMAKE_DL_LIBS}
-  Threads::Threads)
+  Threads::Threads
+  $<$<BOOL:${MALLOC_FOUND}>:Malloc::Malloc>)
 
 # This definition is also used in Linux
 target_compile_definitions(bat
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1315,7 +1315,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                continue;
                        }
 
-                       bool isnil = atomcmp(new, nil) == 0;
+                       bool isnil = !ni.nonil && atomcmp(new, nil) == 0;
                        anynil |= isnil;
                        MT_lock_set(&b->theaplock);
                        if (old == NULL ||
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -2027,6 +2027,22 @@ GDKprintinfo(void)
        printf("SIGUSR1 info start\n");
        printf("Virtual memory allocated: %zu, of which %zu with malloc\n",
               vmallocated + allocated, allocated);
+#ifdef WITH_MALLOC
+#ifdef WITH_JEMALLOC
+       size_t jeallocated = 0, jeactive = 0, jemapped = 0, jeresident = 0, 
jeretained = 0;
+       if (mallctl("stats.allocated", &jeallocated, 
&(size_t){sizeof(jeallocated)}, NULL, 0) == 0 &&
+           mallctl("stats.active", &jeactive, &(size_t){sizeof(jeactive)}, 
NULL, 0) == 0 &&
+           mallctl("stats.mapped", &jemapped, &(size_t){sizeof(jemapped)}, 
NULL, 0) == 0 &&
+           mallctl("stats.resident", &jeresident, 
&(size_t){sizeof(jeresident)}, NULL, 0) == 0 &&
+           mallctl("stats.retained", &jeretained, 
&(size_t){sizeof(jeretained)}, NULL, 0) == 0)
+               printf("JEmalloc: allocated %zu, active %zu, mapped %zu, 
resident %zu, retained %zu\n", jeallocated, jeactive, jemapped, jeresident, 
jeretained);
+#endif
+#elif defined(HAVE_MALLINFO2)
+       struct mallinfo2 mi = mallinfo2();
+       printf("mallinfo: arena %zu, ordblks %zu, smblks %zu, hblks %zu, hblkhd 
%zu, fsmblks %zu, uordblks %zu, fordblks %zu, keepcost %zu\n",
+              mi.arena, mi.ordblks, mi.smblks, mi.hblks, mi.hblkhd, 
mi.fsmblks, mi.uordblks, mi.fordblks, mi.keepcost);
+       printf("   total allocated (arena+hblkhd): %zu\n", mi.arena + 
mi.hblkhd);
+#endif
        printf("gdk_vm_maxsize: %zu, gdk_mem_maxsize: %zu\n",
               GDK_vm_maxsize, GDK_mem_maxsize);
        printf("gdk_mmap_minsize_persistent %zu, gdk_mmap_minsize_transient 
%zu\n",
diff --git a/monetdb5/mal/CMakeLists.txt b/monetdb5/mal/CMakeLists.txt
--- a/monetdb5/mal/CMakeLists.txt
+++ b/monetdb5/mal/CMakeLists.txt
@@ -82,7 +82,8 @@ target_link_libraries(mal
   mutils
   stream
   mapi
-  bat)
+  bat
+  $<$<BOOL:${MALLOC_FOUND}>:Malloc::Malloc>)
 
 set_target_properties(mal
   PROPERTIES
diff --git a/monetdb_config.h.in b/monetdb_config.h.in
--- a/monetdb_config.h.in
+++ b/monetdb_config.h.in
@@ -141,6 +141,8 @@
 #cmakedefine HAVE_STRERROR_R 1
 #cmakedefine HAVE_LOCKF 1
 #cmakedefine HAVE_MADVISE  1
+#cmakedefine HAVE_MALLINFO2 1
+#cmakedefine HAVE_MALLOC_INFO 1
 #cmakedefine HAVE_MREMAP  1
 #cmakedefine HAVE_NANOSLEEP  1
 #cmakedefine HAVE_NL_LANGINFO  1
@@ -192,6 +194,11 @@
 #cmakedefine HAVE_LIBPY3 1
 #cmakedefine HAVE_OPENSSL 1
 
+#cmakedefine WITH_JEMALLOC 1
+#cmakedefine WITH_MIMALLOC 1
+#cmakedefine WITH_TCMALLOC 1
+#cmakedefine WITH_MALLOC "@WITH_MALLOC@"
+
 // #cmakedefine SOCKET_LIBRARIES
 #cmakedefine HAVE_GETADDRINFO 1
 #cmakedefine HAVE_CUDF 1
@@ -474,4 +481,15 @@ gmtime_r(const time_t *restrict timep, s
                __attribute__((__constructor__)) static void f(void)
 #endif
 
+#ifdef WITH_MALLOC
+#ifdef WITH_JEMALLOC
+#include <jemalloc/jemalloc.h>
+#endif
+#ifdef WITH_MIMALLOC
+#include <mimalloc.h>
+#endif
+#elif defined(HAVE_MALLOC_INFO)
+#include <malloc.h>
+#endif
+
 #endif /* MT_SEEN_MONETDB_CONFIG_H */
diff --git a/tools/mserver/CMakeLists.txt b/tools/mserver/CMakeLists.txt
--- a/tools/mserver/CMakeLists.txt
+++ b/tools/mserver/CMakeLists.txt
@@ -54,7 +54,8 @@ target_link_libraries(mserver5
   $<$<PLATFORM_ID:Windows>:${GETOPT_LIB}>
   $<$<BOOL:${PCRE_FOUND}>:PCRE::PCRE>
   $<$<BOOL:${MALLOC_FOUND}>:Malloc::Malloc>
-  Threads::Threads)
+  Threads::Threads
+  $<$<BOOL:${MALLOC_FOUND}>:Malloc::Malloc>)
 
 if(TESTING)
   add_executable(shutdowntest)
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -246,6 +246,7 @@ emergencyBreakpoint(void)
 
 static volatile sig_atomic_t interrupted = 0;
 static volatile sig_atomic_t usr1_interrupted = 0;
+static volatile sig_atomic_t usr2_interrupted = 0;
 
 static void
 usr1trigger(void)
@@ -274,6 +275,29 @@ handler_usr1(int sig)
        (void) sig;
        usr1trigger();
 }
+static void
+handler_usr2(int sig)
+{
+       (void) sig;
+       usr2_interrupted = 1;
+}
+#endif
+
+#ifdef WITH_JEMALLOC
+static void
+writecb(void *data, const char *msg)
+{
+       (void) data;
+       printf("%s\n", msg);
+}
+#endif
+#ifdef WITH_MIMALLOC
+static void
+writecb(const char *msg, void *arg)
+{
+       (void) arg;
+       printf("mimalloc stats\n%s\nmimalloc stats end\n", msg);
+}
 #endif
 
 int
@@ -820,6 +844,12 @@ main(int argc, char **av)
                if (sigaction(SIGUSR1, &sa, NULL) == -1) {
                        fprintf(stderr, "!unable to create signal handler for 
SIGUSR1\n");
                }
+               (void) sigemptyset(&sa.sa_mask);
+               sa.sa_flags = 0;
+               sa.sa_handler = handler_usr2;
+               if (sigaction(SIGUSR2, &sa, NULL) == -1) {
+                       fprintf(stderr, "!unable to create signal handler for 
SIGUSR2\n");
+               }
        }
 #else
 #ifdef _MSC_VER
@@ -836,6 +866,8 @@ main(int argc, char **av)
                fprintf(stderr, "!unable to create signal handlers\n");
        if (signal(SIGUSR1, handler_usr1) == SIG_ERR)
                fprintf(stderr, "!unable to create signal handler for 
SIGUSR1\n");
+       if (signal(SIGUSR2, handler_usr2) == SIG_ERR)
+               fprintf(stderr, "!unable to create signal handler for 
SIGUSR2\n");
 #endif
 #endif
 
@@ -941,6 +973,19 @@ main(int argc, char **av)
                        GDKprintinfo();
                        fflush(stdout);
                }
+               if (usr2_interrupted) {
+                       usr2_interrupted = 0;
+#ifdef WITH_MALLOC
+#ifdef WITH_JEMALLOC
+                       malloc_stats_print(writecb, NULL, "");
+#endif
+#ifdef WITH_MIMALLOC
+                       mi_stats_print_out(writecb, NULL);
+#endif
+#elif defined(HAVE_MALLOC_INFO)
+                       malloc_info(0, stdout);
+#endif
+               }
                MT_sleep_ms(100);               /* pause(), except for 
sys.shutdown() */
        }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to