diff options
| author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-11-29 00:00:00 +0000 |
|---|---|---|
| committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-11-30 15:27:15 +0500 |
| commit | e5431fa6f5505e385c6f9367260717e9c47dc2ee (patch) | |
| tree | 4cd2c2c3b225b48c8e7053432c41d7b6b6a3d5f8 /CPP/Windows/System.cpp | |
| parent | e008ce3976c087bfd21344af8f00a23cf69d4174 (diff) | |
| download | 7zip-e5431fa6f5505e385c6f9367260717e9c47dc2ee.tar.gz 7zip-e5431fa6f5505e385c6f9367260717e9c47dc2ee.tar.bz2 7zip-e5431fa6f5505e385c6f9367260717e9c47dc2ee.zip | |
24.0924.09
Diffstat (limited to 'CPP/Windows/System.cpp')
| -rw-r--r-- | CPP/Windows/System.cpp | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/CPP/Windows/System.cpp b/CPP/Windows/System.cpp index 03c8988..5fa87f3 100644 --- a/CPP/Windows/System.cpp +++ b/CPP/Windows/System.cpp | |||
| @@ -142,9 +142,9 @@ typedef BOOL (WINAPI *Func_GlobalMemoryStatusEx)(MY_LPMEMORYSTATUSEX lpBuffer); | |||
| 142 | #endif // !UNDER_CE | 142 | #endif // !UNDER_CE |
| 143 | 143 | ||
| 144 | 144 | ||
| 145 | bool GetRamSize(UInt64 &size) | 145 | bool GetRamSize(size_t &size) |
| 146 | { | 146 | { |
| 147 | size = (UInt64)(sizeof(size_t)) << 29; | 147 | size = (size_t)sizeof(size_t) << 29; |
| 148 | 148 | ||
| 149 | #ifndef UNDER_CE | 149 | #ifndef UNDER_CE |
| 150 | MY_MEMORYSTATUSEX stat; | 150 | MY_MEMORYSTATUSEX stat; |
| @@ -167,11 +167,23 @@ bool GetRamSize(UInt64 &size) | |||
| 167 | "GlobalMemoryStatusEx"); | 167 | "GlobalMemoryStatusEx"); |
| 168 | if (fn && fn(&stat)) | 168 | if (fn && fn(&stat)) |
| 169 | { | 169 | { |
| 170 | size = MyMin(stat.ullTotalVirtual, stat.ullTotalPhys); | 170 | // (MY_MEMORYSTATUSEX::ullTotalVirtual) < 4 GiB in 32-bit mode |
| 171 | size_t size2 = (size_t)0 - 1; | ||
| 172 | if (size2 > stat.ullTotalPhys) | ||
| 173 | size2 = (size_t)stat.ullTotalPhys; | ||
| 174 | if (size2 > stat.ullTotalVirtual) | ||
| 175 | size2 = (size_t)stat.ullTotalVirtual; | ||
| 176 | size = size2; | ||
| 171 | return true; | 177 | return true; |
| 172 | } | 178 | } |
| 173 | #endif | 179 | #endif |
| 174 | 180 | ||
| 181 | // On computers with more than 4 GB of memory: | ||
| 182 | // new docs : GlobalMemoryStatus can report (-1) value to indicate an overflow. | ||
| 183 | // some old docs : GlobalMemoryStatus can report (modulo 4 GiB) value. | ||
| 184 | // (for example, if 5 GB total memory, it could report 1 GB). | ||
| 185 | // We don't want to get (modulo 4 GiB) value. | ||
| 186 | // So we use GlobalMemoryStatusEx() instead. | ||
| 175 | { | 187 | { |
| 176 | MEMORYSTATUS stat2; | 188 | MEMORYSTATUS stat2; |
| 177 | stat2.dwLength = sizeof(stat2); | 189 | stat2.dwLength = sizeof(stat2); |
| @@ -187,9 +199,11 @@ bool GetRamSize(UInt64 &size) | |||
| 187 | // POSIX | 199 | // POSIX |
| 188 | // #include <stdio.h> | 200 | // #include <stdio.h> |
| 189 | 201 | ||
| 190 | bool GetRamSize(UInt64 &size) | 202 | bool GetRamSize(size_t &size) |
| 191 | { | 203 | { |
| 192 | size = (UInt64)(sizeof(size_t)) << 29; | 204 | UInt64 size64; |
| 205 | size = (size_t)sizeof(size_t) << 29; | ||
| 206 | size64 = size; | ||
| 193 | 207 | ||
| 194 | #if defined(__APPLE__) || defined(__DragonFly__) || \ | 208 | #if defined(__APPLE__) || defined(__DragonFly__) || \ |
| 195 | defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) | 209 | defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) |
| @@ -215,7 +229,7 @@ bool GetRamSize(UInt64 &size) | |||
| 215 | // we use strict check (size_sys == sizeof(val)) for returned value | 229 | // we use strict check (size_sys == sizeof(val)) for returned value |
| 216 | // because big-endian encoding is possible: | 230 | // because big-endian encoding is possible: |
| 217 | if (res == 0 && size_sys == sizeof(val) && val) | 231 | if (res == 0 && size_sys == sizeof(val) && val) |
| 218 | size = val; | 232 | size64 = val; |
| 219 | else | 233 | else |
| 220 | { | 234 | { |
| 221 | uint32_t val32 = 0; | 235 | uint32_t val32 = 0; |
| @@ -223,12 +237,12 @@ bool GetRamSize(UInt64 &size) | |||
| 223 | res = sysctl(mib, 2, &val32, &size_sys, NULL, 0); | 237 | res = sysctl(mib, 2, &val32, &size_sys, NULL, 0); |
| 224 | // printf("\n sysctl res=%d val=%llx size_sys = %d, %d\n", res, (long long int)val32, (int)size_sys, errno); | 238 | // printf("\n sysctl res=%d val=%llx size_sys = %d, %d\n", res, (long long int)val32, (int)size_sys, errno); |
| 225 | if (res == 0 && size_sys == sizeof(val32) && val32) | 239 | if (res == 0 && size_sys == sizeof(val32) && val32) |
| 226 | size = val32; | 240 | size64 = val32; |
| 227 | } | 241 | } |
| 228 | 242 | ||
| 229 | #elif defined(_AIX) | 243 | #elif defined(_AIX) |
| 230 | #if defined(_SC_AIX_REALMEM) // AIX | 244 | #if defined(_SC_AIX_REALMEM) // AIX |
| 231 | size = (UInt64)sysconf(_SC_AIX_REALMEM) * 1024; | 245 | size64 = (UInt64)sysconf(_SC_AIX_REALMEM) * 1024; |
| 232 | #endif | 246 | #endif |
| 233 | #elif 0 || defined(__sun) | 247 | #elif 0 || defined(__sun) |
| 234 | #if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) | 248 | #if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) |
| @@ -240,7 +254,7 @@ bool GetRamSize(UInt64 &size) | |||
| 240 | // printf("\n_SC_PHYS_PAGES (hex) = %lx", (unsigned long)phys_pages); | 254 | // printf("\n_SC_PHYS_PAGES (hex) = %lx", (unsigned long)phys_pages); |
| 241 | // printf("\n_SC_PAGESIZE = %lu\n", (unsigned long)page_size); | 255 | // printf("\n_SC_PAGESIZE = %lu\n", (unsigned long)page_size); |
| 242 | if (phys_pages != -1 && page_size != -1) | 256 | if (phys_pages != -1 && page_size != -1) |
| 243 | size = (UInt64)(Int64)phys_pages * (UInt64)(Int64)page_size; | 257 | size64 = (UInt64)(Int64)phys_pages * (UInt64)(Int64)page_size; |
| 244 | } | 258 | } |
| 245 | #endif | 259 | #endif |
| 246 | #elif defined(__gnu_hurd__) | 260 | #elif defined(__gnu_hurd__) |
| @@ -253,7 +267,7 @@ bool GetRamSize(UInt64 &size) | |||
| 253 | struct sysinfo info; | 267 | struct sysinfo info; |
| 254 | if (::sysinfo(&info) != 0) | 268 | if (::sysinfo(&info) != 0) |
| 255 | return false; | 269 | return false; |
| 256 | size = (UInt64)info.mem_unit * info.totalram; | 270 | size64 = (UInt64)info.mem_unit * info.totalram; |
| 257 | /* | 271 | /* |
| 258 | printf("\n mem_unit = %lld", (UInt64)info.mem_unit); | 272 | printf("\n mem_unit = %lld", (UInt64)info.mem_unit); |
| 259 | printf("\n totalram = %lld", (UInt64)info.totalram); | 273 | printf("\n totalram = %lld", (UInt64)info.totalram); |
| @@ -262,10 +276,9 @@ bool GetRamSize(UInt64 &size) | |||
| 262 | 276 | ||
| 263 | #endif | 277 | #endif |
| 264 | 278 | ||
| 265 | const UInt64 kLimit = (UInt64)1 << (sizeof(size_t) * 8 - 1); | 279 | size = (size_t)1 << (sizeof(size_t) * 8 - 1); |
| 266 | if (size > kLimit) | 280 | if (size > size64) |
| 267 | size = kLimit; | 281 | size = (size_t)size64; |
| 268 | |||
| 269 | return true; | 282 | return true; |
| 270 | } | 283 | } |
| 271 | 284 | ||
