@@ -66,9 +66,52 @@ if(NOT _32BIT)
6666 ROOTTEST_COMPILE_MACRO (testLargeCollection.cxx
6767 FIXTURES_SETUP io-io-testcoll-fixture )
6868
69+ # Memory-check script: exits 0 when enough RAM+swap is available, 77 (skip) otherwise.
70+ # RootTestDriver.cmake propagates exit code 77 from PRECMD to the test's own exit code,
71+ # and SKIP_RETURN_CODE 77 on the main test turns that into a proper CTest "Skipped".
72+ set (_memcheck_script "${CMAKE_CURRENT_BINARY_DIR } /check_mem_for_large_coll.sh" )
73+ file (WRITE ${_memcheck_script}
74+ "#!/bin/sh\n "
75+ "# Exit 77 (CTest SKIP via SKIP_RETURN_CODE) if total RAM+swap < 32 GB.\n "
76+ "# We use TOTAL (not free) because the OS reclaims cached pages on demand.\n "
77+ "THRESHOLD_KB=33554432\n "
78+ "if [ -r /proc/meminfo ]; then\n "
79+ " # Linux: use MemTotal + SwapTotal (kernel will reclaim caches as needed)\n "
80+ " RAM_KB=\$ (awk '/^MemTotal:/{print \$ 2}' /proc/meminfo)\n "
81+ " SWAP_KB=\$ (awk '/^SwapTotal:/{print \$ 2}' /proc/meminfo)\n "
82+ " RAM_KB=\$ {RAM_KB:-0}\n "
83+ " SWAP_KB=\$ {SWAP_KB:-0}\n "
84+ " TOTAL_KB=\$ (( RAM_KB + SWAP_KB ))\n "
85+ "elif [ \"\$ (uname)\" = \" Darwin\" ]; then\n "
86+ " # macOS: total physical RAM via sysctl hw.memsize (bytes -> kB)\n "
87+ " RAM_BYTES=\$ (sysctl -n hw.memsize 2>/dev/null)\n "
88+ " RAM_KB=\$ (( \$ {RAM_BYTES:-0} / 1024 ))\n "
89+ " # sysctl output: 'total = NNN.NNM used = ... free = ...'\n "
90+ " SWAP_TOTAL_MB=\$ (sysctl -n vm.swapusage 2>/dev/null | sed 's/total = \\ ([0-9.]*\\ )M.*/\\ 1/')\n "
91+ " if [ -n \"\$ SWAP_TOTAL_MB\" ]; then\n "
92+ " SWAP_KB=\$ (awk \" BEGIN{printf \\\" %d\\\" , \$ SWAP_TOTAL_MB * 1024}\" )\n "
93+ " else\n "
94+ " SWAP_KB=0\n "
95+ " fi\n "
96+ " TOTAL_KB=\$ (( RAM_KB + SWAP_KB ))\n "
97+ "else\n "
98+ " echo \" testLargeCollections memory check: unsupported OS, assuming enough memory\"\n "
99+ " exit 0\n "
100+ "fi\n "
101+ "echo \" testLargeCollections memory check: total \$ {TOTAL_KB} kB (RAM \$ {RAM_KB} + swap \$ {SWAP_KB}), need \$ {THRESHOLD_KB} kB\"\n "
102+ "if [ \"\$ TOTAL_KB\" -lt \"\$ THRESHOLD_KB\" ]; then\n "
103+ " echo \" Insufficient memory -- skipping testLargeCollections\"\n "
104+ " exit 77\n "
105+ "fi\n "
106+ "exit 0\n "
107+ )
108+ execute_process (COMMAND chmod +x ${_memcheck_script} )
109+
69110 ROOTTEST_ADD_TEST (testLargeCollections
70111 TIMEOUT 1200
71112 MACRO testLargeCollection.cxx+
72113 OUTREF testLargeCollection.ref
73- FIXTURES_REQUIRED io-io-testcoll-fixture )
114+ FIXTURES_REQUIRED io-io-testcoll-fixture
115+ PRECMD sh ${_memcheck_script}
116+ PROPERTIES "SKIP_REGULAR_EXPRESSION;ROOTTEST_SKIP" )
74117endif ()
0 commit comments