blob: 23cb0dabcb05bbdffd2cbddb0bc90d4ddedb88ca (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// Windows/System.h
#ifndef __WINDOWS_SYSTEM_H
#define __WINDOWS_SYSTEM_H
#ifndef _WIN32
// #include <sched.h>
#include "../../C/Threads.h"
#endif
#include "../Common/MyTypes.h"
namespace NWindows {
namespace NSystem {
#ifdef _WIN32
UInt32 CountAffinity(DWORD_PTR mask);
struct CProcessAffinity
{
// UInt32 numProcessThreads;
// UInt32 numSysThreads;
DWORD_PTR processAffinityMask;
DWORD_PTR systemAffinityMask;
void InitST()
{
// numProcessThreads = 1;
// numSysThreads = 1;
processAffinityMask = 1;
systemAffinityMask = 1;
}
void CpuZero()
{
processAffinityMask = 0;
}
void CpuSet(unsigned cpuIndex)
{
processAffinityMask |= ((DWORD_PTR)1 << cpuIndex);
}
UInt32 GetNumProcessThreads() const { return CountAffinity(processAffinityMask); }
UInt32 GetNumSystemThreads() const { 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 _7ZIP_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
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
};
#endif
UInt32 GetNumberOfProcessors();
bool GetRamSize(UInt64 &size); // returns false, if unknown ram size
}}
#endif
|