xref: /aosp_15_r20/external/lzma/CPP/Windows/System.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Windows/System.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
6*f6dc9357SAndroid Build Coastguard Worker #include <unistd.h>
7*f6dc9357SAndroid Build Coastguard Worker #include <limits.h>
8*f6dc9357SAndroid Build Coastguard Worker #if defined(__APPLE__) || defined(__DragonFly__) || \
9*f6dc9357SAndroid Build Coastguard Worker     defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
10*f6dc9357SAndroid Build Coastguard Worker #include <sys/sysctl.h>
11*f6dc9357SAndroid Build Coastguard Worker #else
12*f6dc9357SAndroid Build Coastguard Worker #include <sys/sysinfo.h>
13*f6dc9357SAndroid Build Coastguard Worker #endif
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "../Common/Defs.h"
17*f6dc9357SAndroid Build Coastguard Worker // #include "../Common/MyWindows.h"
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker // #include "../../C/CpuArch.h"
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker #include "System.h"
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
24*f6dc9357SAndroid Build Coastguard Worker namespace NSystem {
25*f6dc9357SAndroid Build Coastguard Worker 
26*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
27*f6dc9357SAndroid Build Coastguard Worker 
CountAffinity(DWORD_PTR mask)28*f6dc9357SAndroid Build Coastguard Worker UInt32 CountAffinity(DWORD_PTR mask)
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker   UInt32 num = 0;
31*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < sizeof(mask) * 8; i++)
32*f6dc9357SAndroid Build Coastguard Worker   {
33*f6dc9357SAndroid Build Coastguard Worker     num += (UInt32)(mask & 1);
34*f6dc9357SAndroid Build Coastguard Worker     mask >>= 1;
35*f6dc9357SAndroid Build Coastguard Worker   }
36*f6dc9357SAndroid Build Coastguard Worker   return num;
37*f6dc9357SAndroid Build Coastguard Worker }
38*f6dc9357SAndroid Build Coastguard Worker 
Get()39*f6dc9357SAndroid Build Coastguard Worker BOOL CProcessAffinity::Get()
40*f6dc9357SAndroid Build Coastguard Worker {
41*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
42*f6dc9357SAndroid Build Coastguard Worker   return GetProcessAffinityMask(GetCurrentProcess(), &processAffinityMask, &systemAffinityMask);
43*f6dc9357SAndroid Build Coastguard Worker   #else
44*f6dc9357SAndroid Build Coastguard Worker   return FALSE;
45*f6dc9357SAndroid Build Coastguard Worker   #endif
46*f6dc9357SAndroid Build Coastguard Worker }
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker 
GetNumberOfProcessors()49*f6dc9357SAndroid Build Coastguard Worker UInt32 GetNumberOfProcessors()
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker   // We need to know how many threads we can use.
52*f6dc9357SAndroid Build Coastguard Worker   // By default the process is assigned to one group.
53*f6dc9357SAndroid Build Coastguard Worker   // So we get the number of logical processors (threads)
54*f6dc9357SAndroid Build Coastguard Worker   // assigned to current process in the current group.
55*f6dc9357SAndroid Build Coastguard Worker   // Group size can be smaller than total number logical processors, for exammple, 2x36
56*f6dc9357SAndroid Build Coastguard Worker 
57*f6dc9357SAndroid Build Coastguard Worker   CProcessAffinity pa;
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker   if (pa.Get() && pa.processAffinityMask != 0)
60*f6dc9357SAndroid Build Coastguard Worker     return pa.GetNumProcessThreads();
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker   SYSTEM_INFO systemInfo;
63*f6dc9357SAndroid Build Coastguard Worker   GetSystemInfo(&systemInfo);
64*f6dc9357SAndroid Build Coastguard Worker   // the number of logical processors in the current group
65*f6dc9357SAndroid Build Coastguard Worker   return (UInt32)systemInfo.dwNumberOfProcessors;
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker #else
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker BOOL CProcessAffinity::Get()
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   numSysThreads = GetNumberOfProcessors();
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker   /*
76*f6dc9357SAndroid Build Coastguard Worker   numSysThreads = 8;
77*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < numSysThreads; i++)
78*f6dc9357SAndroid Build Coastguard Worker     CpuSet_Set(&cpu_set, i);
79*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
80*f6dc9357SAndroid Build Coastguard Worker   */
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_AFFINITY_SUPPORTED
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker   // numSysThreads = sysconf(_SC_NPROCESSORS_ONLN); // The number of processors currently online
85*f6dc9357SAndroid Build Coastguard Worker   if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) != 0)
86*f6dc9357SAndroid Build Coastguard Worker     return FALSE;
87*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   #else
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker   // cpu_set = ((CCpuSet)1 << (numSysThreads)) - 1;
92*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
93*f6dc9357SAndroid Build Coastguard Worker   // errno = ENOSYS;
94*f6dc9357SAndroid Build Coastguard Worker   // return FALSE;
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker   #endif
97*f6dc9357SAndroid Build Coastguard Worker }
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker UInt32 GetNumberOfProcessors()
100*f6dc9357SAndroid Build Coastguard Worker {
101*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_ST
102*f6dc9357SAndroid Build Coastguard Worker   long n = sysconf(_SC_NPROCESSORS_CONF);  // The number of processors configured
103*f6dc9357SAndroid Build Coastguard Worker   if (n < 1)
104*f6dc9357SAndroid Build Coastguard Worker     n = 1;
105*f6dc9357SAndroid Build Coastguard Worker   return (UInt32)n;
106*f6dc9357SAndroid Build Coastguard Worker   #else
107*f6dc9357SAndroid Build Coastguard Worker   return 1;
108*f6dc9357SAndroid Build Coastguard Worker   #endif
109*f6dc9357SAndroid Build Coastguard Worker }
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker #endif
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
117*f6dc9357SAndroid Build Coastguard Worker 
118*f6dc9357SAndroid Build Coastguard Worker #if !defined(_WIN64) && \
119*f6dc9357SAndroid Build Coastguard Worker   (defined(__MINGW32_VERSION) || defined(Z7_OLD_WIN_SDK))
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker typedef struct {
122*f6dc9357SAndroid Build Coastguard Worker   DWORD dwLength;
123*f6dc9357SAndroid Build Coastguard Worker   DWORD dwMemoryLoad;
124*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullTotalPhys;
125*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullAvailPhys;
126*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullTotalPageFile;
127*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullAvailPageFile;
128*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullTotalVirtual;
129*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullAvailVirtual;
130*f6dc9357SAndroid Build Coastguard Worker   DWORDLONG ullAvailExtendedVirtual;
131*f6dc9357SAndroid Build Coastguard Worker } MY_MEMORYSTATUSEX, *MY_LPMEMORYSTATUSEX;
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker #else
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker #define MY_MEMORYSTATUSEX MEMORYSTATUSEX
136*f6dc9357SAndroid Build Coastguard Worker #define MY_LPMEMORYSTATUSEX LPMEMORYSTATUSEX
137*f6dc9357SAndroid Build Coastguard Worker 
138*f6dc9357SAndroid Build Coastguard Worker #endif
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker typedef BOOL (WINAPI *Func_GlobalMemoryStatusEx)(MY_LPMEMORYSTATUSEX lpBuffer);
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker #endif // !UNDER_CE
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker 
GetRamSize(size_t & size)145*f6dc9357SAndroid Build Coastguard Worker bool GetRamSize(size_t &size)
146*f6dc9357SAndroid Build Coastguard Worker {
147*f6dc9357SAndroid Build Coastguard Worker   size = (size_t)sizeof(size_t) << 29;
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
150*f6dc9357SAndroid Build Coastguard Worker     MY_MEMORYSTATUSEX stat;
151*f6dc9357SAndroid Build Coastguard Worker     stat.dwLength = sizeof(stat);
152*f6dc9357SAndroid Build Coastguard Worker   #endif
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN64
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker     if (!::GlobalMemoryStatusEx(&stat))
157*f6dc9357SAndroid Build Coastguard Worker       return false;
158*f6dc9357SAndroid Build Coastguard Worker     size = MyMin(stat.ullTotalVirtual, stat.ullTotalPhys);
159*f6dc9357SAndroid Build Coastguard Worker     return true;
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker   #else
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker     #ifndef UNDER_CE
164*f6dc9357SAndroid Build Coastguard Worker       const
165*f6dc9357SAndroid Build Coastguard Worker       Func_GlobalMemoryStatusEx fn = Z7_GET_PROC_ADDRESS(
166*f6dc9357SAndroid Build Coastguard Worker       Func_GlobalMemoryStatusEx, ::GetModuleHandleA("kernel32.dll"),
167*f6dc9357SAndroid Build Coastguard Worker           "GlobalMemoryStatusEx");
168*f6dc9357SAndroid Build Coastguard Worker       if (fn && fn(&stat))
169*f6dc9357SAndroid Build Coastguard Worker       {
170*f6dc9357SAndroid Build Coastguard Worker         // (MY_MEMORYSTATUSEX::ullTotalVirtual) < 4 GiB in 32-bit mode
171*f6dc9357SAndroid Build Coastguard Worker         size_t size2 = (size_t)0 - 1;
172*f6dc9357SAndroid Build Coastguard Worker         if (size2 > stat.ullTotalPhys)
173*f6dc9357SAndroid Build Coastguard Worker             size2 = (size_t)stat.ullTotalPhys;
174*f6dc9357SAndroid Build Coastguard Worker         if (size2 > stat.ullTotalVirtual)
175*f6dc9357SAndroid Build Coastguard Worker             size2 = (size_t)stat.ullTotalVirtual;
176*f6dc9357SAndroid Build Coastguard Worker         size = size2;
177*f6dc9357SAndroid Build Coastguard Worker         return true;
178*f6dc9357SAndroid Build Coastguard Worker       }
179*f6dc9357SAndroid Build Coastguard Worker     #endif
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker     // On computers with more than 4 GB of memory:
182*f6dc9357SAndroid Build Coastguard Worker     //   new docs  : GlobalMemoryStatus can report (-1) value to indicate an overflow.
183*f6dc9357SAndroid Build Coastguard Worker     //   some old docs : GlobalMemoryStatus can report (modulo 4 GiB) value.
184*f6dc9357SAndroid Build Coastguard Worker     //                   (for example, if 5 GB total memory, it could report 1 GB).
185*f6dc9357SAndroid Build Coastguard Worker     // We don't want to get (modulo 4 GiB) value.
186*f6dc9357SAndroid Build Coastguard Worker     // So we use GlobalMemoryStatusEx() instead.
187*f6dc9357SAndroid Build Coastguard Worker     {
188*f6dc9357SAndroid Build Coastguard Worker       MEMORYSTATUS stat2;
189*f6dc9357SAndroid Build Coastguard Worker       stat2.dwLength = sizeof(stat2);
190*f6dc9357SAndroid Build Coastguard Worker       ::GlobalMemoryStatus(&stat2);
191*f6dc9357SAndroid Build Coastguard Worker       size = MyMin(stat2.dwTotalVirtual, stat2.dwTotalPhys);
192*f6dc9357SAndroid Build Coastguard Worker       return true;
193*f6dc9357SAndroid Build Coastguard Worker     }
194*f6dc9357SAndroid Build Coastguard Worker   #endif
195*f6dc9357SAndroid Build Coastguard Worker }
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker #else
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker // POSIX
200*f6dc9357SAndroid Build Coastguard Worker // #include <stdio.h>
201*f6dc9357SAndroid Build Coastguard Worker 
GetRamSize(size_t & size)202*f6dc9357SAndroid Build Coastguard Worker bool GetRamSize(size_t &size)
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker   UInt64 size64;
205*f6dc9357SAndroid Build Coastguard Worker   size = (size_t)sizeof(size_t) << 29;
206*f6dc9357SAndroid Build Coastguard Worker   size64 = size;
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker #if defined(__APPLE__) || defined(__DragonFly__) || \
209*f6dc9357SAndroid Build Coastguard Worker     defined(BSD) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker     uint64_t val = 0;
212*f6dc9357SAndroid Build Coastguard Worker     int mib[2];
213*f6dc9357SAndroid Build Coastguard Worker     mib[0] = CTL_HW;
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker     #ifdef HW_MEMSIZE
216*f6dc9357SAndroid Build Coastguard Worker       mib[1] = HW_MEMSIZE;
217*f6dc9357SAndroid Build Coastguard Worker       // printf("\n sysctl HW_MEMSIZE");
218*f6dc9357SAndroid Build Coastguard Worker     #elif defined(HW_PHYSMEM64)
219*f6dc9357SAndroid Build Coastguard Worker       mib[1] = HW_PHYSMEM64;
220*f6dc9357SAndroid Build Coastguard Worker       // printf("\n sysctl HW_PHYSMEM64");
221*f6dc9357SAndroid Build Coastguard Worker     #else
222*f6dc9357SAndroid Build Coastguard Worker       mib[1] = HW_PHYSMEM;
223*f6dc9357SAndroid Build Coastguard Worker       // printf("\n sysctl HW_PHYSMEM");
224*f6dc9357SAndroid Build Coastguard Worker     #endif
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker     size_t size_sys = sizeof(val);
227*f6dc9357SAndroid Build Coastguard Worker     int res = sysctl(mib, 2, &val, &size_sys, NULL, 0);
228*f6dc9357SAndroid Build Coastguard Worker     // printf("\n sysctl res=%d val=%llx size_sys = %d, %d\n", res, (long long int)val, (int)size_sys, errno);
229*f6dc9357SAndroid Build Coastguard Worker     // we use strict check (size_sys == sizeof(val)) for returned value
230*f6dc9357SAndroid Build Coastguard Worker     // because big-endian encoding is possible:
231*f6dc9357SAndroid Build Coastguard Worker     if (res == 0 && size_sys == sizeof(val) && val)
232*f6dc9357SAndroid Build Coastguard Worker       size64 = val;
233*f6dc9357SAndroid Build Coastguard Worker     else
234*f6dc9357SAndroid Build Coastguard Worker     {
235*f6dc9357SAndroid Build Coastguard Worker       uint32_t val32 = 0;
236*f6dc9357SAndroid Build Coastguard Worker       size_sys = sizeof(val32);
237*f6dc9357SAndroid Build Coastguard Worker       res = sysctl(mib, 2, &val32, &size_sys, NULL, 0);
238*f6dc9357SAndroid Build Coastguard Worker       // printf("\n sysctl res=%d val=%llx size_sys = %d, %d\n", res, (long long int)val32, (int)size_sys, errno);
239*f6dc9357SAndroid Build Coastguard Worker       if (res == 0 && size_sys == sizeof(val32) && val32)
240*f6dc9357SAndroid Build Coastguard Worker         size64 = val32;
241*f6dc9357SAndroid Build Coastguard Worker     }
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker   #elif defined(_AIX)
244*f6dc9357SAndroid Build Coastguard Worker     #if defined(_SC_AIX_REALMEM) // AIX
245*f6dc9357SAndroid Build Coastguard Worker       size64 = (UInt64)sysconf(_SC_AIX_REALMEM) * 1024;
246*f6dc9357SAndroid Build Coastguard Worker     #endif
247*f6dc9357SAndroid Build Coastguard Worker   #elif 0 || defined(__sun)
248*f6dc9357SAndroid Build Coastguard Worker     #if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
249*f6dc9357SAndroid Build Coastguard Worker     // FreeBSD, Linux, OpenBSD, and Solaris.
250*f6dc9357SAndroid Build Coastguard Worker     {
251*f6dc9357SAndroid Build Coastguard Worker       const long phys_pages = sysconf(_SC_PHYS_PAGES);
252*f6dc9357SAndroid Build Coastguard Worker       const long page_size = sysconf(_SC_PAGESIZE);
253*f6dc9357SAndroid Build Coastguard Worker       // #pragma message("GetRamSize : sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE)")
254*f6dc9357SAndroid Build Coastguard Worker       // printf("\n_SC_PHYS_PAGES (hex) = %lx", (unsigned long)phys_pages);
255*f6dc9357SAndroid Build Coastguard Worker       // printf("\n_SC_PAGESIZE = %lu\n", (unsigned long)page_size);
256*f6dc9357SAndroid Build Coastguard Worker       if (phys_pages != -1 && page_size != -1)
257*f6dc9357SAndroid Build Coastguard Worker         size64 = (UInt64)(Int64)phys_pages * (UInt64)(Int64)page_size;
258*f6dc9357SAndroid Build Coastguard Worker     }
259*f6dc9357SAndroid Build Coastguard Worker     #endif
260*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__gnu_hurd__)
261*f6dc9357SAndroid Build Coastguard Worker   // fixme
262*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__FreeBSD_kernel__) && defined(__GLIBC__)
263*f6dc9357SAndroid Build Coastguard Worker   // GNU/kFreeBSD Debian
264*f6dc9357SAndroid Build Coastguard Worker   // fixme
265*f6dc9357SAndroid Build Coastguard Worker   #else
266*f6dc9357SAndroid Build Coastguard Worker 
267*f6dc9357SAndroid Build Coastguard Worker   struct sysinfo info;
268*f6dc9357SAndroid Build Coastguard Worker   if (::sysinfo(&info) != 0)
269*f6dc9357SAndroid Build Coastguard Worker     return false;
270*f6dc9357SAndroid Build Coastguard Worker   size64 = (UInt64)info.mem_unit * info.totalram;
271*f6dc9357SAndroid Build Coastguard Worker   /*
272*f6dc9357SAndroid Build Coastguard Worker   printf("\n mem_unit  = %lld", (UInt64)info.mem_unit);
273*f6dc9357SAndroid Build Coastguard Worker   printf("\n totalram  = %lld", (UInt64)info.totalram);
274*f6dc9357SAndroid Build Coastguard Worker   printf("\n freeram   = %lld", (UInt64)info.freeram);
275*f6dc9357SAndroid Build Coastguard Worker   */
276*f6dc9357SAndroid Build Coastguard Worker 
277*f6dc9357SAndroid Build Coastguard Worker   #endif
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker   size = (size_t)1 << (sizeof(size_t) * 8 - 1);
280*f6dc9357SAndroid Build Coastguard Worker   if (size > size64)
281*f6dc9357SAndroid Build Coastguard Worker       size = (size_t)size64;
282*f6dc9357SAndroid Build Coastguard Worker   return true;
283*f6dc9357SAndroid Build Coastguard Worker }
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker #endif
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker 
Get_File_OPEN_MAX()288*f6dc9357SAndroid Build Coastguard Worker unsigned long Get_File_OPEN_MAX()
289*f6dc9357SAndroid Build Coastguard Worker {
290*f6dc9357SAndroid Build Coastguard Worker  #ifdef _WIN32
291*f6dc9357SAndroid Build Coastguard Worker   return (1 << 24) - (1 << 16); // ~16M handles
292*f6dc9357SAndroid Build Coastguard Worker  #else
293*f6dc9357SAndroid Build Coastguard Worker   // some linux versions have default open file limit for user process of 1024 files.
294*f6dc9357SAndroid Build Coastguard Worker   long n = sysconf(_SC_OPEN_MAX);
295*f6dc9357SAndroid Build Coastguard Worker   // n = -1; // for debug
296*f6dc9357SAndroid Build Coastguard Worker   // n = 9; // for debug
297*f6dc9357SAndroid Build Coastguard Worker   if (n < 1)
298*f6dc9357SAndroid Build Coastguard Worker   {
299*f6dc9357SAndroid Build Coastguard Worker     // n = OPEN_MAX;  // ???
300*f6dc9357SAndroid Build Coastguard Worker     // n = FOPEN_MAX; // = 16 : <stdio.h>
301*f6dc9357SAndroid Build Coastguard Worker    #ifdef _POSIX_OPEN_MAX
302*f6dc9357SAndroid Build Coastguard Worker     n = _POSIX_OPEN_MAX; // = 20 : <limits.h>
303*f6dc9357SAndroid Build Coastguard Worker    #else
304*f6dc9357SAndroid Build Coastguard Worker     n = 30; // our limit
305*f6dc9357SAndroid Build Coastguard Worker    #endif
306*f6dc9357SAndroid Build Coastguard Worker   }
307*f6dc9357SAndroid Build Coastguard Worker   return (unsigned long)n;
308*f6dc9357SAndroid Build Coastguard Worker  #endif
309*f6dc9357SAndroid Build Coastguard Worker }
310*f6dc9357SAndroid Build Coastguard Worker 
Get_File_OPEN_MAX_Reduced_for_3_tasks()311*f6dc9357SAndroid Build Coastguard Worker unsigned Get_File_OPEN_MAX_Reduced_for_3_tasks()
312*f6dc9357SAndroid Build Coastguard Worker {
313*f6dc9357SAndroid Build Coastguard Worker   unsigned long numFiles_OPEN_MAX = NSystem::Get_File_OPEN_MAX();
314*f6dc9357SAndroid Build Coastguard Worker   const unsigned delta = 10; // the reserve for another internal needs of process
315*f6dc9357SAndroid Build Coastguard Worker   if (numFiles_OPEN_MAX > delta)
316*f6dc9357SAndroid Build Coastguard Worker     numFiles_OPEN_MAX -= delta;
317*f6dc9357SAndroid Build Coastguard Worker   else
318*f6dc9357SAndroid Build Coastguard Worker     numFiles_OPEN_MAX = 1;
319*f6dc9357SAndroid Build Coastguard Worker   numFiles_OPEN_MAX /= 3; // we suppose that we have up to 3 tasks in total for multiple file processing
320*f6dc9357SAndroid Build Coastguard Worker   numFiles_OPEN_MAX = MyMax(numFiles_OPEN_MAX, (unsigned long)3);
321*f6dc9357SAndroid Build Coastguard Worker   unsigned n = (unsigned)(int)-1;
322*f6dc9357SAndroid Build Coastguard Worker   if (n > numFiles_OPEN_MAX)
323*f6dc9357SAndroid Build Coastguard Worker     n = (unsigned)numFiles_OPEN_MAX;
324*f6dc9357SAndroid Build Coastguard Worker   return n;
325*f6dc9357SAndroid Build Coastguard Worker }
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker }}
328