7zip/CPP/Windows/System.h
Igor Pavlov 395149956d 25.00
2025-07-05 19:27:33 +05:00

190 lines
3.9 KiB
C++

// Windows/System.h
#ifndef ZIP7_INC_WINDOWS_SYSTEM_H
#define ZIP7_INC_WINDOWS_SYSTEM_H
#ifndef _WIN32
// #include <sched.h>
#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<UInt32> 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