// Windows/System.h #ifndef ZIP7_INC_WINDOWS_SYSTEM_H #define ZIP7_INC_WINDOWS_SYSTEM_H #ifndef _WIN32 // #include #include "../../C/Threads.h" #endif #include "../Common/MyTypes.h" #include "../Common/MyVector.h" #include "../Common/MyWindows.h" namespace NWindows { namespace NSystem { #ifdef _WIN32 struct CCpuGroups { CRecordVector GroupSizes; UInt32 NumThreadsTotal; // sum of threads in all groups // bool Is_Win11_Groups; // useless void Get_GroupSize_Min_Max(UInt32 &minSize, UInt32 &maxSize) const { unsigned num = GroupSizes.Size(); UInt32 minSize2 = 0, maxSize2 = 0; if (num) { minSize2 = (UInt32)0 - 1; do { const UInt32 v = GroupSizes[--num]; if (minSize2 > v) minSize2 = v; if (maxSize2 < v) maxSize2 = v; } while (num); } minSize = minSize2; maxSize = maxSize2; } bool Load(); CCpuGroups(): NumThreadsTotal(0) {} }; UInt32 CountAffinity(DWORD_PTR mask); struct CProcessAffinity { // UInt32 numProcessThreads; // UInt32 numSysThreads; DWORD_PTR processAffinityMask; DWORD_PTR systemAffinityMask; CCpuGroups Groups; bool IsGroupMode; /* IsGroupMode == true, if Groups.GroupSizes.Size() > 1) && { dafalt affinity was not changed } IsGroupMode == false, if single group or affinity was changed */ UInt32 Load_and_GetNumberOfThreads(); void InitST() { // numProcessThreads = 1; // numSysThreads = 1; processAffinityMask = 1; systemAffinityMask = 1; IsGroupMode = false; // Groups.NumThreadsTotal = 0; // Groups.Is_Win11_Groups = false; } /* void CpuZero() { processAffinityMask = 0; } void CpuSet(unsigned cpuIndex) { processAffinityMask |= ((DWORD_PTR)1 << cpuIndex); } */ UInt32 GetNumProcessThreads() const { if (IsGroupMode) return Groups.NumThreadsTotal; // IsGroupMode == false // so we don't want to use groups // we return number of threads in default primary group: return CountAffinity(processAffinityMask); } UInt32 GetNumSystemThreads() const { if (Groups.GroupSizes.Size() > 1 && Groups.NumThreadsTotal) return Groups.NumThreadsTotal; return CountAffinity(systemAffinityMask); } BOOL Get(); BOOL SetProcAffinity() const { return SetProcessAffinityMask(GetCurrentProcess(), processAffinityMask); } }; #else // WIN32 struct CProcessAffinity { UInt32 numSysThreads; UInt32 GetNumSystemThreads() const { return (UInt32)numSysThreads; } BOOL Get(); #ifdef Z7_AFFINITY_SUPPORTED CCpuSet cpu_set; void InitST() { numSysThreads = 1; CpuSet_Zero(&cpu_set); CpuSet_Set(&cpu_set, 0); } UInt32 GetNumProcessThreads() const { return (UInt32)CPU_COUNT(&cpu_set); } void CpuZero() { CpuSet_Zero(&cpu_set); } void CpuSet(unsigned cpuIndex) { CpuSet_Set(&cpu_set, cpuIndex); } int IsCpuSet(unsigned cpuIndex) const { return CpuSet_IsSet(&cpu_set, cpuIndex); } // void CpuClr(int cpuIndex) { CPU_CLR(cpuIndex, &cpu_set); } BOOL SetProcAffinity() const { return sched_setaffinity(0, sizeof(cpu_set), &cpu_set) == 0; } #else // Z7_AFFINITY_SUPPORTED void InitST() { numSysThreads = 1; } UInt32 GetNumProcessThreads() const { return numSysThreads; /* UInt32 num = 0; for (unsigned i = 0; i < sizeof(cpu_set) * 8; i++) num += (UInt32)((cpu_set >> i) & 1); return num; */ } void CpuZero() { } void CpuSet(unsigned /* cpuIndex */) { /* UNUSED_VAR(cpuIndex) */ } int IsCpuSet(unsigned cpuIndex) const { return (cpuIndex < numSysThreads) ? 1 : 0; } BOOL SetProcAffinity() const { errno = ENOSYS; return FALSE; } #endif // Z7_AFFINITY_SUPPORTED }; #endif // _WIN32 UInt32 GetNumberOfProcessors(); bool GetRamSize(size_t &size); // returns false, if unknown ram size unsigned long Get_File_OPEN_MAX(); unsigned Get_File_OPEN_MAX_Reduced_for_3_tasks(); }} #endif