62 mach_port_t host_port = mach_host_self();
63 if (host_port == MACH_PORT_NULL)
66 vm_size_t page_size = 0;
67 host_page_size(host_port, &page_size);
69 vm_statistics_data_t vmstat;
70 mach_msg_type_number_t count = HOST_VM_INFO_COUNT;
71 kern_return_t kernReturn = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vmstat, &count);
72 if (kernReturn != KERN_SUCCESS)
75 [[maybe_unused]] int64_t used_mem = (vmstat.active_count + vmstat.inactive_count + vmstat.wire_count) * page_size;
76 int64_t free_mem = vmstat.free_count * page_size;
78#elif defined(unix) || defined(__unix) || defined(__unix__)
79 int64_t pages = sysconf(_SC_AVPHYS_PAGES);
80 int64_t page_size = sysconf(_SC_PAGESIZE);
81 if ((pages > 0) && (page_size > 0))
82 return pages * page_size;
85#elif defined(_WIN32) || defined(_WIN64)
86 MEMORYSTATUSEX status;
87 status.dwLength =
sizeof(status);
88 GlobalMemoryStatusEx(&status);
89 return status.ullAvailPhys;
91 #error Unsupported platform
138#if defined(unix) || defined(__unix) || defined(__unix__) || defined(__APPLE__)
139 int fd = open(
"/dev/random", O_RDONLY);
142 ssize_t count = read(fd, buffer, size);
145 int result = close(fd);
148#elif defined(_WIN32) || defined(_WIN64)
149 HCRYPTPROV hCryptContext;
150 if (!CryptAcquireContext(&hCryptContext, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
152 if (!CryptGenRandom(hCryptContext, (DWORD)size, (BYTE*)buffer))
154 if (!CryptReleaseContext(hCryptContext, 0))