chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0 Architectures: x86-ansi, x86-unicode, amd64-unicode License: LGPL-2.1-or-later
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
// 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 {
|
||||
|
||||
UInt32 GetNumberOfProcessors();
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
// it returns normilized number of threads
|
||||
void Get_and_return_NumProcessThreads_and_SysThreads(UInt32 &numProcessThreads, UInt32 &numSysThreads)
|
||||
{
|
||||
UInt32 num1 = 0, num2 = 0;
|
||||
if (Get())
|
||||
{
|
||||
num1 = GetNumProcessThreads();
|
||||
num2 = GetNumSystemThreads();
|
||||
}
|
||||
if (num1 == 0)
|
||||
num1 = NSystem::GetNumberOfProcessors();
|
||||
if (num1 == 0)
|
||||
num1 = 1;
|
||||
if (num2 < num1)
|
||||
num2 = num1;
|
||||
numProcessThreads = num1;
|
||||
numSysThreads = num2;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user