7 statex.dwLength =
sizeof(statex);
8 if (!GlobalMemoryStatusEx(&statex))
10 return (
size_t)statex.ullAvailPhys;
12#elif defined(__APPLE__) && defined(__MACH__)
13 mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
14 vm_statistics_data_t vmstat;
15 if (host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmstat, &count) != KERN_SUCCESS)
18 vm_size_t page_size = 0;
19 if (host_page_size(mach_host_self(), &page_size) != KERN_SUCCESS || page_size == 0)
22 natural_t available_pages = vmstat.free_count + vmstat.inactive_count;
23 return (
size_t)available_pages * (size_t)page_size;
25#elif defined(__linux__)
26 long pages = sysconf(_SC_AVPHYS_PAGES);
27 long page_size = sysconf(_SC_PAGESIZE);
28 if (pages == -1 || page_size == -1)
30 return (
size_t)pages * (size_t)page_size;
32#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
34 size_t len =
sizeof(page_size);
35 if (sysctlbyname(
"hw.pagesize", &page_size, &len, NULL, 0) != 0 || page_size == 0)
39#if defined(__OpenBSD__)
40 len =
sizeof(free_pages);
41 if (sysctlbyname(
"uvm.stats.sys.free", &free_pages, &len, NULL, 0) != 0)
44 len =
sizeof(free_pages);
45 if (sysctlbyname(
"vm.stats.vm.v_free_count", &free_pages, &len, NULL, 0) != 0)
49 return (
size_t)free_pages * (size_t)page_size;
58 char **args = (
char **)malloc((argc + 2) *
sizeof(
char *));
62 args[0] = (
char *)name;
63 for (
int i = 0; i < argc; i++)
64 args[i + 1] = argv[i];
65 args[argc + 1] = NULL;
68 int ret = (int)_spawnvp(_P_WAIT, name, (
const char *
const *)args);
82 waitpid(pid, &status, 0);
83 ret = WEXITSTATUS(status);