Fixed: Only call setCPUMask once

This commit is contained in:
kervala 2016-01-27 14:44:13 +01:00
parent fc4ef1909b
commit 936148de9d
2 changed files with 49 additions and 53 deletions

View file

@ -254,43 +254,6 @@ extern NL3D::UDriver *Driver;
extern CRyzomTime RT; extern CRyzomTime RT;
extern string Cookie; extern string Cookie;
extern string FSAddr; 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 #endif
///////////// /////////////
@ -1713,22 +1676,6 @@ void CClientConfig::setValues()
SetPriorityClass (GetCurrentProcess(), priority[index]); SetPriorityClass (GetCurrentProcess(), priority[index]);
#endif // NL_OS_WINDOWS #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). // Init Verbose Modes (at the beginning to be able to display them as soon as possible).
::VerboseVP = ClientCfg.VerboseVP; ::VerboseVP = ClientCfg.VerboseVP;
::VerboseAnimUser = ClientCfg.VerboseAnimUser; ::VerboseAnimUser = ClientCfg.VerboseAnimUser;

View file

@ -378,6 +378,39 @@ void outOfMemory()
uint64 Debug_OldCPUMask = 0; uint64 Debug_OldCPUMask = 0;
uint64 Debug_NewCPUMask = 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() 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")); 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); ClientCfg.init(ConfigFileName);
CLoginProgressPostThread::getInstance().init(ClientCfg.ConfigFile); 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); setCrashCallback(crashCallback);
// Display Some Info On CPU // Display Some Info On CPU