Fixed: Only call setCPUMask once
This commit is contained in:
parent
fc4ef1909b
commit
936148de9d
2 changed files with 49 additions and 53 deletions
|
@ -254,43 +254,6 @@ extern NL3D::UDriver *Driver;
|
|||
extern CRyzomTime RT;
|
||||
extern string Cookie;
|
||||
extern string FSAddr;
|
||||
|
||||
extern uint64 Debug_OldCPUMask;
|
||||
extern uint64 Debug_NewCPUMask;
|
||||
|
||||
// For multi cpu, active only one CPU for the main thread
|
||||
void setCPUMask(uint64 userCPUMask)
|
||||
{
|
||||
uint64 cpuMask = IProcess::getCurrentProcess()->getCPUMask();
|
||||
Debug_OldCPUMask = cpuMask;
|
||||
|
||||
// if user CPU mask is valid
|
||||
if (cpuMask & userCPUMask)
|
||||
{
|
||||
// use it
|
||||
IProcess::getCurrentProcess ()->setCPUMask(cpuMask & userCPUMask);
|
||||
}
|
||||
else
|
||||
{
|
||||
// else get first available CPU
|
||||
|
||||
// get the processor to allow process
|
||||
uint i = 0;
|
||||
while ((i < 64) && ((cpuMask & (UINT64_CONSTANT(1) << i)) == 0))
|
||||
i++;
|
||||
|
||||
// Set the CPU mask
|
||||
if (i < 64)
|
||||
{
|
||||
IProcess::getCurrentProcess ()->setCPUMask(UINT64_CONSTANT(1) << i);
|
||||
}
|
||||
}
|
||||
|
||||
// check
|
||||
cpuMask = IProcess::getCurrentProcess ()->getCPUMask();
|
||||
Debug_NewCPUMask = cpuMask;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/////////////
|
||||
|
@ -1713,22 +1676,6 @@ void CClientConfig::setValues()
|
|||
SetPriorityClass (GetCurrentProcess(), priority[index]);
|
||||
#endif // NL_OS_WINDOWS
|
||||
|
||||
sint cpuMask;
|
||||
|
||||
if (ClientCfg.CPUMask < 1)
|
||||
{
|
||||
CTime::CTimerInfo timerInfo;
|
||||
NLMISC::CTime::probeTimerInfo(timerInfo);
|
||||
|
||||
cpuMask = timerInfo.RequiresSingleCore ? 1:0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cpuMask = ClientCfg.CPUMask;
|
||||
}
|
||||
|
||||
if (cpuMask) setCPUMask(cpuMask);
|
||||
|
||||
// Init Verbose Modes (at the beginning to be able to display them as soon as possible).
|
||||
::VerboseVP = ClientCfg.VerboseVP;
|
||||
::VerboseAnimUser = ClientCfg.VerboseAnimUser;
|
||||
|
|
|
@ -378,6 +378,39 @@ void outOfMemory()
|
|||
uint64 Debug_OldCPUMask = 0;
|
||||
uint64 Debug_NewCPUMask = 0;
|
||||
|
||||
// For multi cpu, active only one CPU for the main thread
|
||||
void setCPUMask(uint64 userCPUMask)
|
||||
{
|
||||
uint64 cpuMask = IProcess::getCurrentProcess()->getCPUMask();
|
||||
Debug_OldCPUMask = cpuMask;
|
||||
|
||||
// if user CPU mask is valid
|
||||
if (cpuMask & userCPUMask)
|
||||
{
|
||||
// use it
|
||||
IProcess::getCurrentProcess ()->setCPUMask(cpuMask & userCPUMask);
|
||||
}
|
||||
else
|
||||
{
|
||||
// else get first available CPU
|
||||
|
||||
// get the processor to allow process
|
||||
uint i = 0;
|
||||
while ((i < 64) && ((cpuMask & (UINT64_CONSTANT(1) << i)) == 0))
|
||||
i++;
|
||||
|
||||
// Set the CPU mask
|
||||
if (i < 64)
|
||||
{
|
||||
IProcess::getCurrentProcess ()->setCPUMask(UINT64_CONSTANT(1) << i);
|
||||
}
|
||||
}
|
||||
|
||||
// check
|
||||
cpuMask = IProcess::getCurrentProcess ()->getCPUMask();
|
||||
Debug_NewCPUMask = cpuMask;
|
||||
}
|
||||
|
||||
void displayCPUInfo()
|
||||
{
|
||||
nlinfo("CPUInfo: CPUMask before change: %x, after change: %x, CPUID: %x, hasHyperThreading: %s", (uint32)Debug_OldCPUMask, (uint32)Debug_NewCPUMask, CSystemInfo::getCPUID(), (CSystemInfo::hasHyperThreading()?"YES":"NO"));
|
||||
|
@ -836,6 +869,22 @@ void prelogInit()
|
|||
ClientCfg.init(ConfigFileName);
|
||||
CLoginProgressPostThread::getInstance().init(ClientCfg.ConfigFile);
|
||||
|
||||
sint cpuMask;
|
||||
|
||||
if (ClientCfg.CPUMask < 1)
|
||||
{
|
||||
CTime::CTimerInfo timerInfo;
|
||||
NLMISC::CTime::probeTimerInfo(timerInfo);
|
||||
|
||||
cpuMask = timerInfo.RequiresSingleCore ? 1:0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cpuMask = ClientCfg.CPUMask;
|
||||
}
|
||||
|
||||
if (cpuMask) setCPUMask(cpuMask);
|
||||
|
||||
setCrashCallback(crashCallback);
|
||||
|
||||
// Display Some Info On CPU
|
||||
|
|
Loading…
Reference in a new issue