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