1
0
forked from mirrors/0ad
Files
0ad/source/lib/sysdep/unix/ucpu.cpp
T
Ykkrosh f5a2a141dc Fixed non-PCH compiles.
Removed a few global variables from Atlas.
Added call to srand(time).
Restored NotebookEvent in wxJS.
Fixed CPU-detection in Valgrind.

This was SVN commit r5318.
2007-09-02 23:38:58 +00:00

76 lines
1.3 KiB
C++

#include "precompiled.h"
#include "ucpu.h"
#if OS_MACOSX
#include <sys/sysctl.h>
#endif
#if OS_LINUX
#include "valgrind.h"
#endif
int ucpu_IsThrottlingPossible()
{
return -1; // don't know
}
int ucpu_NumPackages()
{
#if OS_MACOSX
int mib[]={CTL_HW, HW_NCPU};
int ncpus;
size_t len = sizeof(ncpus);
if (sysctl(mib, 2, &ncpus, &len, NULL, 0) == -1)
return -1; // don't know
else
return ncpus;
#else
long res = sysconf(_SC_NPROCESSORS_CONF);
if (res == -1)
return 1;
else
return (int)res;
#endif
}
double ucpu_ClockFrequency()
{
return -1; // don't know
}
#if OS_LINUX
LibError ucpu_CallByEachCPU(CpuCallback cb, void* param)
{
long ncpus = sysconf(_SC_NPROCESSORS_CONF);
// Valgrind reports the number of real CPUs, but only emulates a single CPU.
// That causes problems when we expect all those CPUs to be distinct, so
// just pretend there's only one CPU
if (RUNNING_ON_VALGRIND)
ncpus = 1;
cpu_set_t set;
for (long i = 0; i < ncpus && i < CPU_SETSIZE; ++i)
{
CPU_ZERO(&set);
CPU_SET(i, &set);
int ret = sched_setaffinity(0, sizeof(set), &set);
if (ret)
WARN_RETURN(ERR::FAIL);
// (The process gets migrated immediately by the setaffinity call)
cb(param);
}
return INFO::OK;
}
#else
LibError ucpu_CallByEachCPU(CpuCallback cb, void* param)
{
// TODO: implement
return ERR::NOT_IMPLEMENTED;
}
#endif