Skip to content

Commit 9db5194

Browse files
Use more accurate memory query on macOS. (#29)
Co-authored-by: Christian Guinard <[email protected]>
1 parent b5c3434 commit 9db5194

File tree

1 file changed

+53
-1
lines changed

1 file changed

+53
-1
lines changed

src/ParallelTestRunner.jl

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,14 +231,66 @@ function runtest(::Type{TestRecord}, f, name, init_code, color)
231231
end
232232
end
233233

234+
@static if Sys.isapple()
235+
236+
mutable struct VmStatistics64
237+
free_count::UInt32
238+
active_count::UInt32
239+
inactive_count::UInt32
240+
wire_count::UInt32
241+
zero_fill_count::UInt64
242+
reactivations::UInt64
243+
pageins::UInt64
244+
pageouts::UInt64
245+
faults::UInt64
246+
cow_faults::UInt64
247+
lookups::UInt64
248+
hits::UInt64
249+
purges::UInt64
250+
purgeable_count::UInt32
251+
252+
speculative_count::UInt32
253+
254+
decompressions::UInt64
255+
compressions::UInt64
256+
swapins::UInt64
257+
swapouts::UInt64
258+
compressor_page_count::UInt32
259+
throttled_count::UInt32
260+
external_page_count::UInt32
261+
internal_page_count::UInt32
262+
total_uncompressed_pages_in_compressor::UInt64
263+
264+
VmStatistics64() = new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
265+
end
266+
267+
268+
function available_memory()
269+
vms = Ref{VmStatistics64}(VmStatistics64())
270+
mach_host_self = @ccall mach_host_self()::UInt32
271+
count = UInt32(sizeof(VmStatistics64) ÷ sizeof(Int32))
272+
ref_count = Ref(count)
273+
@ccall host_statistics64(mach_host_self::UInt32, 4::Int64, pointer_from_objref(vms[])::Ptr{Int64}, ref_count::Ref{UInt32})::Int64
274+
275+
page_size = Int(@ccall sysconf(29::UInt32)::UInt32)
276+
277+
return (Int(vms[].free_count) + Int(vms[].inactive_count)) * page_size
278+
end
279+
280+
else
281+
282+
available_memory() = Sys.free_memory()
283+
284+
end
285+
234286
# This is an internal function, not to be used by end users. The keyword
235287
# arguments are only for testing purposes.
236288
"""
237289
default_njobs()
238290
239291
Determine default number of parallel jobs.
240292
"""
241-
function default_njobs(; cpu_threads = Sys.CPU_THREADS, free_memory = Sys.free_memory())
293+
function default_njobs(; cpu_threads = Sys.CPU_THREADS, free_memory = available_memory())
242294
jobs = cpu_threads
243295
memory_jobs = Int64(free_memory) ÷ (2 * 2^30)
244296
return max(1, min(jobs, memory_jobs))

0 commit comments

Comments
 (0)